diff --git a/enumerator.cabal b/enumerator.cabal
--- a/enumerator.cabal
+++ b/enumerator.cabal
@@ -1,5 +1,5 @@
 name: enumerator
-version: 0.4.6
+version: 0.4.7
 synopsis: Reliable, high-performance processing with left-fold enumerators
 license: MIT
 license-file: license.txt
diff --git a/hs/Data/Enumerator.hs b/hs/Data/Enumerator.hs
--- a/hs/Data/Enumerator.hs
+++ b/hs/Data/Enumerator.hs
@@ -123,6 +123,8 @@
 
 import qualified Control.Exception as Exc
 
+import Data.Function (fix)
+
 import Control.Monad.Trans.Class (MonadTrans, lift)
 import Control.Monad.IO.Class (MonadIO, liftIO)
 
@@ -317,9 +319,9 @@
 instance Monad m => Monad (Iteratee a m) where
 	return x = yield x (Chunks [])
 	
-	m >>= f = Iteratee $ runIteratee m >>=
+	m0 >>= f = ($ m0) $ fix $ \bind m -> Iteratee $ runIteratee m >>=
 		\r1 -> case r1 of
-			Continue k -> return (Continue ((>>= f) . k))
+			Continue k -> return (Continue (bind . k))
 			Error err -> return (Error err)
 			Yield x (Chunks []) -> runIteratee (f x)
 			Yield x extra -> runIteratee (f x) >>=
diff --git a/src/types.anansi b/src/types.anansi
--- a/src/types.anansi
+++ b/src/types.anansi
@@ -285,13 +285,17 @@
 be applied to arbitrary input streams. Iteratees are also applicative
 functors and monad transformers.
 
+:d Data.Enumerator imports
+import Data.Function (fix)
+:
+
 :f Data/Enumerator.hs
 instance Monad m => Monad (Iteratee a m) where
 	return x = yield x (Chunks [])
 	
-	m >>= f = Iteratee $ runIteratee m >>=
+	m0 >>= f = ($ m0) $ fix $ \bind m -> Iteratee $ runIteratee m >>=
 		\r1 -> case r1 of
-			Continue k -> return (Continue ((>>= f) . k))
+			Continue k -> return (Continue (bind . k))
 			Error err -> return (Error err)
 			Yield x (Chunks []) -> runIteratee (f x)
 			Yield x extra -> runIteratee (f x) >>=
