diff --git a/overload.cabal b/overload.cabal
--- a/overload.cabal
+++ b/overload.cabal
@@ -1,5 +1,5 @@
 name:                overload
-version:             0.1.0.2
+version:             0.1.0.3
 synopsis:            Finite overloading
 description:         Provides a mechanism for finite overloading
 homepage:            https://gitlab.com/LukaHorvat/overload
diff --git a/src/Overload.hs b/src/Overload.hs
--- a/src/Overload.hs
+++ b/src/Overload.hs
@@ -41,6 +41,8 @@
 import Data.Function
 import Control.Monad
 import Language.Haskell.TH.ExpandSyns
+import Data.List (tails)
+import Data.Semigroup ((<>))
 
 import Overload.Normal
 import Overload.TypeTree
@@ -74,6 +76,17 @@
             t'             -> (n, [], t'))
     seeds <- forM triplets $ \(_, _, t) ->
         normalizeTypeTree <$> typeToTypeTree (const (Var Nothing)) Just t
+    let pairs = concatMap ( \case 
+            x : xs -> concatMap (\y -> [(x, y), (y, x)]) xs
+            []     -> [] ) (tails seeds)
+    let errs  = filter (uncurry isMoreGeneralThan) pairs
+    unless (null errs) $ do
+        forM_ errs $ \(x, y) ->
+            reportError
+                $ "Type " <> showTypeTree x <> " is more general than " <> showTypeTree y <> ".\n"
+               <> "There is no way to construct a set of non-overlapping instances.\n"
+               <> "To fix this, make the first type more specific."
+        fail "Not all types are distinguishable."
     concat <$> zipWithM insts
                         (allDeciders seeds)
                         triplets
diff --git a/src/Overload/Example.hs b/src/Overload/Example.hs
--- a/src/Overload/Example.hs
+++ b/src/Overload/Example.hs
@@ -30,3 +30,10 @@
 g3 = undefined
 
 overload "g" ['g1, 'g2, 'g3]
+
+h1 :: Maybe a
+h1 = Nothing
+h2 :: Maybe Int
+h2 = Just 2
+
+-- overload "h" ['h1, 'h2]
