Interesting! This got me thinking - is this issue because the compiler doesn't (cannot?) see the implementation of e.g. (<=)?
I noticed that a similiar case exists with
f :: Bool -> Bool
f x | x = True
| not x = False
...which yields the same warning. I suppose this is because the compiler doesn't know the definition of 'not' so it doesn't understand that either of the two guards will always be True.