diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,7 @@
+0.4.1.0
+-------
+* Add forkWithUnmask, forkOnWithUnmask to Control.Concurrent.Lifted.Fork
+
 0.4.0.0
 -------
 * MonadFork (adds `exceptions' dependency)
diff --git a/concurrent-state.cabal b/concurrent-state.cabal
--- a/concurrent-state.cabal
+++ b/concurrent-state.cabal
@@ -1,5 +1,5 @@
 name:                concurrent-state
-version:             0.4.0.0
+version:             0.4.1.0
 synopsis:            MTL-like library using TVars
 description:         State backed by TVar.
 homepage:            https://github.com/joelteon/concurrent-state
diff --git a/src/Control/Concurrent/Lifted/Fork.hs b/src/Control/Concurrent/Lifted/Fork.hs
--- a/src/Control/Concurrent/Lifted/Fork.hs
+++ b/src/Control/Concurrent/Lifted/Fork.hs
@@ -10,7 +10,9 @@
 -----------------------------------------------------------------------------
 module Control.Concurrent.Lifted.Fork (
     MonadFork(..),
-    forkFinally
+    forkFinally,
+    forkWithUnmask,
+    forkOnWithUnmask
 ) where
 
 import qualified Control.Concurrent as C
@@ -37,3 +39,11 @@
 forkFinally :: MonadFork m => m a -> (Either SomeException a -> m ()) -> m C.ThreadId
 forkFinally action andThen = mask $ \restore ->
     fork $ try (restore action) >>= andThen
+
+-- | Generalized 'C.forkIOWithUnmask'.
+forkWithUnmask :: MonadFork m => ((forall a. m a -> m a) -> m ()) -> m C.ThreadId
+forkWithUnmask = fork . mask
+
+-- | Generalized 'C.forkOnWithUnmask'.
+forkOnWithUnmask :: MonadFork m => Int -> ((forall a. m a -> m a) -> m ()) -> m C.ThreadId
+forkOnWithUnmask i = forkOn i . mask
diff --git a/src/Control/Monad/State/Concurrent/Lazy.hs b/src/Control/Monad/State/Concurrent/Lazy.hs
--- a/src/Control/Monad/State/Concurrent/Lazy.hs
+++ b/src/Control/Monad/State/Concurrent/Lazy.hs
@@ -108,15 +108,14 @@
         q u (StateC f) = StateC (u . f)
 
 instance MonadFork m => MonadFork (StateC s m) where
-    fork (StateC m) = StateC $ \tv -> do
-        tid <- fork (liftM fst $ m tv)
-        return (tid, tv)
-    forkOn i (StateC m) = StateC $ \tv -> do
-        tid <- forkOn i (liftM fst $ m tv)
-        return (tid, tv)
-    forkOS (StateC m) = StateC $ \tv -> do
-        tid <- forkOS (liftM fst $ m tv)
-        return (tid, tv)
+    fork = liftFork fork
+    forkOn i = liftFork (forkOn i)
+    forkOS = liftFork forkOS
+
+liftFork :: Monad m => (m r -> m a) -> StateC t m r -> StateC t m a
+liftFork f (StateC m) = StateC $ \tv -> do
+    tid <- f (liftM fst $ m tv)
+    return (tid, tv)
 
 -- | Unwrap a concurrent state monad computation as a function.
 runStateC :: MonadIO m
diff --git a/src/Control/Monad/State/Concurrent/Strict.hs b/src/Control/Monad/State/Concurrent/Strict.hs
--- a/src/Control/Monad/State/Concurrent/Strict.hs
+++ b/src/Control/Monad/State/Concurrent/Strict.hs
@@ -109,15 +109,14 @@
         q u (StateC f) = StateC (u . f)
 
 instance MonadFork m => MonadFork (StateC s m) where
-    fork (StateC m) = StateC $ \tv -> do
-        tid <- fork (liftM fst $ m tv)
-        return (tid, tv)
-    forkOn i (StateC m) = StateC $ \tv -> do
-        tid <- forkOn i (liftM fst $ m tv)
-        return (tid, tv)
-    forkOS (StateC m) = StateC $ \tv -> do
-        tid <- forkOS (liftM fst $ m tv)
-        return (tid, tv)
+    fork = liftFork fork
+    forkOn i = liftFork (forkOn i)
+    forkOS = liftFork forkOS
+
+liftFork :: Monad m => (m r -> m a) -> StateC t m r -> StateC t m a
+liftFork f (StateC m) = StateC $ \tv -> do
+    tid <- f (liftM fst $ m tv)
+    return (tid, tv)
 
 -- | Unwrap a concurrent state monad computation as a function.
 runStateC :: MonadIO m
