diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,12 @@
+# 0.5.1.0
+
+* Add `<:` type synonym for `:>`
+
+  It is suggested you switch your uses of `:>` to `<:` because it is a
+  "subset" like constraint and the latter looks more like a subset
+  symbol.  The former may be deprecated and then removed in future
+  versions.
+
 # 0.5.0.0
 
 * Fix dodgy `Bluefin.Primitive.primitive` implementation
diff --git a/bluefin.cabal b/bluefin.cabal
--- a/bluefin.cabal
+++ b/bluefin.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               bluefin
-version:            0.5.0.0
+version:            0.5.1.0
 license:            MIT
 license-file:       LICENSE
 author:             Tom Ellis
diff --git a/src/Bluefin.hs b/src/Bluefin.hs
--- a/src/Bluefin.hs
+++ b/src/Bluefin.hs
@@ -716,7 +716,7 @@
     -- pattern which looks like
     --
     -- @
-    -- (e1 :> es, ...) -> \<Handle\> e1 -> ... -> Eff es r
+    -- (e1 \<: es, ...) -> \<Handle\> e1 -> ... -> Eff es r
     -- @
     --
     -- Here @\<Handle\>@ could be, for example, @State Int@,
@@ -743,9 +743,9 @@
     -- Finally, let's look at the constraints.  They are what tie
     -- together the effect tags of the arguments to the effect tag of
     -- the result.  For every argument effect tag @en@ we have a
-    -- constraint @en :> es@.  That tells us the that effect handle
+    -- constraint @en \<: es@.  That tells us the that effect handle
     -- with tag @en@ is allowed to be used within the effectful
-    -- computation.  If we didn't have the @e1 :> es@ constraint, for
+    -- computation.  If we didn't have the @e1 \<: es@ constraint, for
     -- example, that would tell us that the @State Int e1@ isn't
     -- actually used anywhere in the computation.
     --
@@ -754,7 +754,7 @@
     --
     -- @
     -- incrementReadLine ::
-    --   (e1 :> es, e2 :> es, e3 :> es) =>
+    --   (e1 \<: es, e2 \<: es, e3 \<: es) =>
     --   State Int e1  ->
     --   Exception String e2  ->
     --   IOE e3 ->
diff --git a/src/Bluefin/CloneableHandle.hs b/src/Bluefin/CloneableHandle.hs
--- a/src/Bluefin/CloneableHandle.hs
+++ b/src/Bluefin/CloneableHandle.hs
@@ -22,7 +22,7 @@
     --
     -- @
     -- bluefinRace ::
-    --   ('CloneableHandle' h, e1 :> es) =>
+    --   ('CloneableHandle' h, e1 \<: es) =>
     --   t'Bluefin.IO.IOE' e1 ->
     --   h es ->
     --   (forall e. IOE e -> h e -> t'Bluefin.Eff.Eff' e r) ->
diff --git a/src/Bluefin/Compound.hs b/src/Bluefin/Compound.hs
--- a/src/Bluefin/Compound.hs
+++ b/src/Bluefin/Compound.hs
@@ -13,7 +13,7 @@
     -- @
     -- newtype Counter1 e = MkCounter1 ('Bluefin.State.State' Int e)
     --
-    -- incCounter1 :: (e :> es) => Counter1 e -> 'Bluefin.Eff.Eff' es ()
+    -- incCounter1 :: (e \<: es) => Counter1 e -> 'Bluefin.Eff.Eff' es ()
     -- incCounter1 (MkCounter1 st) = 'Bluefin.State.modify' st (+ 1)
     --
     -- runCounter1 ::
@@ -55,7 +55,7 @@
     -- @
     -- data Counter2 e1 e2 = MkCounter2 ('Bluefin.State.State' Int e1) ('Bluefin.Exception.Exception' () e2)
     --
-    -- incCounter2 :: (e1 :> es, e2 :> es) => Counter2 e1 e2 -> 'Bluefin.Eff.Eff' es ()
+    -- incCounter2 :: (e1 \<: es, e2 \<: es) => Counter2 e1 e2 -> 'Bluefin.Eff.Eff' es ()
     -- incCounter2 (MkCounter2 st ex) = do
     --   count <- 'Bluefin.State.get' st
     --   when (count >= 10) $
@@ -103,7 +103,7 @@
     -- @
     -- data Counter3 e = MkCounter3 ('Bluefin.State.State' Int e) ('Bluefin.Exception.Exception' () e)
     --
-    -- incCounter3 :: (e :> es) => Counter3 e -> Eff es ()
+    -- incCounter3 :: (e \<: es) => Counter3 e -> Eff es ()
     -- incCounter3 (MkCounter3 st ex) = do
     --   count <- 'Bluefin.State.get' st
     --   when (count >= 10) $
@@ -148,12 +148,12 @@
     -- @
     -- newtype Counter3B e = MkCounter3B ('Bluefin.IO.IOE' e)
     --
-    -- incCounter3B :: (e :> es) => Counter3B e -> 'Bluefin.Eff.Eff' es ()
+    -- incCounter3B :: (e \<: es) => Counter3B e -> 'Bluefin.Eff.Eff' es ()
     -- incCounter3B (MkCounter3B io) =
     --   effIO io (putStrLn "You tried to increment the counter")
     --
     -- runCounter3B ::
-    --   (e1 :> es) =>
+    --   (e1 \<: es) =>
     --   IOE e1 ->
     --   (forall e. Counter3B e -> Eff (e :& es) r) ->
     --   Eff es r
@@ -193,7 +193,7 @@
     -- data Counter4 e
     --   = MkCounter4 ('Bluefin.State.State' Int e) ('Bluefin.Exception.Exception' () e) ('Bluefin.Stream.Stream' String e)
     --
-    -- incCounter4 :: (e :> es) => Counter4 e -> Eff es ()
+    -- incCounter4 :: (e \<: es) => Counter4 e -> Eff es ()
     -- incCounter4 (MkCounter4 st ex y) = do
     --   count <- 'Bluefin.State.get' st
     --
@@ -205,13 +205,13 @@
     --
     --   'Bluefin.State.put' st (count + 1)
     --
-    -- getCounter4 :: (e :> es) => Counter4 e -> String -> Eff es Int
+    -- getCounter4 :: (e \<: es) => Counter4 e -> String -> Eff es Int
     -- getCounter4 (MkCounter4 st _ y) msg = do
     --   yield y msg
     --   get st
     --
     -- runCounter4 ::
-    --   (e1 :> es) =>
+    --   (e1 \<: es) =>
     --   Stream String e1 ->
     --   (forall e. Counter4 e -> Eff (e :& es) r) ->
     --   Eff es Int
@@ -261,17 +261,17 @@
     --   deriving (Generic)
     --   deriving (Handle) via 'OneWayCoercibleHandle' Counter5
     --
-    -- instance (e :> es) => 'OneWayCoercible.OneWayCoercible' (Counter5 e) (Counter5 es) where
+    -- instance (e \<: es) => 'OneWayCoercible.OneWayCoercible' (Counter5 e) (Counter5 es) where
     --   oneWayCoercibleImpl = 'OneWayCoercible.gOneWayCoercible'
     --
-    -- incCounter5 :: (e :> es) => Counter5 e -> Eff es ()
+    -- incCounter5 :: (e \<: es) => Counter5 e -> Eff es ()
     -- incCounter5 e = incCounter5Impl ('mapHandle' e)
     --
-    -- getCounter5 :: (e :> es) => Counter5 e -> String -> Eff es Int
+    -- getCounter5 :: (e \<: es) => Counter5 e -> String -> Eff es Int
     -- getCounter5 e msg = getCounter5Impl (mapHandle e) msg
     --
     -- runCounter5 ::
-    --   (e1 :> es) =>
+    --   (e1 \<: es) =>
     --   Stream String e1 ->
     --   (forall e. Counter5 e -> Eff (e :& es) r) ->
     --   Eff es Int
@@ -333,19 +333,19 @@
     --   deriving (Generic)
     --   deriving (Handle) via 'OneWayCoercibleHandle' Counter6
     --
-    -- instance (e :> es) => 'OneWayCoercible.OneWayCoercible' (Counter6 e) (Counter6 es) where
+    -- instance (e \<: es) => 'OneWayCoercible.OneWayCoercible' (Counter6 e) (Counter6 es) where
     --   oneWayCoercibleImpl = 'OneWayCoercible.gOneWayCoercible'
     --
-    -- incCounter6 :: (e :> es) => Counter6 e -> Eff es ()
+    -- incCounter6 :: (e \<: es) => Counter6 e -> Eff es ()
     -- incCounter6 e = incCounter6Impl (mapHandle e)
     --
-    -- getCounter6 :: (e :> es) => Counter6 e -> String -> Eff es Int
+    -- getCounter6 :: (e \<: es) => Counter6 e -> String -> Eff es Int
     -- getCounter6 (MkCounter6 _ st y) msg = do
     --   yield y msg
     --   get st
     --
     -- runCounter6 ::
-    --   (e1 :> es) =>
+    --   (e1 \<: es) =>
     --   Stream String e1 ->
     --   (forall e. Counter6 e -> Eff (e :& es) r) ->
     --   Eff es Int
@@ -408,7 +408,7 @@
     -- -- can't derive the @OneWayCoercible@ instance with
     -- -- 'OneWayCoercible.gOneWayCoercible' so instead we use 'oneWayCoercibleTrustMe'.
     --
-    -- instance (e :> es) => 'OneWayCoercible' (Counter7 e) (Counter7 es) where
+    -- instance (e \<: es) => 'OneWayCoercible' (Counter7 e) (Counter7 es) where
     --   oneWayCoercibleImpl = oneWayCoercibleTrustMe $ \\c ->
     --     MkCounter7
     --       { incCounter7Impl = \\ex -> 'useImplUnder' (incCounter7Impl c ex),
@@ -417,16 +417,16 @@
     --       }
     --
     -- incCounter7 ::
-    --   (e :> es, e1 :> es) => Counter7 e -> Exception () e1 -> Eff es ()
+    --   (e \<: es, e1 \<: es) => Counter7 e -> Exception () e1 -> Eff es ()
     -- incCounter7 e ex = 'makeOp' (incCounter7Impl ('mapHandle' e) (mapHandle ex))
     --
-    -- getCounter7 :: (e :> es) => Counter7 e -> String -> Eff es Int
+    -- getCounter7 :: (e \<: es) => Counter7 e -> String -> Eff es Int
     -- getCounter7 (MkCounter7 _ st y) msg = do
     --   yield y msg
     --   get st
     --
     -- runCounter7 ::
-    --   (e1 :> es) =>
+    --   (e1 \<: es) =>
     --   Stream String e1 ->
     --   (forall e. Counter7 e -> Eff (e :& es) r) ->
     --   Eff es Int
@@ -504,7 +504,7 @@
     -- -- 'OneWayCoercible.gOneWayCoercible' instead we use 'oneWayCoercibleTrustMe'.
     --
     -- instance
-    --   (e :> es) =>
+    --   (e \<: es) =>
     --   OneWayCoercible (DynamicReader r e) (DynamicReader r es)
     --   where
     --   oneWayCoercibleImpl = oneWayCoercibleTrustMe $ \\h ->
@@ -514,13 +514,13 @@
     --       }
     --
     -- askLR ::
-    --   (e :> es) =>
+    --   (e \<: es) =>
     --   DynamicReader r e ->
     --   Eff es r
     -- askLR c = 'makeOp' (askLRImpl ('mapHandle' c))
     --
     -- localLR ::
-    --   (e :> es) =>
+    --   (e \<: es) =>
     --   DynamicReader r e ->
     --   (r -> r) ->
     --   Eff es a ->
@@ -557,13 +557,13 @@
     --   deriving (Generic)
     --   deriving (Handle) via 'OneWayCoercibleHandle' FileSystem
     --
-    -- instance (e :> es) => 'OneWayCoercible.OneWayCoercible' (FileSystem e) (FileSystem es) where
+    -- instance (e \<: es) => 'OneWayCoercible.OneWayCoercible' (FileSystem e) (FileSystem es) where
     --   oneWayCoercibleImpl = 'OneWayCoercible.gOneWayCoercible'
     --
-    -- readFile :: (e :> es) => FileSystem e -> FilePath -> Eff es String
+    -- readFile :: (e \<: es) => FileSystem e -> FilePath -> Eff es String
     -- readFile fs filepath = readFileImpl ('mapHandle' fs) filepath
     --
-    -- writeFile :: (e :> es) => FileSystem e -> FilePath -> String -> Eff es ()
+    -- writeFile :: (e \<: es) => FileSystem e -> FilePath -> String -> Eff es ()
     -- writeFile fs filepath contents =
     --   writeFileImpl (mapHandle fs) filepath contents
     -- @
@@ -574,7 +574,7 @@
     --
     -- @
     -- runFileSystemPure ::
-    --   (e1 :> es) =>
+    --   (e1 \<: es) =>
     --   Exception String e1 ->
     --   [(FilePath, String)] ->
     --   (forall e2. FileSystem e2 -> Eff (e2 :& es) r) ->
@@ -601,7 +601,7 @@
     -- @
     -- runFileSystemIO ::
     --   forall e1 e2 es r.
-    --   (e1 :> es, e2 :> es) =>
+    --   (e1 \<: es, e2 \<: es) =>
     --   Exception String e1 ->
     --   IOE e2 ->
     --   (forall e. FileSystem e -> Eff (e :& es) r) ->
@@ -616,7 +616,7 @@
     --           \\filepath -> adapt . Prelude.writeFile filepath
     --       }
     --   where
-    --     adapt :: (e1 :> ess, e2 :> ess) => IO a -> Eff ess a
+    --     adapt :: (e1 \<: ess, e2 \<: ess) => IO a -> Eff ess a
     --     adapt m =
     --       effIO io (Control.Exception.try @IOException m) >>= \\case
     --         Left e -> 'Bluefin.Exception.throw' ex (show e)
@@ -627,7 +627,7 @@
     -- does some file system operations.
     --
     -- @
-    -- action :: (e :> es) => FileSystem e -> Eff es String
+    -- action :: (e \<: es) => FileSystem e -> Eff es String
     -- action fs = do
     --   file <- readFile fs "\/dev\/null"
     --   when (length file == 0) $ do
diff --git a/src/Bluefin/DslBuilder.hs b/src/Bluefin/DslBuilder.hs
--- a/src/Bluefin/DslBuilder.hs
+++ b/src/Bluefin/DslBuilder.hs
@@ -185,7 +185,7 @@
     --   deriving t'Bluefin.Compound.Generic'
     --   deriving t'Bluefin.Compound.Handle' via t'Bluefin.Compound.OneWayCoercibleHandle' ArenaH
     --
-    -- instance (e :> es) => 'Bluefin.Compound.OneWayCoercible' (ArenaH e) (ArenaH es) where
+    -- instance (e \<: es) => 'Bluefin.Compound.OneWayCoercible' (ArenaH e) (ArenaH es) where
     --   'Bluefin.Compound.oneWayCoercibleImpl' = 'Bluefin.Compound.gOneWayCoercible'
     -- @
     --
@@ -248,7 +248,7 @@
     --   deriving t'Bluefin.Compound.Generic'
     --   deriving t'Bluefin.Compound.Handle' via t'Bluefin.Compound.OneWayCoercibleHandle' InstructionsH
     --
-    -- instance (e :> es) => t'Bluefin.Compound.OneWayCoercible' (InstructionsH e) (InstructionsH es) where
+    -- instance (e \<: es) => t'Bluefin.Compound.OneWayCoercible' (InstructionsH e) (InstructionsH es) where
     --   oneWayCoercibleImpl = 'Bluefin.Compound.gOneWayCoercible'
     -- @
     --
diff --git a/src/Bluefin/Eff.hs b/src/Bluefin/Eff.hs
--- a/src/Bluefin/Eff.hs
+++ b/src/Bluefin/Eff.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE ExplicitNamespaces #-}
+
 module Bluefin.Eff
   ( -- * 'Eff' monad
     Eff,
@@ -22,6 +24,7 @@
     -- * Effect tracking
     Effects,
     (:>),
+    type (<:),
     (:&),
   )
 where
diff --git a/src/Bluefin/GadtEffect.hs b/src/Bluefin/GadtEffect.hs
--- a/src/Bluefin/GadtEffect.hs
+++ b/src/Bluefin/GadtEffect.hs
@@ -32,7 +32,7 @@
     --
     -- @
     -- instance
-    --   (e :> es) =>
+    --   (e \<: es) =>
     --   t'Bluefin.Compound.OneWayCoercible' ('GadtEffect' FileSystem r e) (GadtEffect FileSystem r es)
     --   where
     --   'Bluefin.Compound.oneWayCoercibleImpl' = 'oneWayCoercibleGadtEffectTrustMe' $ \\case
@@ -51,7 +51,7 @@
     --
     -- @
     -- readFile ::
-    --   (e1 :> es) =>
+    --   (e1 \<: es) =>
     --   'Send' FileSystem e1 ->
     --   FilePath ->
     --   Eff es String
@@ -59,7 +59,7 @@
     --   'send' fc (ReadFile path)
     --
     -- writeFile ::
-    --   (e1 :> es) =>
+    --   (e1 \<: es) =>
     --   Send FileSystem e1 ->
     --   FilePath ->
     --   String ->
@@ -68,7 +68,7 @@
     --   send fc (WriteFile path content)
     --
     -- trace ::
-    --   (e1 :> es) =>
+    --   (e1 \<: es) =>
     --   Send FileSystem e1 ->
     --   String ->
     --   Eff es r ->
@@ -96,7 +96,7 @@
     --
     -- runFileSystem ::
     --   forall es e1 e2 r.
-    --   (e1 :> es, e2 :> es) =>
+    --   (e1 \<: es, e2 \<: es) =>
     --   t'Bluefin.IO.IOE' e1 ->
     --   t'Bluefin.Exception.Exception' t'Control.Exception.IOException' e2 ->
     --   (forall e. 'Send' FileSystem e -> Eff (e :& es) r) ->
@@ -114,7 +114,7 @@
     --   where
     --     -- If you don't want to write this signature you can use
     --     -- {-# LANGUAGE NoMonoLocalBinds #-}
-    --     adapt :: (e1 :> es', e2 :> es') => IO r' -> Eff es' r'
+    --     adapt :: (e1 \<: es', e2 \<: es') => IO r' -> Eff es' r'
     --     adapt m = 'Bluefin.IO.rethrowIO' io ex (effIO io m)
     -- @
 
@@ -137,7 +137,7 @@
     --
     -- @
     -- instance
-    --   (e :> es) =>
+    --   (e \<: es) =>
     --   t'Bluefin.Compound.OneWayCoercible' ('GadtEffect' E r e) (GadtEffect E r es)
     --   where
     --   'Bluefin.Compound.oneWayCoercibleImpl' = 'oneWayCoercibleGadtEffectTrustMe' $ \\case
@@ -155,7 +155,7 @@
     --
     -- @
     -- runE ::
-    --   (e1 :> es) =>
+    --   (e1 \<: es) =>
     --   IOE e1 ->
     --   (forall e. Send E e -> Eff (e :& es) r) ->
     --   Eff es r
@@ -170,7 +170,7 @@
     --
     -- @
     -- augmentOp2Interpret ::
-    --   (e1 :> es, e2 :> es) =>
+    --   (e1 \<: es, e2 \<: es) =>
     --   IOE e2 ->
     --   Send E e1 ->
     --   (forall e. Send E e -> Eff (e :& es) r) ->
@@ -184,7 +184,7 @@
     --
     -- @
     -- augmentOp2Interpose ::
-    --   (e1 :> es, e2 :> es) =>
+    --   (e1 \<: es, e2 \<: es) =>
     --   IOE e2 ->
     --   t'Bluefin.HandleReader.HandleReader' (Send E) e1 ->
     --   Eff es r ->
diff --git a/src/Bluefin/Prim.hs b/src/Bluefin/Prim.hs
--- a/src/Bluefin/Prim.hs
+++ b/src/Bluefin/Prim.hs
@@ -7,7 +7,7 @@
 --   deriving (Handle) via OneWayCoercibleHandle ExAndPrim
 --   deriving stock (Generic)
 --
--- instance (e :> es) => OneWayCoercible (ExAndPrim e) (ExAndPrim es) where
+-- instance (e \<: es) => OneWayCoercible (ExAndPrim e) (ExAndPrim es) where
 --   oneWayCoercibleImpl = gOneWayCoercible
 --
 -- -- Define a monad M containing the Prim handle
@@ -16,7 +16,7 @@
 --
 -- -- Define a way of running M
 -- runM ::
---   (e1 :> es, e2 :> es) =>
+--   (e1 \<: es, e2 \<: es) =>
 --   Exception String e1 ->
 --   P.Prim e2 ->
 --   M es es r ->
@@ -25,7 +25,7 @@
 --   runReaderT m (MkExAndPrim (mapHandle ex) (mapHandle prim))
 --
 -- -- Give M a PrimMonad instance
--- instance (e :> es) => PrimMonad (M e es) where
+-- instance (e \<: es) => PrimMonad (M e es) where
 --   type PrimState (M e es) = P.PrimStateEff e
 --   primitive f =
 --     MkM (ReaderT (\\(MkExAndPrim _ prim) -> P.'primitive' prim f))
