diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+# 0.3.3.0
+
+* Add `finally`
+
 # 0.3.2.0
 
 * Add `Bluefin.Internal.CloneHandle`
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.2.0
+version:            0.3.3.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
@@ -764,6 +764,18 @@
         (effToIO . useImpl . after)
         (effToIO . useImpl . body)
 
+finally ::
+  -- | Run the body
+  Eff es b ->
+  Eff es () ->
+  Eff es b
+finally body after =
+  unsafeProvideIO $ \io -> do
+    withEffToIO_ io $ \effToIO -> do
+      Control.Exception.finally
+        (effToIO (useImpl body))
+        (effToIO (useImpl after))
+
 withStateInIO ::
   (e1 :> es, e2 :> es) =>
   IOE e1 ->
