diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+## 0.2.0.0
+
+* Choose different incoherent instance for `:>` for better type
+  inference.  This is very unlikely to break existing code, but if it
+  does happen then please [open an
+  issue](https://github.com/tomjaguarpaw/bluefin/issues/new).
+
 ## 0.1.2.0
 
 * Fix strictness of `Bluefin.State.put`. It was accidentally made lazy
diff --git a/bluefin-internal.cabal b/bluefin-internal.cabal
--- a/bluefin-internal.cabal
+++ b/bluefin-internal.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               bluefin-internal
-version:            0.1.2.0
+version:            0.2.0.0
 license:            MIT
 license-file:       LICENSE
 author:             Tom Ellis
diff --git a/src/Bluefin/Internal.hs b/src/Bluefin/Internal.hs
--- a/src/Bluefin/Internal.hs
+++ b/src/Bluefin/Internal.hs
@@ -23,6 +23,7 @@
 import Data.Foldable (for_)
 import Data.IORef (IORef, newIORef, readIORef, writeIORef)
 import Data.Kind (Type)
+import Data.Proxy (Proxy (Proxy))
 import Data.Type.Coercion (Coercion (Coercion))
 import GHC.Exts (Proxy#, proxy#)
 import System.IO.Unsafe (unsafePerformIO)
@@ -449,11 +450,11 @@
 class (es1 :: Effects) :> (es2 :: Effects)
 
 -- | A set of effects @e@ is a subset of itself
-instance {-# INCOHERENT #-} e :> e
+instance e :> e
 
 -- | If @e@ is subset of @es@ then @e@ is a subset of a larger set, @x
 -- :& es@
-instance (e :> es) => e :> (x :& es)
+instance {-# INCOHERENT #-} (e :> es) => e :> (x :& es)
 
 -- Do we want this?
 -- instance {-# incoherent #-} (e :> es) => (e' :& e) :> (e' :> es)
@@ -461,8 +462,21 @@
 -- This seems a bit wobbly
 
 -- | @e@ is a subset of a larger set @e :& es@
-instance {-# INCOHERENT #-} e :> (e :& es)
+instance e :> (e :& es)
 
+subset ::
+  forall e1 es m.
+  (Monad m) =>
+  (e1 :> es) =>
+  m ()
+subset = pure ()
+
+effTag :: Eff es (Proxy es)
+effTag = pure Proxy
+
+handleTag :: h e -> Eff es (Proxy e)
+handleTag _ = pure Proxy
+
 -- |
 -- @
 -- >>> runPureEff $ try $ \\e -> do
@@ -792,7 +806,7 @@
 --
 -- @
 -- >>> runPureEff $ yieldToList $ \\y -> do
---       for_ [0 .. 4] $ \\i -> do
+--       forEach (inFoldable [0 .. 3]) $ \\i -> do
 --         yield y i
 --         yield y (i * 10)
 -- ([0, 0, 1, 10, 2, 20, 3, 30], ())
diff --git a/src/Bluefin/Internal/Examples.hs b/src/Bluefin/Internal/Examples.hs
--- a/src/Bluefin/Internal/Examples.hs
+++ b/src/Bluefin/Internal/Examples.hs
@@ -19,6 +19,7 @@
 import Control.Monad.IO.Class (liftIO)
 import Data.Foldable (for_)
 import Data.Monoid (Any (Any, getAny))
+import Data.Proxy (Proxy (Proxy))
 import Text.Read (readMaybe)
 import Prelude hiding
   ( break,
@@ -90,7 +91,7 @@
 
 forEachExample :: ([Int], ())
 forEachExample = runPureEff $ yieldToList $ \y -> do
-  for_ [0 .. 4] $ \i -> do
+  forEach (inFoldable [0 .. 4]) $ \i -> do
     yield y i
     yield y (i * 10)
 
@@ -1082,3 +1083,22 @@
         { askLRImpl = ask h,
           localLRImpl = \f k' -> makeOp (local h f (useImpl k'))
         }
+
+-- Fails to compile unless '(e :> es) => e :> (x :& es)' is incoherent
+-- (otherwise I guess it "commits to it too soon")
+example :: ()
+example = runPureEff $
+  evalState () $ \st1 ->
+    evalState () $ \st2 -> do
+      Proxy :: Proxy es <- effTag
+      subset @es @es
+
+      Proxy :: Proxy e1 <- handleTag st1
+      Proxy :: Proxy e2 <- handleTag st2
+
+      subset @e1 @e1
+      subset @e2 @e2
+      subset @e1 @(e1 :& e2)
+      subset @e2 @(e1 :& e2)
+
+      subset @(e1 :& e2) @(e1 :& e2)
diff --git a/src/Bluefin/Internal/Exception/Scoped.hs b/src/Bluefin/Internal/Exception/Scoped.hs
--- a/src/Bluefin/Internal/Exception/Scoped.hs
+++ b/src/Bluefin/Internal/Exception/Scoped.hs
@@ -21,8 +21,12 @@
 throw :: Exception e -> e -> IO a
 throw ex e = throwIO (MkInFlight ex e)
 
+-- Corresponds to what Bluefin calls an "Exception", i.e. "a handle to
+-- an exception" or "the capability to throw an exception".
 newtype Exception (e :: Type) = MkException (Key e)
 
+-- InFlight is like Locker from vault.  MkInflight is like lock from
+-- vault.
 data InFlight = forall e. MkInFlight !(Exception e) !e
 
 instance Show InFlight where
@@ -30,5 +34,6 @@
 
 instance Control.Exception.Exception InFlight
 
+-- Like unlock from vault
 check :: Key a -> InFlight -> Maybe a
 check k1 (MkInFlight (MkException k2) e) = fmap (\HRefl -> e) (k1 `eqKey` k2)
