diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+# 0.3.5.0
+
+* Add `Bluefin.Internal.oneWayCoercibleTrustMe`
+
+* Add `OneWayCoercible` instances for Generic types
+
 # 0.3.4.0
 
 * Add `Bluefin.Internal.Exception` and tests, thanks to Shea Levy
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.3.4.0
+version:            0.3.5.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
@@ -12,9 +12,10 @@
 
 module Bluefin.Internal where
 
-import qualified Bluefin.Internal.Exception.Scoped as ScopedException
+import Bluefin.Internal.Exception.Scoped qualified as ScopedException
 import Bluefin.Internal.OneWayCoercible
   ( OneWayCoercible (oneWayCoercibleImpl),
+    OneWayCoercibleD,
     OneWayCoercion,
     gOneWayCoercible,
     oneWayCoerce,
@@ -22,15 +23,15 @@
     oneWayCoercible,
     unsafeOneWayCoercible,
   )
-import qualified Control.Concurrent.Async as Async
+import Control.Concurrent.Async qualified as Async
 import Control.Concurrent.MVar (newEmptyMVar, putMVar, takeMVar)
-import qualified Control.Exception
+import Control.Exception qualified
 import Control.Monad (forever)
 import Control.Monad.Base (MonadBase (liftBase))
 import Control.Monad.IO.Class (MonadIO, liftIO)
 import Control.Monad.IO.Unlift (MonadUnliftIO, withRunInIO)
 import Control.Monad.Trans.Control (MonadBaseControl, StM, liftBaseWith, restoreM)
-import qualified Control.Monad.Trans.Reader as Reader
+import Control.Monad.Trans.Reader qualified as Reader
 import Data.Coerce (coerce)
 import Data.Foldable (for_)
 import Data.IORef (IORef, newIORef, readIORef, writeIORef)
@@ -400,6 +401,7 @@
 -- @
 class Handle (h :: Effects -> Type) where
   {-# MINIMAL handleImpl | mapHandle #-}
+
   -- | Define @handleImpl@ using 'handleMapHandle'.
   handleImpl :: HandleD h
   handleImpl = MkHandleD mapHandle
@@ -414,7 +416,7 @@
   --
   -- @
   -- instance Handle MyHandle where
-  --   mapHandle h = \<definition\>
+  --   mapHandle h = \<mapHandle definition\>
   -- @
   --
   -- you should change it to
@@ -422,10 +424,10 @@
   -- @
   -- data MyHandle e = ...
   --   deriving (Generic)
-  --   deriving (Handle) via OneWayCoercibleHandle MyHandle
+  --   deriving (Handle) via 'OneWayCoercibleHandle' MyHandle
   --
-  -- instance (e :> es) => OneWayCoercible (MyHandle e) (MyHandle es) where
-  --   oneWayCoercibleImpl = gOneWayCoercible
+  -- instance (e :> es) => 'OneWayCoercible' (MyHandle e) (MyHandle es) where
+  --   'oneWayCoercibleImpl' = 'gOneWayCoercible'
   -- @
   --
   -- If that doesn't work for any reason you can always reuse your old
@@ -437,13 +439,14 @@
   --
   -- @
   -- instance Handle MyHandle where
-  --   handleImpl = handleMapHandle $ \\h -> \<definition\>
+  --   handleImpl = handleMapHandle $ \\h -> \<mapHandle definition\>
   -- @
   mapHandle :: (e :> es) => h e -> h es
   mapHandle = case handleImpl of MkHandleD f -> f
 
 -- | The type of the 'handleImpl' method of the 'Handle' class.
 -- Create a @HandleD@ using 'handleMapHandle'.
+type HandleD :: (Effects -> Type) -> Type
 newtype HandleD h = MkHandleD (forall e es. (e :> es) => h e -> h es)
 
 -- | For defining the 'handleImpl' method of the 'Handle' class.
@@ -454,6 +457,7 @@
 handleMapHandle = MkHandleD
 
 handleOneWayCoercible ::
+  forall h.
   (forall e es. (e :> es) => OneWayCoercible (h e) (h es)) =>
   -- | ͘
   HandleD h
@@ -473,6 +477,15 @@
 
 instance (Handle h1, Handle h2) => Handle (h1 :*: h2) where
   handleImpl = handleMapHandle $ \(h1 :*: h2) -> mapHandle h1 :*: mapHandle h2
+
+oneWayCoercibleTrustMe ::
+  (e :> es) =>
+  (forall e' es'. (e' :> es') => h e' -> h es') ->
+  -- | ͘
+  OneWayCoercibleD (h e) (h es)
+-- Forcing the argument doesn't do much of a check, but it is
+-- something
+oneWayCoercibleTrustMe !_ = unsafeOneWayCoercible
 
 -- { OneWayCoercibleHandle
 
diff --git a/src/Bluefin/Internal/CloneableHandle.hs b/src/Bluefin/Internal/CloneableHandle.hs
--- a/src/Bluefin/Internal/CloneableHandle.hs
+++ b/src/Bluefin/Internal/CloneableHandle.hs
@@ -142,7 +142,7 @@
   handleImpl = handleOneWayCoercible
 
 instance
-  (Handle h1, Handle h2) =>
+  (Handle h1, Handle h2, e :> es) =>
   OneWayCoercible
     ((h1 :~> h2) e)
     ((h1 :~> h2) es)
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
@@ -17,9 +17,9 @@
     takeWhile',
     (>->),
   )
-import qualified Bluefin.Internal.Pipes as P
+import Bluefin.Internal.Pipes qualified as P
 import Control.Exception (IOException)
-import qualified Control.Exception
+import Control.Exception qualified
 import Control.Monad (forever, replicateM_, unless, when)
 import Control.Monad.IO.Class (liftIO)
 import Data.Foldable (for_)
@@ -36,7 +36,7 @@
     return,
     writeFile,
   )
-import qualified Prelude
+import Prelude qualified
 
 monadIOExample :: IO ()
 monadIOExample = runEff_ $ \io -> withMonadIO io $ liftIO $ do
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
@@ -10,9 +10,9 @@
 
 import Bluefin.Internal.Key (Key, eqKey, newKey)
 import Control.Exception (throwIO, tryJust)
-import qualified Control.Exception
-import Data.Type.Equality ((:~~:) (HRefl))
+import Control.Exception qualified
 import Data.Kind (Type)
+import Data.Type.Equality ((:~~:) (HRefl))
 
 try :: (Exception e -> IO a) -> IO (Either e a)
 try k = do
diff --git a/src/Bluefin/Internal/Key.hs b/src/Bluefin/Internal/Key.hs
--- a/src/Bluefin/Internal/Key.hs
+++ b/src/Bluefin/Internal/Key.hs
@@ -5,7 +5,6 @@
 -- and Tag from prim-uniq:
 --
 -- https://hackage.haskell.org/package/prim-uniq-0.2/docs/Data-Unique-Tag.html
-
 {-# LANGUAGE RoleAnnotations #-}
 
 module Bluefin.Internal.Key
diff --git a/src/Bluefin/Internal/OneWayCoercible.hs b/src/Bluefin/Internal/OneWayCoercible.hs
--- a/src/Bluefin/Internal/OneWayCoercible.hs
+++ b/src/Bluefin/Internal/OneWayCoercible.hs
@@ -120,3 +120,20 @@
     MkOneWayCoercion Coercion -> case oneWayCoercion @b @b' of
       MkOneWayCoercion Coercion ->
         MkOneWayCoercibleD (MkOneWayCoercion Coercion)
+
+instance
+  OneWayCoercible (h e) (h es) =>
+  OneWayCoercible (Rec1 h e) (Rec1 h es)
+  where
+  oneWayCoercibleImpl = gOneWayCoercible
+
+instance
+  OneWayCoercible (h e) (h es) =>
+  OneWayCoercible (M1 i t h e) (M1 i t h es)
+  where
+  oneWayCoercibleImpl = gOneWayCoercible
+
+instance
+  (OneWayCoercible (h1 e) (h1 es), OneWayCoercible (h2 e) (h2 es)) =>
+  OneWayCoercible ((h1 :*: h2) e) ((h1 :*: h2) es)
+  where oneWayCoercibleImpl = gOneWayCoercible
diff --git a/src/Bluefin/Internal/Pipes.hs b/src/Bluefin/Internal/Pipes.hs
--- a/src/Bluefin/Internal/Pipes.hs
+++ b/src/Bluefin/Internal/Pipes.hs
@@ -1,12 +1,12 @@
 module Bluefin.Internal.Pipes where
 
-import Bluefin.Internal hiding (yield, await)
-import qualified Bluefin.Internal
+import Bluefin.Internal hiding (await, yield)
+import Bluefin.Internal qualified
 import Control.Monad (forever)
 import Data.Foldable (for_)
 import Data.Void (Void, absurd)
 import Prelude hiding (break, print, takeWhile)
-import qualified Prelude
+import Prelude qualified
 
 data Proxy a' a b' b e = MkProxy (Coroutine a' a e) (Coroutine b b' e)
 
diff --git a/src/Bluefin/Internal/System/IO.hs b/src/Bluefin/Internal/System/IO.hs
--- a/src/Bluefin/Internal/System/IO.hs
+++ b/src/Bluefin/Internal/System/IO.hs
@@ -9,20 +9,22 @@
     IOE,
     bracket,
     effIO,
+    handleMapHandle,
     mapHandle,
     useImplIn,
     (:&),
     (:>),
   )
-import qualified Bluefin.Internal
-import qualified System.IO
+import Bluefin.Internal qualified
+import System.IO qualified
 
 -- We can probably get away without the IOE and just use
 -- unsafeProvideIO on all Handle functions
 data Handle e = UnsafeMkHandle System.IO.Handle (IOE e)
 
 instance Bluefin.Internal.Handle Handle where
-  mapHandle (UnsafeMkHandle h io) = UnsafeMkHandle h (mapHandle io)
+  handleImpl = handleMapHandle $ \(UnsafeMkHandle h io) ->
+    UnsafeMkHandle h (mapHandle io)
 
 withFile ::
   (e1 :> es) =>
