diff --git a/iteratee.cabal b/iteratee.cabal
--- a/iteratee.cabal
+++ b/iteratee.cabal
@@ -1,5 +1,5 @@
 name:          iteratee
-version:       0.8.4.6
+version:       0.8.5.0
 synopsis:      Iteratee-based I/O
 description:
   The Iteratee monad provides strict, safe, and functional I/O. In addition
@@ -12,10 +12,10 @@
 license:       BSD3
 license-file:  LICENSE
 homepage:      http://www.tiresiaspress.us/haskell/iteratee
-tested-with:   GHC == 7.4.2, GHC == 7.6.0
+tested-with:   GHC == 7.0.3, GHC == 6.12.3
 stability:     experimental
 
-cabal-version: >= 1.16
+cabal-version: >= 1.6
 build-type:    Simple
 
 extra-source-files:
@@ -26,13 +26,23 @@
   Examples/*.txt
   tests/*.hs
 
+flag splitBase
+  description: Use the split-up base package.
+
+flag buildTests
+  description: Build test executables.
+  default:     False
+
 library
-  default-language: Haskell2010
   hs-source-dirs:
     src
 
-  build-depends:
+  if flag(splitBase)
+    build-depends:
       base >= 3 && < 6
+  else
+    build-depends:
+      base < 3
 
   if os(windows)
     cpp-options: -DUSE_WINDOWS
@@ -47,12 +57,12 @@
       unix >= 2 && < 3
 
   build-depends:
-    ListLike                  >= 1.0     && < 5,
-    bytestring                >= 0.9     && < 0.11,
-    containers                >= 0.2     && < 0.6,
-    exceptions                >= 0.5     && < 0.7,
+    ListLike                  >= 1.0     && < 4,
+    MonadCatchIO-transformers >  0.2     && < 0.3,
+    bytestring                >= 0.9     && < 0.10,
+    containers                >= 0.2     && < 0.5,
     parallel                  >= 2       && < 4,
-    transformers              >= 0.2     && < 0.5
+    transformers              >= 0.2     && < 0.3
 
   exposed-modules:
     Data.Nullable
@@ -77,36 +87,31 @@
   if impl(ghc >= 6.8)
     ghc-options: -fwarn-tabs
 
-Test-Suite testIteratee
-  default-language: Haskell2010
-  type: exitcode-stdio-1.0
-  main-is: testIteratee.hs
+executable testIteratee
   hs-source-dirs:
     src
     tests
 
+  main-is: testIteratee.hs
+
   other-modules:
     QCUtils
 
-  if os(windows)
-    cpp-options: -DUSE_WINDOWS
-  else
-    cpp-options: -DUSE_POSIX
+  if flag(buildTests)
     build-depends:
-      unix                    >= 2 && < 3
-
-  build-depends:
-      base,
-      bytestring,
-      exceptions,
-      iteratee,
-      ListLike,
-      parallel,
-      transformers,
-      mtl                        >= 2   && < 4,
+      mtl                        >= 2   && < 3,
       QuickCheck                 >= 2   && < 3,
-      test-framework             >= 0.3 && < 0.9,
-      test-framework-quickcheck2 >= 0.2 && < 0.5
+      test-framework             >= 0.3 && < 0.4,
+      test-framework-quickcheck2 >= 0.2 && < 0.3
+  else
+    buildable:  False
+
+  if flag(splitBase)
+    build-depends:
+      base >= 3 && < 5
+  else
+    build-depends:
+      base < 3
 
 source-repository head
   type:     darcs
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
@@ -1,4 +1,3 @@
-{-# LANGUAGE CPP #-}
 {-# LANGUAGE TypeFamilies, FlexibleContexts, FlexibleInstances, Rank2Types,
     DeriveDataTypeable, ExistentialQuantification #-}
 
@@ -34,17 +33,19 @@
 )
 where
 
-import Prelude hiding (null)
+import Prelude hiding (null, catch)
 import Data.Iteratee.Base.LooseMap
 import Data.Iteratee.Exception
 import Data.Nullable
 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 (MonadCatchIO (..), Exception (..),
+  catch, block, toException, fromException)
 import Control.Applicative hiding (empty)
+import Control.Exception (SomeException)
 import qualified Control.Exception as E
 import Data.Data
 
@@ -162,21 +163,11 @@
 instance (MonadIO m, Nullable s, NullPoint s) => MonadIO (Iteratee s m) where
   liftIO = lift . liftIO
 
-instance (MonadThrow m, Nullable s, NullPoint s) =>
-  MonadThrow (Iteratee s m) where
-    throwM e    = lift $ CIO.throwM e
-
-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)
-
--- prior to exceptions-0.6, these were part of MonadCatch
-#if MIN_VERSION_exceptions(0,6,0)
-instance (MonadMask m, Nullable s, NullPoint s) =>
-  MonadMask (Iteratee s m) where
-#endif
-    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
+instance (MonadCatchIO m, Nullable s, NullPoint s) =>
+  MonadCatchIO (Iteratee s m) where
+    m `catch` f = Iteratee $ \od oc -> runIter m od oc `catch` (\e -> runIter (f e) od oc)
+    block       = ilift block
+    unblock     = ilift unblock
 
 -- |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
@@ -1,5 +1,4 @@
 {-# LANGUAGE CPP #-}
-{-# LANGUAGE ConstraintKinds #-}
 
 -- |Random and Binary IO with generic Iteratees.
 
@@ -38,13 +37,7 @@
 import qualified Data.Iteratee.IO.Fd as FD
 #endif
 
-import Control.Monad.Catch
-import Control.Monad.IO.Class
-
-#if MIN_VERSION_exceptions(0,6,0)
-#else
-type MonadMask = MonadCatch
-#endif
+import Control.Monad.CatchIO
 
 -- | The default buffer size.
 defaultBufSize :: Int
@@ -54,14 +47,14 @@
 #if defined(USE_POSIX)
 
 enumFile
-  :: (MonadIO m, MonadMask m, NullPoint s, ReadableChunk s el) =>
+  :: (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
      Int
      -> FilePath
      -> Enumerator s m a
 enumFile = FD.enumFile
 
 enumFileRandom
-  :: (MonadIO m, MonadMask m, NullPoint s, ReadableChunk s el) =>
+  :: (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
      Int
      -> FilePath
      -> Enumerator s m a
@@ -70,7 +63,7 @@
 -- |Process a file using the given Iteratee.  This function wraps
 -- enumFd as a convenience.
 fileDriver
-  :: (MonadIO m, MonadMask m, NullPoint s, ReadableChunk s el) =>
+  :: (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
      Iteratee s m a
      -> FilePath
      -> m a
@@ -78,7 +71,7 @@
 
 -- |A version of fileDriver with a user-specified buffer size (in elements).
 fileDriverVBuf
-  :: (MonadIO m, MonadMask m, NullPoint s, ReadableChunk s el) =>
+  :: (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
      Int
      -> Iteratee s m a
      -> FilePath
@@ -88,14 +81,14 @@
 -- |Process a file using the given Iteratee.  This function wraps
 -- enumFdRandom as a convenience.
 fileDriverRandom
-  :: (MonadIO m, MonadMask m, NullPoint s, ReadableChunk s el) =>
+  :: (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
      Iteratee s m a
      -> FilePath
      -> m a
 fileDriverRandom = FD.fileDriverRandomFd defaultBufSize
 
 fileDriverRandomVBuf
-  :: (MonadIO m, MonadMask m, NullPoint s, ReadableChunk s el) =>
+  :: (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
      Int
      -> Iteratee s m a
      -> FilePath
@@ -110,7 +103,7 @@
 -- |Process a file using the given Iteratee.  This function wraps
 -- @enumHandle@ as a convenience.
 fileDriver ::
- (MonadIO m, MonadMask m, NullPoint s, ReadableChunk s el) =>
+ (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
   Iteratee s m a
   -> FilePath
   -> m a
@@ -118,7 +111,7 @@
 
 -- |A version of fileDriver with a user-specified buffer size (in elements).
 fileDriverVBuf ::
- (MonadIO m, MonadMask m, NullPoint s, ReadableChunk s el) =>
+ (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
   Int
   -> Iteratee s m a
   -> FilePath
@@ -128,14 +121,14 @@
 -- |Process a file using the given Iteratee.  This function wraps
 -- @enumRandomHandle@ as a convenience.
 fileDriverRandom
-  :: (MonadIO m, MonadMask m, NullPoint s, ReadableChunk s el) =>
+  :: (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
      Iteratee s m a
      -> FilePath
      -> m a
 fileDriverRandom = H.fileDriverRandomHandle defaultBufSize
 
 fileDriverRandomVBuf
-  :: (MonadIO m, MonadMask m, NullPoint s, ReadableChunk s el) =>
+  :: (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
      Int
      -> Iteratee s m a
      -> FilePath
@@ -143,14 +136,14 @@
 fileDriverRandomVBuf = H.fileDriverRandomHandle
 
 enumFile
-  :: (MonadIO m, MonadMask m, NullPoint s, ReadableChunk s el) =>
+  :: (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
      Int
      -> FilePath
      -> Enumerator s m a
 enumFile = H.enumFile
 
 enumFileRandom
-  :: (MonadIO m, MonadMask m, NullPoint s, ReadableChunk s el) =>
+  :: (MonadCatchIO 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
@@ -1,5 +1,4 @@
 {-# LANGUAGE CPP, ScopedTypeVariables #-}
-{-# LANGUAGE ConstraintKinds #-}
 
 -- |Random and Binary IO with generic Iteratees, using File Descriptors for IO.
 -- when available, these are the preferred functions for performing IO as they
@@ -31,7 +30,7 @@
 import Control.Concurrent (yield)
 import Control.Exception
 import Control.Monad
-import Control.Monad.Catch as CIO
+import Control.Monad.CatchIO as CIO
 import Control.Monad.IO.Class
 
 import Foreign.Ptr
@@ -42,12 +41,6 @@
 
 import System.Posix hiding (FileOffset)
 
-#if MIN_VERSION_exceptions(0,6,0)
-#else
-type MonadMask = MonadCatch
-#endif
-
-
 -- ------------------------------------------------------------------------
 -- Binary Random IO enumerators
 
@@ -70,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, MonadIO m, MonadMask m) =>
+  :: forall s el m a.(NullPoint s, ReadableChunk s el, MonadCatchIO m) =>
      Int
      -> Fd
      -> Enumerator s m a
@@ -82,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, MonadIO m, MonadMask m)
+ :: forall e s el m a.(IException e, NullPoint s, ReadableChunk s el, MonadCatchIO m)
     => Int
     -> Fd
     -> (e -> m (Maybe EnumException))
@@ -97,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, MonadIO m, MonadMask m) =>
+ :: forall s el m a.(NullPoint s, ReadableChunk s el, MonadCatchIO m) =>
     Int
     -> Fd
     -> Enumerator s m a
@@ -110,7 +103,7 @@
             . liftIO . myfdSeek fd AbsoluteSeek $ fromIntegral off
 
 fileDriver
-  :: (MonadIO m, MonadMask m, ReadableChunk s el) =>
+  :: (MonadCatchIO m, ReadableChunk s el) =>
      (Int -> Fd -> Enumerator s m a)
      -> Int
      -> Iteratee s m a
@@ -123,7 +116,7 @@
 
 -- |Process a file using the given @Iteratee@.
 fileDriverFd
-  :: (NullPoint s, MonadIO m, MonadMask m, ReadableChunk s el) =>
+  :: (NullPoint s, MonadCatchIO m, ReadableChunk s el) =>
      Int -- ^Buffer size (number of elements)
      -> Iteratee s m a
      -> FilePath
@@ -132,14 +125,14 @@
 
 -- |A version of fileDriverFd that supports seeking.
 fileDriverRandomFd
-  :: (NullPoint s, MonadIO m, MonadMask m, ReadableChunk s el) =>
+  :: (NullPoint s, MonadCatchIO m, ReadableChunk s el) =>
      Int
      -> Iteratee s m a
      -> FilePath
      -> m a
 fileDriverRandomFd = fileDriver enumFdRandom
 
-enumFile' :: (NullPoint s, MonadIO m, MonadMask m, ReadableChunk s el) =>
+enumFile' :: (NullPoint s, MonadCatchIO m, ReadableChunk s el) =>
   (Int -> Fd -> Enumerator s m a)
   -> Int -- ^Buffer size
   -> FilePath
@@ -150,14 +143,14 @@
   (flip (enumf bufsize) iter)
 
 enumFile ::
-  (NullPoint s, MonadIO m, MonadMask m, ReadableChunk s el)
+  (NullPoint s, MonadCatchIO m, ReadableChunk s el)
   => Int                 -- ^Buffer size
   -> FilePath
   -> Enumerator s m a
 enumFile = enumFile' enumFd
 
 enumFileRandom ::
-  (NullPoint s, MonadIO m, MonadMask m, ReadableChunk s el)
+  (NullPoint s, MonadCatchIO 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
@@ -1,5 +1,3 @@
-{-# LANGUAGE CPP #-}
-{-# LANGUAGE ConstraintKinds #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 
 -- |Random and Binary IO with generic Iteratees.  These functions use Handles
@@ -27,7 +25,7 @@
 
 import Control.Exception
 import Control.Monad
-import Control.Monad.Catch as CIO
+import Control.Monad.CatchIO as CIO
 import Control.Monad.IO.Class
 
 import Foreign.Ptr
@@ -36,16 +34,12 @@
 
 import System.IO
 
-#if MIN_VERSION_exceptions(0,6,0)
-#else
-type MonadMask = MonadCatch
-#endif
 
 -- ------------------------------------------------------------------------
 -- Binary Random IO enumerators
 
 makeHandleCallback ::
-  (MonadIO m, MonadCatch m, NullPoint s, ReadableChunk s el) =>
+  (MonadCatchIO m, NullPoint s, ReadableChunk s el) =>
   Ptr el
   -> Int
   -> Handle
@@ -65,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, MonadIO m, MonadMask m) =>
+ forall s el m a.(NullPoint s, ReadableChunk s el, MonadCatchIO m) =>
   Int -- ^Buffer size (number of elements per read)
   -> Handle
   -> Enumerator s m a
@@ -82,7 +76,7 @@
  forall e s el m a.(IException e,
                     NullPoint s,
                     ReadableChunk s el,
-                    MonadIO m, MonadMask m) =>
+                    MonadCatchIO m) =>
   Int -- ^Buffer size (number of elements per read)
   -> Handle
   -> (e -> m (Maybe EnumException))
@@ -98,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, MonadIO m, MonadMask m) =>
+ forall s el m a.(NullPoint s, ReadableChunk s el, MonadCatchIO m) =>
   Int -- ^ Buffer size (number of elements per read)
   -> Handle
   -> Enumerator s m a
@@ -113,7 +107,7 @@
 -- ----------------------------------------------
 -- File Driver wrapper functions.
 
-enumFile' :: (NullPoint s, MonadIO m, MonadMask m, ReadableChunk s el) =>
+enumFile' :: (NullPoint s, MonadCatchIO m, ReadableChunk s el) =>
   (Int -> Handle -> Enumerator s m a)
   -> Int -- ^Buffer size
   -> FilePath
@@ -124,14 +118,14 @@
   (flip (enumf bufsize) iter)
 
 enumFile ::
-  (NullPoint s, MonadIO m, MonadMask m, ReadableChunk s el)
+  (NullPoint s, MonadCatchIO m, ReadableChunk s el)
   => Int                 -- ^Buffer size
   -> FilePath
   -> Enumerator s m a
 enumFile = enumFile' enumHandle
 
 enumFileRandom ::
-  (NullPoint s, MonadIO m, MonadMask m, ReadableChunk s el)
+  (NullPoint s, MonadCatchIO m, ReadableChunk s el)
   => Int                 -- ^Buffer size
   -> FilePath
   -> Enumerator s m a
@@ -140,7 +134,7 @@
 -- |Process a file using the given @Iteratee@.  This function wraps
 -- @enumHandle@ as a convenience.
 fileDriverHandle
-  :: (NullPoint s, MonadIO m, MonadMask m, ReadableChunk s el) =>
+  :: (NullPoint s, MonadCatchIO m, ReadableChunk s el) =>
      Int                      -- ^Buffer size (number of elements)
      -> Iteratee s m a
      -> FilePath
@@ -150,7 +144,7 @@
 
 -- |A version of @fileDriverHandle@ that supports seeking.
 fileDriverRandomHandle
-  :: (NullPoint s, MonadIO m, MonadMask m, ReadableChunk s el) =>
+  :: (NullPoint s, MonadCatchIO m, ReadableChunk s el) =>
      Int                      -- ^ Buffer size (number of elements)
      -> Iteratee s m a
      -> FilePath
diff --git a/src/Data/Iteratee/Iteratee.hs b/src/Data/Iteratee/Iteratee.hs
--- a/src/Data/Iteratee/Iteratee.hs
+++ b/src/Data/Iteratee/Iteratee.hs
@@ -325,7 +325,7 @@
 -- |Applies the iteratee to the given stream.  This wraps 'enumEof',
 -- 'enumErr', and 'enumPure1Chunk', calling the appropriate enumerator
 -- based upon 'Stream'.
-enumChunk :: (Monad m) => Stream s -> Enumerator s m a
+enumChunk :: (Monad m, Monoid s) => Stream s -> Enumerator s m a
 enumChunk (Chunk xs)     = enumPure1Chunk xs
 enumChunk (EOF Nothing)  = enumEof
 enumChunk (EOF (Just e)) = enumErr e
@@ -402,9 +402,10 @@
 -- 
 -- It passes a given list of elements to the iteratee in one chunk
 -- This enumerator does no IO and is useful for testing of base parsing
-enumPure1Chunk :: (Monad m) => s -> Enumerator s m a
-enumPure1Chunk str iter = runIter iter idoneM onCont
+enumPure1Chunk :: (Monad m, Monoid s) => s -> Enumerator s m a
+enumPure1Chunk str iter = runIter iter onDone onCont
   where
+    onDone a str'    = idoneM a (Chunk str `mappend` str')
     onCont k Nothing = return $ k $ Chunk str
     onCont k e       = return $ icont k e
 
diff --git a/src/Data/Iteratee/ListLike.hs b/src/Data/Iteratee/ListLike.hs
--- a/src/Data/Iteratee/ListLike.hs
+++ b/src/Data/Iteratee/ListLike.hs
@@ -221,8 +221,10 @@
 roll t d | t > d  = liftI step
   where
     step (Chunk vec)
-      | LL.length vec >= t =
+      | LL.length vec >= d =
           idone (LL.singleton $ LL.take t vec) (Chunk $ LL.drop d vec)
+      | LL.length vec >= t =
+          idone (LL.singleton $ LL.take t vec) mempty <* drop (d-LL.length vec)
       | LL.null vec        = liftI step
       | otherwise          = liftI (step' vec)
     step stream            = idone LL.empty stream
diff --git a/tests/testIteratee.hs b/tests/testIteratee.hs
--- a/tests/testIteratee.hs
+++ b/tests/testIteratee.hs
@@ -153,6 +153,12 @@
 
 type I = Iteratee [Int] Identity [Int]
 
+prop_enumNoStream xs =
+  runIdentity (enumPure1Chunk xs (return 'a') >>= \i ->
+    Iter.run (i >> stream2list))
+  == xs
+  where types = xs :: [Int]
+
 prop_enumChunks n xs i = n > 0  ==>
   runner1 (enumPure1Chunk xs i) == runner1 (enumSpecial xs n i)
   where types = (n :: Int, xs :: [Int], i :: I)
@@ -376,7 +382,8 @@
     ,testProperty "iteratee Monad Assc" prop_iterMonad3
     ]
   ,testGroup "Simple Enumerators/Combinators" [
-    testProperty "enumPureNChunk" prop_enumChunks
+    testProperty "enumPure1Chunk - final stream state" prop_enumNoStream
+    ,testProperty "enumPureNChunk" prop_enumChunks
     ,testProperty "enum append 1" prop_app1
     ,testProperty "enum sequencing" prop_app2
     ,testProperty "enum sequencing 2" prop_app3
