diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+# 0.5.0.0
+
+* Fix dodgy `Bluefin.Primitive.Internal.primitive` implementation
+
 # 0.4.3.0
 
 * Add `Bluefin.Internal.GadtEffect`
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.4.3.0
+version:            0.5.0.0
 license:            MIT
 license-file:       LICENSE
 author:             Tom Ellis
diff --git a/src/Bluefin/Internal/Prim.hs b/src/Bluefin/Internal/Prim.hs
--- a/src/Bluefin/Internal/Prim.hs
+++ b/src/Bluefin/Internal/Prim.hs
@@ -10,12 +10,6 @@
 import GHC.Exts (State#)
 import Unsafe.Coerce (unsafeCoerce)
 
--- I suppose morally this is
---
---   (State# (PrimStateEff e) -> (# State# (PrimStateEff e), a #))
---
--- but since there can only be one valid implementation it doesn't
--- seem worth doing it like that.
 data Prim (e :: Effects) = UnsafeMkPrim
   deriving Handle via OneWayCoercibleHandle Prim
 
@@ -24,10 +18,16 @@
 instance (e :> es) => OneWayCoercible (Prim e) (Prim es) where
   oneWayCoercibleImpl = unsafeOneWayCoercible
 
+runPrim ::
+  (forall e. Prim e -> Eff (e :& es) r) ->
+  -- | ͘
+  Eff es r
+runPrim k = makeOp (k UnsafeMkPrim)
+
 primitive ::
-  (e1 :> es, e2 :> es) =>
+  (e1 :> es) =>
   Prim e1 ->
-  (State# (PrimStateEff e2) -> (# State# (PrimStateEff e2), a #)) ->
+  (State# (PrimStateEff e1) -> (# State# (PrimStateEff e1), a #)) ->
   -- | ͘
   Eff es a
 primitive UnsafeMkPrim = unsafeCoerce (P.primitive @IO)
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -4,7 +4,6 @@
 module Main (main) where
 
 import Bluefin.Internal
-import Bluefin.Internal.DslBuilder
 import Control.Monad (when)
 import Data.Foldable (for_)
 import Test.GeneralBracket (test_generalBracket)
