diff --git a/iteratee.cabal b/iteratee.cabal
--- a/iteratee.cabal
+++ b/iteratee.cabal
@@ -1,5 +1,5 @@
 name:          iteratee
-version:       0.8.4.3
+version:       0.8.4.4
 synopsis:      Iteratee-based I/O
 description:
   The Iteratee monad provides strict, safe, and functional I/O. In addition
@@ -48,9 +48,9 @@
 
   build-depends:
     ListLike                  >= 1.0     && < 5,
-    MonadCatchIO-transformers >  0.2     && < 0.4,
     bytestring                >= 0.9     && < 0.11,
     containers                >= 0.2     && < 0.6,
+    exceptions                >= 0.3     && < 0.5,
     parallel                  >= 2       && < 4,
     transformers              >= 0.2     && < 0.4
 
@@ -98,9 +98,9 @@
   build-depends:
       base,
       bytestring,
+      exceptions,
       iteratee,
       ListLike,
-      MonadCatchIO-transformers,
       parallel,
       transformers,
       mtl                        >= 2   && < 4,
diff --git a/src/Data/Iteratee/Base.hs b/src/Data/Iteratee/Base.hs
--- a/src/Data/Iteratee/Base.hs
+++ b/src/Data/Iteratee/Base.hs
@@ -40,11 +40,10 @@
 import Data.NullPoint
 import Data.Monoid
 
+import Control.Monad.Catch as CIO
 import Control.Monad.IO.Class
 import Control.Monad.Trans.Class
-import Control.Monad.CatchIO as CIO
 import Control.Applicative hiding (empty)
-import Control.Exception (SomeException)
 import qualified Control.Exception as E
 import Data.Data
 
@@ -162,11 +161,12 @@
 instance (MonadIO m, Nullable s, NullPoint s) => MonadIO (Iteratee s m) where
   liftIO = lift . liftIO
 
-instance (MonadCatchIO m, Nullable s, NullPoint s) =>
-  MonadCatchIO (Iteratee s m) where
+instance (MonadCatch m, Nullable s, NullPoint s) =>
+  MonadCatch (Iteratee s m) where
     m `catch` f = Iteratee $ \od oc -> runIter m od oc `CIO.catch` (\e -> runIter (f e) od oc)
-    block       = ilift block
-    unblock     = ilift unblock
+    throwM e    = lift $ CIO.throwM e
+    mask q      = Iteratee $ \od oc -> CIO.mask $ \u -> runIter (q $ ilift u) od oc
+    uninterruptibleMask q = Iteratee $ \od oc -> CIO.uninterruptibleMask $ \u -> runIter (q $ ilift u) od oc
 
 -- |Send 'EOF' to the @Iteratee@ and disregard the unconsumed part of the
 -- stream.  If the iteratee is in an exception state, that exception is
diff --git a/src/Data/Iteratee/IO.hs b/src/Data/Iteratee/IO.hs
--- a/src/Data/Iteratee/IO.hs
+++ b/src/Data/Iteratee/IO.hs
@@ -37,7 +37,8 @@
 import qualified Data.Iteratee.IO.Fd as FD
 #endif
 
-import Control.Monad.CatchIO
+import Control.Monad.Catch
+import Control.Monad.IO.Class
 
 -- | The default buffer size.
 defaultBufSize :: Int
@@ -47,14 +48,14 @@
 #if defined(USE_POSIX)
 
 enumFile
-  :: (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
+  :: (MonadIO m, MonadCatch m, NullPoint s, ReadableChunk s el) =>
      Int
      -> FilePath
      -> Enumerator s m a
 enumFile = FD.enumFile
 
 enumFileRandom
-  :: (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
+  :: (MonadIO m, MonadCatch m, NullPoint s, ReadableChunk s el) =>
      Int
      -> FilePath
      -> Enumerator s m a
@@ -63,7 +64,7 @@
 -- |Process a file using the given Iteratee.  This function wraps
 -- enumFd as a convenience.
 fileDriver
-  :: (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
+  :: (MonadIO m, MonadCatch m, NullPoint s, ReadableChunk s el) =>
      Iteratee s m a
      -> FilePath
      -> m a
@@ -71,7 +72,7 @@
 
 -- |A version of fileDriver with a user-specified buffer size (in elements).
 fileDriverVBuf
-  :: (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
+  :: (MonadIO m, MonadCatch m, NullPoint s, ReadableChunk s el) =>
      Int
      -> Iteratee s m a
      -> FilePath
@@ -81,14 +82,14 @@
 -- |Process a file using the given Iteratee.  This function wraps
 -- enumFdRandom as a convenience.
 fileDriverRandom
-  :: (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
+  :: (MonadIO m, MonadCatch m, NullPoint s, ReadableChunk s el) =>
      Iteratee s m a
      -> FilePath
      -> m a
 fileDriverRandom = FD.fileDriverRandomFd defaultBufSize
 
 fileDriverRandomVBuf
-  :: (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
+  :: (MonadIO m, MonadCatch m, NullPoint s, ReadableChunk s el) =>
      Int
      -> Iteratee s m a
      -> FilePath
@@ -103,7 +104,7 @@
 -- |Process a file using the given Iteratee.  This function wraps
 -- @enumHandle@ as a convenience.
 fileDriver ::
- (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
+ (MonadIO m, MonadCatch m, NullPoint s, ReadableChunk s el) =>
   Iteratee s m a
   -> FilePath
   -> m a
@@ -111,7 +112,7 @@
 
 -- |A version of fileDriver with a user-specified buffer size (in elements).
 fileDriverVBuf ::
- (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
+ (MonadIO m, MonadCatch m, NullPoint s, ReadableChunk s el) =>
   Int
   -> Iteratee s m a
   -> FilePath
@@ -121,14 +122,14 @@
 -- |Process a file using the given Iteratee.  This function wraps
 -- @enumRandomHandle@ as a convenience.
 fileDriverRandom
-  :: (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
+  :: (MonadIO m, MonadCatch m, NullPoint s, ReadableChunk s el) =>
      Iteratee s m a
      -> FilePath
      -> m a
 fileDriverRandom = H.fileDriverRandomHandle defaultBufSize
 
 fileDriverRandomVBuf
-  :: (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
+  :: (MonadIO m, MonadCatch m, NullPoint s, ReadableChunk s el) =>
      Int
      -> Iteratee s m a
      -> FilePath
@@ -136,14 +137,14 @@
 fileDriverRandomVBuf = H.fileDriverRandomHandle
 
 enumFile
-  :: (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
+  :: (MonadIO m, MonadCatch m, NullPoint s, ReadableChunk s el) =>
      Int
      -> FilePath
      -> Enumerator s m a
 enumFile = H.enumFile
 
 enumFileRandom
-  :: (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
+  :: (MonadIO m, MonadCatch m, NullPoint s, ReadableChunk s el) =>
      Int
      -> FilePath
      -> Enumerator s m a
diff --git a/src/Data/Iteratee/IO/Fd.hs b/src/Data/Iteratee/IO/Fd.hs
--- a/src/Data/Iteratee/IO/Fd.hs
+++ b/src/Data/Iteratee/IO/Fd.hs
@@ -30,7 +30,7 @@
 import Control.Concurrent (yield)
 import Control.Exception
 import Control.Monad
-import Control.Monad.CatchIO as CIO
+import Control.Monad.Catch as CIO
 import Control.Monad.IO.Class
 
 import Foreign.Ptr
@@ -63,7 +63,7 @@
 -- over the entire contents of a file, in order, unless stopped by
 -- the iteratee.  In particular, seeking is not supported.
 enumFd
-  :: forall s el m a.(NullPoint s, ReadableChunk s el, MonadCatchIO m) =>
+  :: forall s el m a.(NullPoint s, ReadableChunk s el, MonadIO m, MonadCatch m) =>
      Int
      -> Fd
      -> Enumerator s m a
@@ -75,7 +75,7 @@
 
 -- |A variant of enumFd that catches exceptions raised by the @Iteratee@.
 enumFdCatch
- :: forall e s el m a.(IException e, NullPoint s, ReadableChunk s el, MonadCatchIO m)
+ :: forall e s el m a.(IException e, NullPoint s, ReadableChunk s el, MonadIO m, MonadCatch m)
     => Int
     -> Fd
     -> (e -> m (Maybe EnumException))
@@ -90,7 +90,7 @@
 -- |The enumerator of a POSIX File Descriptor: a variation of @enumFd@ that
 -- supports RandomIO (seek requests).
 enumFdRandom
- :: forall s el m a.(NullPoint s, ReadableChunk s el, MonadCatchIO m) =>
+ :: forall s el m a.(NullPoint s, ReadableChunk s el, MonadIO m, MonadCatch m) =>
     Int
     -> Fd
     -> Enumerator s m a
@@ -103,7 +103,7 @@
             . liftIO . myfdSeek fd AbsoluteSeek $ fromIntegral off
 
 fileDriver
-  :: (MonadCatchIO m, ReadableChunk s el) =>
+  :: (MonadIO m, MonadCatch m, ReadableChunk s el) =>
      (Int -> Fd -> Enumerator s m a)
      -> Int
      -> Iteratee s m a
@@ -116,7 +116,7 @@
 
 -- |Process a file using the given @Iteratee@.
 fileDriverFd
-  :: (NullPoint s, MonadCatchIO m, ReadableChunk s el) =>
+  :: (NullPoint s, MonadIO m, MonadCatch m, ReadableChunk s el) =>
      Int -- ^Buffer size (number of elements)
      -> Iteratee s m a
      -> FilePath
@@ -125,14 +125,14 @@
 
 -- |A version of fileDriverFd that supports seeking.
 fileDriverRandomFd
-  :: (NullPoint s, MonadCatchIO m, ReadableChunk s el) =>
+  :: (NullPoint s, MonadIO m, MonadCatch m, ReadableChunk s el) =>
      Int
      -> Iteratee s m a
      -> FilePath
      -> m a
 fileDriverRandomFd = fileDriver enumFdRandom
 
-enumFile' :: (NullPoint s, MonadCatchIO m, ReadableChunk s el) =>
+enumFile' :: (NullPoint s, MonadIO m, MonadCatch m, ReadableChunk s el) =>
   (Int -> Fd -> Enumerator s m a)
   -> Int -- ^Buffer size
   -> FilePath
@@ -143,14 +143,14 @@
   (flip (enumf bufsize) iter)
 
 enumFile ::
-  (NullPoint s, MonadCatchIO m, ReadableChunk s el)
+  (NullPoint s, MonadIO m, MonadCatch m, ReadableChunk s el)
   => Int                 -- ^Buffer size
   -> FilePath
   -> Enumerator s m a
 enumFile = enumFile' enumFd
 
 enumFileRandom ::
-  (NullPoint s, MonadCatchIO m, ReadableChunk s el)
+  (NullPoint s, MonadIO m, MonadCatch m, ReadableChunk s el)
   => Int                 -- ^Buffer size
   -> FilePath
   -> Enumerator s m a
diff --git a/src/Data/Iteratee/IO/Handle.hs b/src/Data/Iteratee/IO/Handle.hs
--- a/src/Data/Iteratee/IO/Handle.hs
+++ b/src/Data/Iteratee/IO/Handle.hs
@@ -25,7 +25,7 @@
 
 import Control.Exception
 import Control.Monad
-import Control.Monad.CatchIO as CIO
+import Control.Monad.Catch as CIO
 import Control.Monad.IO.Class
 
 import Foreign.Ptr
@@ -39,7 +39,7 @@
 -- Binary Random IO enumerators
 
 makeHandleCallback ::
-  (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
+  (MonadIO m, MonadCatch m, NullPoint s, ReadableChunk s el) =>
   Ptr el
   -> Int
   -> Handle
@@ -59,7 +59,7 @@
 -- the iteratee.  In particular, seeking is not supported.
 -- Data is read into a buffer of the specified size.
 enumHandle ::
- forall s el m a.(NullPoint s, ReadableChunk s el, MonadCatchIO m) =>
+ forall s el m a.(NullPoint s, ReadableChunk s el, MonadIO m, MonadCatch m) =>
   Int -- ^Buffer size (number of elements per read)
   -> Handle
   -> Enumerator s m a
@@ -76,7 +76,7 @@
  forall e s el m a.(IException e,
                     NullPoint s,
                     ReadableChunk s el,
-                    MonadCatchIO m) =>
+                    MonadIO m, MonadCatch m) =>
   Int -- ^Buffer size (number of elements per read)
   -> Handle
   -> (e -> m (Maybe EnumException))
@@ -92,7 +92,7 @@
 -- supports RandomIO (seek requests).
 -- Data is read into a buffer of the specified size.
 enumHandleRandom ::
- forall s el m a.(NullPoint s, ReadableChunk s el, MonadCatchIO m) =>
+ forall s el m a.(NullPoint s, ReadableChunk s el, MonadIO m, MonadCatch m) =>
   Int -- ^ Buffer size (number of elements per read)
   -> Handle
   -> Enumerator s m a
@@ -107,7 +107,7 @@
 -- ----------------------------------------------
 -- File Driver wrapper functions.
 
-enumFile' :: (NullPoint s, MonadCatchIO m, ReadableChunk s el) =>
+enumFile' :: (NullPoint s, MonadIO m, MonadCatch m, ReadableChunk s el) =>
   (Int -> Handle -> Enumerator s m a)
   -> Int -- ^Buffer size
   -> FilePath
@@ -118,14 +118,14 @@
   (flip (enumf bufsize) iter)
 
 enumFile ::
-  (NullPoint s, MonadCatchIO m, ReadableChunk s el)
+  (NullPoint s, MonadIO m, MonadCatch m, ReadableChunk s el)
   => Int                 -- ^Buffer size
   -> FilePath
   -> Enumerator s m a
 enumFile = enumFile' enumHandle
 
 enumFileRandom ::
-  (NullPoint s, MonadCatchIO m, ReadableChunk s el)
+  (NullPoint s, MonadIO m, MonadCatch m, ReadableChunk s el)
   => Int                 -- ^Buffer size
   -> FilePath
   -> Enumerator s m a
@@ -134,7 +134,7 @@
 -- |Process a file using the given @Iteratee@.  This function wraps
 -- @enumHandle@ as a convenience.
 fileDriverHandle
-  :: (NullPoint s, MonadCatchIO m, ReadableChunk s el) =>
+  :: (NullPoint s, MonadIO m, MonadCatch m, ReadableChunk s el) =>
      Int                      -- ^Buffer size (number of elements)
      -> Iteratee s m a
      -> FilePath
@@ -144,7 +144,7 @@
 
 -- |A version of @fileDriverHandle@ that supports seeking.
 fileDriverRandomHandle
-  :: (NullPoint s, MonadCatchIO m, ReadableChunk s el) =>
+  :: (NullPoint s, MonadIO m, MonadCatch m, ReadableChunk s el) =>
      Int                      -- ^ Buffer size (number of elements)
      -> Iteratee s m a
      -> FilePath
