There’s no implicit conversion from Nullable<bool> to bool. There is an implicit conversion from bool to Nullable<bool> and that’s what happens (in language terms) to each of the bool constants in the first version. The bool operator==(Nullable<bool>, Nullable<bool> operator is then applied. (This isn’t quite the same as other lifted operators – the result is just bool, not Nullable<bool>.)
In other words, the expression ‘fred == false’ is of type bool, whereas the expression ‘fred’ is of type Nullable<bool> hence you can’t use it as the “if” expression.
EDIT: To answer the comments, there’s never an implicit conversion from Nullable<T> to T and for good reason – implicit conversions shouldn’t throw exceptions, and unless you want null to be implicitly converted to default(T) there’s not a lot else that could be done.
Also, if there were implicit conversions both ways round, an expression like “nullable + nonNullable” would be very confusing (for types that support +, like int). Both +(T?, T?) and +(T, T) would be available, depending on which operand were converted – but the results could be very different!
I’m 100% behind the decision to only have an explicit conversion from Nullable<T> to T.