diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+# 0.8.1.0
+
+* Add `trans3D`, `oneWayCoercibleNewtypeHandle`
+
 # 0.8.0.0
 
 * Restrict `Reader` type tag to `Effects`
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.8.0.0
+version:            0.8.1.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
@@ -21,6 +21,7 @@
     oneWayCoerce,
     oneWayCoercible,
     oneWayCoercion,
+    trans3D,
     unsafeCoercionOfOneWayCoercion,
     unsafeOneWayCoercible,
   )
@@ -48,6 +49,7 @@
 import System.IO.Unsafe (unsafePerformIO)
 import Unsafe.Coerce (unsafeCoerce)
 import Prelude hiding (drop, head, read, return)
+import Data.Coerce (Coercible)
 
 -- | Each inhabitant of @Effects@ is a set of effect tags, used for
 -- effect tracking to ensure that effects don't escape the scope of
@@ -282,7 +284,7 @@
 unsafeCoerceEff = coerce
 
 weakenEff :: t `In` t' -> Eff t r -> Eff t' r
-weakenEff _ = unsafeCoerceEff
+weakenEff (In# (# #)) = unsafeCoerceEff
 
 insertFirst :: Eff b r -> Eff (c1 :& b) r
 insertFirst = weakenEff (drop (eq ZW))
@@ -579,6 +581,20 @@
 
 -- }
 
+oneWayCoercibleNewtypeHandle ::
+  forall h1 h2 e es.
+  (e :> es) =>
+  ( Coercible (h2 e) (h1 e),
+    OneWayCoercible (h1 e) (h1 es),
+    Coercible (h1 es) (h2 es)
+  ) =>
+  OneWayCoercibleD (h2 e) (h2 es)
+oneWayCoercibleNewtypeHandle =
+  trans3D
+    (oneWayCoercible @(h2 e) @(h1 e))
+    (oneWayCoercibleImpl @(h1 e) @(h1 es))
+    (oneWayCoercible @(h1 es) @(h2 es))
+
 -- | A convenience type whose only purpose is to avoid writing @(# #)@
 -- as an argument to functions which are only functions because
 -- top-level definitions of unlifted kind are forbidden.
@@ -1711,8 +1727,7 @@
 mapHandleReader = case coerceH of Coercion -> coerce
   where
     oneWayCoerceH :: OneWayCoercion (h e) (h es)
-    oneWayCoerceH = case handleDictOfHandleD (handleImpl @h) of
-      MkHandleDict -> oneWayCoercion
+    oneWayCoerceH = withHandle @h oneWayCoercion
 
     coerceH :: Coercion (h e) (h es)
     coerceH = unsafeCoercionOfOneWayCoercion oneWayCoerceH
@@ -1754,8 +1769,7 @@
 runHandleReader h k = do
   runReader (mapHandle h) $ \(st :: Reader (h es) e) -> do
     let oneWayCoerceH :: OneWayCoercion (h es) (h (e :& es))
-        oneWayCoerceH = case handleDictOfHandleD (handleImpl @h) of
-          MkHandleDict -> oneWayCoercion
+        oneWayCoerceH = withHandle @h oneWayCoercion
 
     let coerceH :: Coercion (h es) (h (e :& es))
         coerceH = unsafeCoercionOfOneWayCoercion oneWayCoerceH
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
@@ -96,6 +96,18 @@
   Coercion -> case unsafeCoercionOfOneWayCoercion c2 of
     Coercion -> MkOneWayCoercion Coercion
 
+trans3D ::
+  forall t1 t2 t3 t4.
+  OneWayCoercibleD t1 t2 ->
+  OneWayCoercibleD t2 t3 ->
+  OneWayCoercibleD t3 t4 ->
+  OneWayCoercibleD t1 t4
+trans3D
+  (MkOneWayCoercibleD t1t2)
+  (MkOneWayCoercibleD t2t3)
+  (MkOneWayCoercibleD t3t4) =
+    MkOneWayCoercibleD ((t1t2 `trans` t2t3) `trans` t3t4)
+
 class GOneWayCoercible a b
 
 instance GOneWayCoercible U1 U1
