diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# Pipes-Safe v2.2.6
+# Pipes-Safe v2.2.8
 
 `pipes-safe` builds upon
 [the `pipes` library](https://github.com/Gabriel439/Haskell-Pipes-Library) to
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.2.6
+Version: 2.2.8
 Cabal-Version: >=1.8.0.2
 Build-Type: Simple
 License: BSD3
@@ -36,14 +36,14 @@
 
 Library
     Build-Depends:
-        base              >= 4       && < 5  ,
-        containers        >= 0.3.0.0 && < 0.6,
-        exceptions        >= 0.6     && < 0.9,
-        mtl               >= 2.1     && < 2.3,
-        transformers      >= 0.2.0.0 && < 0.6,
-        transformers-base >= 0.4.4   && < 0.5,
-        monad-control     >= 1.0.0.4 && < 1.1,
-        primitive         >= 0.6.2.0 && < 0.7,
+        base              >= 4       && < 5   ,
+        containers        >= 0.3.0.0 && < 0.6 ,
+        exceptions        >= 0.6     && < 0.11,
+        mtl               >= 2.1     && < 2.3 ,
+        transformers      >= 0.2.0.0 && < 0.6 ,
+        transformers-base >= 0.4.4   && < 0.5 ,
+        monad-control     >= 1.0.0.4 && < 1.1 ,
+        primitive         >= 0.6.2.0 && < 0.7 ,
         pipes             >= 4.3.0   && < 4.4
     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
@@ -94,6 +94,7 @@
     ( MonadCatch(..)
     , MonadThrow(..)
     , MonadMask(..)
+    , ExitCase(..)
     , mask_
     , uninterruptibleMask_
     , catchAll
@@ -140,7 +141,6 @@
 import Data.Monoid (Monoid)
 import Pipes (Proxy, Effect, Effect', runEffect)
 import Pipes.Internal (Proxy(..))
-import Pipes.Lift (liftCatchError)
 
 data Restore m = Unmasked | Masked (forall x . m x -> m x)
 
@@ -181,8 +181,26 @@
     loop $ k unmask
 
 instance (MonadMask m, MonadIO m) => MonadMask (Proxy a' a b' b m) where
-    mask                = liftMask mask
+    mask = liftMask mask
+
     uninterruptibleMask = liftMask uninterruptibleMask
+
+#if MIN_VERSION_exceptions(0,10,0)
+    generalBracket acquire release_ use = mask $ \unmasked -> do
+      a <- acquire
+      let action = do
+              b <- use a
+              return (ExitCaseSuccess b, ExitCaseSuccess_ b)
+      let handler e = return (ExitCaseException e, ExitCaseException_ e)
+      (exitCase, exitCase_) <- unmasked action `catch` handler
+      c <- release_ a exitCase
+      case exitCase_ of
+          ExitCaseException_ e -> throwM e
+          ExitCaseSuccess_ b   -> return (b, c)
+#endif
+
+-- | This is to avoid an unnecessary partial pattern match in `generalBracket`
+data ExitCase_ a = ExitCaseSuccess_ a | ExitCaseException_ SomeException
 
 data Finalizers m = Finalizers
     { _nextKey    :: !Integer
