diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+# Version 0.1.1
+
+* Add `acquire1`, `acquireType1`, `unAcquire`.
+
+* Safer `mkAcquire1` and `mkAcquireType1` internals.
+
+
 # Version 0.1.0
 
 * Fix `onceK`, `once`.
diff --git a/lib/Control/Monad/Trans/Resource/Extra.hs b/lib/Control/Monad/Trans/Resource/Extra.hs
--- a/lib/Control/Monad/Trans/Resource/Extra.hs
+++ b/lib/Control/Monad/Trans/Resource/Extra.hs
@@ -1,8 +1,11 @@
 module Control.Monad.Trans.Resource.Extra
    ( -- * Acquire
-    mkAcquire1
+    acquire1
+   , acquireType1
+   , mkAcquire1
    , mkAcquireType1
    , acquireReleaseSelf
+   , unAcquire
 
     -- * MonadResource
    , registerType
@@ -43,22 +46,53 @@
 
 --------------------------------------------------------------------------------
 
+-- | Like 'A.mkAcquire1', but the acquire function is provided the current
+-- 'Restore'-like function.
+acquire1 :: ((forall x. IO x -> IO x) -> IO a) -> (a -> IO ()) -> A.Acquire a
+acquire1 acq rel = acquireType1 acq \a _ -> rel a
+
+-- | Like 'A.mkAcquireType1', but the acquire function is provided the current
+-- 'Restore'-like function.
+acquireType1
+   :: ((forall x. IO x -> IO x) -> IO a)
+   -> (a -> A.ReleaseType -> IO ())
+   -> A.Acquire a
+acquireType1 acq rel = A.Acquire \res -> do
+   rel1 <- onceK $ uncurry rel
+   a <- acq res
+   pure $ A.Allocated a $ curry rel1 a
+
 -- | Like 'A.mkAcquire', but the release function will be run at most once.
+-- Subsequent executions of the release function will be no-ops.
 mkAcquire1 :: IO a -> (a -> IO ()) -> A.Acquire a
-mkAcquire1 m f = fst <$> A.mkAcquire ((,) <$> m <*> onceK f) \(a, g) -> g a
+mkAcquire1 acq = acquire1 \_ -> acq
 
 -- | Like 'A.mkAcquireType', but the release function will be run at most once.
+-- Subsequent executions of the release function will be no-ops.
 mkAcquireType1 :: IO a -> (a -> A.ReleaseType -> IO ()) -> A.Acquire a
-mkAcquireType1 m f = fmap fst do
-   A.mkAcquireType ((,) <$> m <*> onceK (uncurry f)) \(a, g) t -> g (a, t)
+mkAcquireType1 acq = acquireType1 \_ -> acq
 
 -- | Build an 'A.Acquire' having access to its own release function.
+--
+-- The release function will be run at most once. Subsequent executions of
+-- the release function will be no-ops.
 acquireReleaseSelf :: A.Acquire ((A.ReleaseType -> IO ()) -> a) -> A.Acquire a
 acquireReleaseSelf (A.Acquire f) = A.Acquire \restore -> do
    A.Allocated g rel0 <- f restore
    rel1 <- onceK rel0
    pure $ A.Allocated (g rel1) rel1
 
+-- | Removes the 'A.Acquire' and 'A.Allocated' wrappers.
+unAcquire
+   :: (MonadIO m)
+   => A.Acquire a
+   -> (forall x. IO x -> IO x)
+   -- ^ 'Restore'-like function.
+   -> m (a, A.ReleaseType -> IO ())
+unAcquire (A.Acquire f) restore = liftIO do
+   A.Allocated a rel <- f restore
+   pure (a, rel)
+
 --------------------------------------------------------------------------------
 
 -- | Like 'R.runResourceT', but requires only 'Ex.MonadMask'.
@@ -114,7 +148,7 @@
 releaseType :: (MonadIO m) => R.ReleaseKey -> A.ReleaseType -> m ()
 releaseType rk rt = liftIO $ maybe mempty ($ rt) =<< unprotectType rk
 
--- Like 'R.unprotect', but allows specifying the 'A.ReleaseType' too.
+-- | Like 'R.unprotect', but allows specifying the 'A.ReleaseType' too.
 unprotectType
    :: (MonadIO m) => R.ReleaseKey -> m (Maybe (A.ReleaseType -> IO ()))
 unprotectType (R.ReleaseKey istate key) = liftIO do
diff --git a/resourcet-extra.cabal b/resourcet-extra.cabal
--- a/resourcet-extra.cabal
+++ b/resourcet-extra.cabal
@@ -1,6 +1,6 @@
 cabal-version: 2.4
 name: resourcet-extra
-version: 0.1.0
+version: 0.1.1
 license: BSD-3-Clause
 license-file: LICENSE
 extra-source-files: README.md CHANGELOG.md
