diff --git a/cache-polysemy.cabal b/cache-polysemy.cabal
--- a/cache-polysemy.cabal
+++ b/cache-polysemy.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: bbfeaacd25354057ddf0c42d9376394235b2c38637b3e5290009ef4d025cf777
+-- hash: bab52d012830e3889f818b644fb55b9a8d1dfa6fe05fd38449972264a4814ba7
 
 name:           cache-polysemy
-version:        0.1.1
+version:        0.1.2
 synopsis:       cached hashmaps
 description:    An polysemy interface for cached hashmaps and an interpreter implemented using <https://hackage.haskell.org/package/cache cache>
 category:       Cache
diff --git a/src/Polysemy/Cache.hs b/src/Polysemy/Cache.hs
--- a/src/Polysemy/Cache.hs
+++ b/src/Polysemy/Cache.hs
@@ -118,6 +118,50 @@
     cache <- atomicGet
     atomicPut $ C.setDefaultExpiration cache ts
 
+-- | Alternative version of 'runCacheAtomicState' that uses 'Final' instead of 'Embed'
+runCacheAtomicState' ::
+  forall k v r a.
+  Members '[Final IO, AtomicState (C.Cache k v)] r =>
+  Sem (Cache k v ': r) a ->
+  Sem r a
+runCacheAtomicState' = interpret $ \case
+  Insert k v -> do
+    cache <- atomicGet
+    embedFinal $ C.insert cache k v
+  Insert' ts k v -> do
+    cache <- atomicGet
+    embedFinal $ C.insert' cache ts k v
+  Lookup k -> do
+    cache <- atomicGet
+    embedFinal $ C.lookup cache k
+  Lookup' k -> do
+    cache <- atomicGet
+    embedFinal $ C.lookup cache k
+  Keys -> do
+    cache <- atomicGet
+    embedFinal $ C.keys cache
+  Delete k -> do
+    cache <- atomicGet
+    embedFinal $ C.delete cache k
+  FilterWithKey pred -> do
+    cache <- atomicGet
+    embedFinal $ C.filterWithKey pred cache
+  Purge -> do
+    cache <- atomicGet
+    embedFinal $ C.purge cache
+  PurgeExpired -> do
+    cache <- atomicGet
+    embedFinal $ C.purgeExpired cache
+  Size -> do
+    cache <- atomicGet
+    embedFinal $ C.size cache
+  DefaultExipration -> do
+    cache <- atomicGet
+    pure $ C.defaultExpiration cache
+  SetDefaultExpiration ts -> do
+    cache <- atomicGet
+    atomicPut $ C.setDefaultExpiration cache ts
+
 -- | Run a 'Cache', given a default expiration time.
 runCache ::
   forall k v r a.
@@ -131,3 +175,18 @@
   eff
     & runCacheAtomicState
     & runAtomicStateIORef ref
+
+-- | Alternative version of 'runCache' that uses 'Final' instead of 'Embed'
+runCache' ::
+  forall k v r a.
+  Members '[Final IO] r =>
+  Maybe TimeSpec ->
+  Sem (Cache k v ': AtomicState (C.Cache k v) ': Embed IO ': r) a ->
+  Sem r a
+runCache' ts eff = do
+  cache <- embedFinal $ C.newCache ts
+  ref <- embedFinal $ newIORef cache
+  eff
+    & runCacheAtomicState
+    & runAtomicStateIORef ref
+    & embedToFinal
