diff --git a/pipes-safe.cabal b/pipes-safe.cabal
--- a/pipes-safe.cabal
+++ b/pipes-safe.cabal
@@ -1,5 +1,5 @@
 Name: pipes-safe
-Version: 2.1.0
+Version: 2.2.0
 Cabal-Version: >=1.8.0.2
 Build-Type: Simple
 License: BSD3
@@ -36,8 +36,8 @@
     Build-Depends:
         base         >= 4       && < 5  ,
         containers   >= 0.3.0.0 && < 0.6,
-        exceptions   >= 0.4     && < 0.6,
-        transformers >= 0.2.0.0 && < 0.4,
+        exceptions   >= 0.6     && < 0.7,
+        transformers >= 0.2.0.0 && < 0.5,
         pipes        >= 4.0.0   && < 4.2
     Exposed-Modules:
         Pipes.Safe,
diff --git a/src/Pipes/Safe.hs b/src/Pipes/Safe.hs
--- a/src/Pipes/Safe.hs
+++ b/src/Pipes/Safe.hs
@@ -89,6 +89,7 @@
 import Control.Monad.Catch
     ( MonadCatch(..)
     , MonadThrow(..)
+    , MonadMask(..)
     , mask_
     , uninterruptibleMask_
     , catchAll
@@ -162,11 +163,13 @@
                 Pure r         -> Pure r
         loop (k unmask)
 
-instance MonadThrow m => MonadThrow (Proxy a' a b' b m) where
+instance (MonadThrow m) => MonadThrow (Proxy a' a b' b m) where
     throwM = lift . throwM
 
-instance (MonadCatch m, MonadIO m) => MonadCatch (Proxy a' a b' b m) where
-    catch  = liftCatchError C.catch
+instance (MonadCatch m) => MonadCatch (Proxy a' a b' b m) where
+    catch = liftCatchError C.catch
+
+instance (MonadMask m, MonadIO m) => MonadMask (Proxy a' a b' b m) where
     mask                = liftMask mask
     uninterruptibleMask = liftMask uninterruptibleMask
 
@@ -215,6 +218,9 @@
 -- Deriving 'MonadCatch'
 instance (MonadCatch m) => MonadCatch (SafeT m) where
     m `catch` f = SafeT (unSafeT m `C.catch` \r -> unSafeT (f r))
+
+-- Deriving 'MonadMask'
+instance (MonadMask m) => MonadMask (SafeT m) where
     mask k = SafeT (mask (\restore ->
         unSafeT (k (\ma -> SafeT (restore (unSafeT ma)))) ))
     uninterruptibleMask k = SafeT (uninterruptibleMask (\restore ->
@@ -226,7 +232,7 @@
 {-| Run the 'SafeT' monad transformer, executing all unreleased finalizers at
     the end of the computation
 -}
-runSafeT :: (MonadCatch m, MonadIO m) => SafeT m r -> m r
+runSafeT :: (MonadMask m, MonadIO m) => SafeT m r -> m r
 runSafeT m = C.bracket
     (liftIO $ newIORef $! Finalizers 0 M.empty)
     (\ioref -> do
@@ -241,7 +247,7 @@
     Use 'runSafeP' to safely flush all unreleased finalizers and ensure prompt
     finalization without exiting the 'Proxy' monad.
 -}
-runSafeP :: (MonadCatch m, MonadIO m) => Effect (SafeT m) r -> Effect' m r
+runSafeP :: (MonadMask m, MonadIO m) => Effect (SafeT m) r -> Effect' m r
 runSafeP = lift . runSafeT . runEffect
 {-# INLINABLE runSafeP #-}
 
@@ -251,7 +257,7 @@
 {-| 'MonadSafe' lets you 'register' and 'release' finalizers that execute in a
     'Base' monad
 -}
-class (MonadCatch m, MonadIO m, MonadIO (Base m)) => MonadSafe m where
+class (MonadCatch m, MonadMask m, MonadIO m, MonadIO (Base m)) => MonadSafe m where
     {-| The monad used to run resource management actions, corresponding to the
         monad directly beneath 'SafeT'
     -}
@@ -273,7 +279,7 @@
     -}
     release  :: ReleaseKey -> m ()
 
-instance (MonadIO m, MonadCatch m) => MonadSafe (SafeT m) where
+instance (MonadIO m, MonadCatch m, MonadMask m) => MonadSafe (SafeT m) where
     type Base (SafeT m) = m
 
     liftBase = lift
