As a more substantial example of the rules in action, consider
instance {-# OVERLAPPABLE #-} context1 => C Int b where ... -- (A)
instance {-# OVERLAPPABLE #-} context2 => C a Bool where ... -- (B)
instance {-# OVERLAPPABLE #-} context3 => C a [b] where ... -- (C)
instance {-# OVERLAPPING #-} context4 => C Int [Int] where ... -- (D)
The constraint C Int [Int]. This constraint matches instances (A), (C) and (D), but the last is more specific, and hence is chosen.
If (D) did not exist then (A) and (C) would still be matched, but neither is most specific. In that case, the program would be rejected, unless IncoherentInstances is enabled, in which case it would be accepted and (A) or (C) would be chosen arbitrarily.
The final bullet (about unifiying instances) makes GHC conservative about committing to an overlapping instance. For example:
f :: [b] -> [b]
f x = ...
Suppose that from the RHS of f we get the constraint C b [b]. But GHC does not commit to instance (C), because in a particular call of f, b might be instantiated to Int, in which case instance (D) would be more specific still. So GHC rejects the program.
This explains why GHC rejects the following
instance {-# OVERLAPPABLE #-} Coat Sunny b where doINeedACoat _ _ = False
instance {-# OVERLAPPING #-} Coat a Cold where doINeedACoat _ _ = True
The only workaround is using INCOHERENT:
instance {-# INCOHERENT #-} Coat Sunny b where doINeedACoat _ _ = False
instance Coat a Cold where doINeedACoat _ _ = True