diff --git a/enumerator.cabal b/enumerator.cabal
--- a/enumerator.cabal
+++ b/enumerator.cabal
@@ -1,5 +1,5 @@
 name: enumerator
-version: 0.4
+version: 0.4.0.1
 synopsis: Implementation of Oleg Kiselyov's left-fold enumerators
 license: MIT
 license-file: license.txt
@@ -32,7 +32,7 @@
   build-depends:
       transformers >= 0.2 && < 0.3
     , bytestring >= 0.9 && < 0.10
-    , text >= 0.7 && < 0.8
+    , text >= 0.7 && < 0.9
 
   if impl(ghc >= 6.10)
     build-depends:
diff --git a/hs/Data/Enumerator.hs b/hs/Data/Enumerator.hs
--- a/hs/Data/Enumerator.hs
+++ b/hs/Data/Enumerator.hs
@@ -34,6 +34,7 @@
 	, (<==<)
 	  -- ** Iteratees
 	, run
+	, run_
 	, consume
 	, isEOF
 	, liftTrans
@@ -307,6 +308,8 @@
 		Error err -> return $ Left err
 		Yield x _ -> return $ Right x
 		Continue _ -> error "run: divergent iteratee"
+run_ :: Monad m => Iteratee a m b -> m b
+run_ i = run i >>= either E.throw return
 -- | Print chunks as they're received from the enumerator, optionally
 -- printing empty chunks.
 printChunks :: (MIO.MonadIO m, Show a) => Bool -> Iteratee a m ()
diff --git a/hs/Data/Enumerator/IO.hs b/hs/Data/Enumerator/IO.hs
--- a/hs/Data/Enumerator/IO.hs
+++ b/hs/Data/Enumerator/IO.hs
@@ -17,6 +17,7 @@
 	) where
 import Data.Enumerator
 import Data.Enumerator.Util
+import Control.Monad.IO.Class (MonadIO)
 import qualified Control.Exception as E
 import qualified Data.ByteString as B
 import qualified System.IO as IO
@@ -32,9 +33,10 @@
 --
 -- The handle should be opened with no encoding, and in 'IO.ReadMode' or
 -- 'IO.ReadWriteMode'.
-enumHandle :: Integer -- ^ Buffer size
+enumHandle :: MonadIO m
+           => Integer -- ^ Buffer size
            -> IO.Handle
-           -> Enumerator B.ByteString IO b
+           -> Enumerator B.ByteString m b
 enumHandle bufferSize h = Iteratee . loop where
 	loop (Continue k) = withBytes $ \bytes -> if B.null bytes
 		then return $ Continue k
@@ -66,7 +68,7 @@
 --
 -- The handle should be opened with no encoding, and in 'IO.WriteMode' or
 -- 'IO.ReadWriteMode'.
-iterHandle :: IO.Handle -> Iteratee B.ByteString IO ()
+iterHandle :: MonadIO m => IO.Handle -> Iteratee B.ByteString m ()
 iterHandle h = continue step where
 	step EOF = yield () EOF
 	step (Chunks []) = continue step
diff --git a/hs/Data/Enumerator/Text.hs b/hs/Data/Enumerator/Text.hs
--- a/hs/Data/Enumerator/Text.hs
+++ b/hs/Data/Enumerator/Text.hs
@@ -27,6 +27,7 @@
 	, ascii
 	, iso8859_1
 	) where
+import Control.Monad.IO.Class (MonadIO)
 import qualified Control.Exception as E
 import qualified Data.Text as T
 import qualified Data.Text.IO as T
@@ -52,7 +53,7 @@
 --
 -- The handle should be opened with an appropriate text encoding, and
 -- in 'IO.ReadMode' or 'IO.ReadWriteMode'.
-enumHandle :: IO.Handle -> Enumerator T.Text IO b
+enumHandle :: MonadIO m => IO.Handle -> Enumerator T.Text m b
 enumHandle h = Iteratee . loop where
 	loop (Continue k) = withText $ \maybeText -> case maybeText of
 		Nothing -> return $ Continue k
@@ -78,7 +79,7 @@
 --
 -- The handle should be opened with an appropriate text encoding, and
 -- in 'IO.WriteMode' or 'IO.ReadWriteMode'.
-iterHandle :: IO.Handle -> Iteratee T.Text IO ()
+iterHandle :: MonadIO m => IO.Handle -> Iteratee T.Text m ()
 iterHandle h = continue step where
 	step EOF = yield () EOF
 	step (Chunks []) = continue step
diff --git a/hs/Data/Enumerator/Util.hs b/hs/Data/Enumerator/Util.hs
--- a/hs/Data/Enumerator/Util.hs
+++ b/hs/Data/Enumerator/Util.hs
@@ -1,10 +1,11 @@
 module Data.Enumerator.Util where
 import Data.Enumerator
+import Control.Monad.IO.Class (MonadIO, liftIO)
 import qualified Control.Exception as E
 
-tryStep :: IO t -> (t -> IO (Step a IO b)) -> IO (Step a IO b)
+tryStep :: MonadIO m => IO t -> (t -> m (Step a m b)) -> m (Step a m b)
 tryStep get io = do
-	tried <- E.try get
+	tried <- liftIO (E.try get)
 	case tried of
 		Right t -> io t
 		Left err -> return $ Error err
