diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,7 @@
+# 0.9.0.0
+
+* Add `resumeMaybe`.
+
 # 0.8.0.0
 
 * Export `stopToErrorIO`.
diff --git a/lib/Polysemy/Resume.hs b/lib/Polysemy/Resume.hs
--- a/lib/Polysemy/Resume.hs
+++ b/lib/Polysemy/Resume.hs
@@ -56,6 +56,7 @@
   resumeHoistErrorAs,
   restop,
   resumeEither,
+  resumeMaybe,
   resumeOr,
   resumingOr,
   resumeError,
@@ -72,6 +73,22 @@
 
 import Polysemy.Resume.Effect.Resumable (Resumable, type (!!))
 import Polysemy.Resume.Effect.Stop (Stop (..), stop)
+import Polysemy.Resume.Interpreter.Resumable (
+  catchResumable,
+  interceptResumable,
+  interceptResumableH,
+  interceptResumableUsing,
+  interceptResumableUsingH,
+  interpretResumable,
+  interpretResumableH,
+  raiseResumable,
+  resumable,
+  resumableError,
+  resumableFor,
+  resumableIO,
+  resumableOr,
+  runAsResumable,
+  )
 import Polysemy.Resume.Interpreter.Scoped (
   interpretResumableScoped,
   interpretResumableScopedH,
@@ -92,21 +109,25 @@
   interpretScopedResumableWith_,
   interpretScopedResumable_,
   )
-import Polysemy.Resume.Interpreter.Resumable (
-  catchResumable,
-  interceptResumable,
-  interceptResumableH,
-  interceptResumableUsing,
-  interceptResumableUsingH,
-  interpretResumable,
-  interpretResumableH,
-  raiseResumable,
-  resumable,
-  resumableError,
-  resumableFor,
-  resumableIO,
-  resumableOr,
-  runAsResumable,
+import Polysemy.Resume.Interpreter.Stop (
+  mapStop,
+  replaceStop,
+  runStop,
+  showStop,
+  stopEither,
+  stopEitherAs,
+  stopEitherWith,
+  stopNote,
+  stopOnError,
+  stopOnErrorWith,
+  stopToError,
+  stopToErrorIO,
+  stopToErrorWith,
+  stopToIOFinal,
+  stopTryAny,
+  stopTryIO,
+  stopTryIOE,
+  stopTryIOError,
   )
 import Polysemy.Resume.Resume (
   restop,
@@ -120,6 +141,7 @@
   resumeHoistAs,
   resumeHoistError,
   resumeHoistErrorAs,
+  resumeMaybe,
   resumeOr,
   resumeWith,
   resume_,
@@ -133,26 +155,6 @@
   (!>>),
   (<!),
   (<<!),
-  )
-import Polysemy.Resume.Interpreter.Stop (
-  mapStop,
-  replaceStop,
-  runStop,
-  showStop,
-  stopEither,
-  stopEitherAs,
-  stopEitherWith,
-  stopNote,
-  stopOnError,
-  stopOnErrorWith,
-  stopToError,
-  stopToErrorIO,
-  stopToErrorWith,
-  stopToIOFinal,
-  stopTryAny,
-  stopTryIO,
-  stopTryIOE,
-  stopTryIOError,
   )
 
 -- $intro
diff --git a/lib/Polysemy/Resume/Resume.hs b/lib/Polysemy/Resume/Resume.hs
--- a/lib/Polysemy/Resume/Resume.hs
+++ b/lib/Polysemy/Resume/Resume.hs
@@ -216,6 +216,15 @@
 resumeEither ma =
   resuming (pure . Left) (Right <$> ma)
 
+-- | Variant of 'resume' that immediately produces an 'Maybe'.
+resumeMaybe ::
+  ∀ err eff r a .
+  Member (Resumable err eff) r =>
+  Sem (eff : r) a ->
+  Sem r (Maybe a)
+resumeMaybe ma =
+  resuming @err (const (pure Nothing)) (Just <$> ma)
+
 -- | Variant of 'resume' that takes a branch for error and success.
 -- This allows the success branch to contain other resumptions.
 --
diff --git a/polysemy-resume.cabal b/polysemy-resume.cabal
--- a/polysemy-resume.cabal
+++ b/polysemy-resume.cabal
@@ -1,11 +1,11 @@
 cabal-version: 2.2
 
--- This file has been generated from package.yaml by hpack version 0.35.2.
+-- This file has been generated from package.yaml by hpack version 0.36.0.
 --
 -- see: https://github.com/sol/hpack
 
 name:           polysemy-resume
-version:        0.8.0.1
+version:        0.9.0.0
 synopsis:       Polysemy error tracking
 description:    See https://hackage.haskell.org/package/polysemy-resume/docs/Polysemy-Resume.html
 category:       Error
@@ -51,6 +51,7 @@
       GADTs
       LambdaCase
       LiberalTypeSynonyms
+      MonadComprehensions
       MultiWayIf
       OverloadedLabels
       OverloadedLists
@@ -73,10 +74,10 @@
       NoFieldSelectors
   ghc-options: -Wall -Widentities -Wincomplete-uni-patterns -Wmissing-deriving-strategies -Wredundant-constraints -Wunused-type-patterns -Wunused-packages
   build-depends:
-      base ==4.*
-    , incipit-core >=0.4 && <0.6
-    , polysemy ==1.9.*
-    , transformers
+      base >=4.16.4.0 && <4.20
+    , incipit-core >=0.4.1.0 && <0.7
+    , polysemy >=1.9.0.0 && <1.10
+    , transformers >=0.5.6.2 && <0.7
   mixins:
       base hiding (Prelude)
     , incipit-core (IncipitCore as Prelude)
@@ -108,6 +109,7 @@
       GADTs
       LambdaCase
       LiberalTypeSynonyms
+      MonadComprehensions
       MultiWayIf
       OverloadedLabels
       OverloadedLists
@@ -130,14 +132,14 @@
       NoFieldSelectors
   ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall -Widentities -Wincomplete-uni-patterns -Wmissing-deriving-strategies -Wredundant-constraints -Wunused-type-patterns -Wunused-packages
   build-depends:
-      base ==4.*
-    , incipit-core >=0.4 && <0.6
-    , polysemy ==1.9.*
-    , polysemy-plugin >=0.4.3 && <0.5
+      base >=4.16.4.0 && <4.20
+    , incipit-core >=0.4.1.0 && <0.7
+    , polysemy >=1.9.0.0 && <1.10
+    , polysemy-plugin >=0.4.3.0 && <0.5
     , polysemy-resume
-    , polysemy-test >=0.6 && <0.10
-    , stm
-    , tasty ==1.4.*
+    , polysemy-test >=0.6.0.0 && <0.11
+    , stm >=2.5.0.2 && <2.6
+    , tasty >=1.4.0.3 && <1.5
   mixins:
       base hiding (Prelude)
     , incipit-core (IncipitCore as Prelude)
diff --git a/test/Polysemy/Resume/Test/ScopedTest.hs b/test/Polysemy/Resume/Test/ScopedTest.hs
--- a/test/Polysemy/Resume/Test/ScopedTest.hs
+++ b/test/Polysemy/Resume/Test/ScopedTest.hs
@@ -3,16 +3,6 @@
 module Polysemy.Resume.Test.ScopedTest where
 
 import Control.Concurrent.STM (TVar, atomically, modifyTVar', newTVarIO, readTVarIO, writeTVar)
-import Polysemy.Scoped (
-  Scoped,
-  interpretScoped,
-  interpretScopedH,
-  interpretScopedH',
-  interpretScopedWithH,
-  rescope,
-  scoped,
-  scoped_,
-  )
 import Polysemy.Test (UnitTest, runTestAuto, unitTest, (===))
 import Test.Tasty (TestTree, testGroup)
 
