diff --git a/iteratee.cabal b/iteratee.cabal
--- a/iteratee.cabal
+++ b/iteratee.cabal
@@ -1,5 +1,5 @@
 name:          iteratee
-version:       0.8.1.1
+version:       0.8.1.2
 synopsis:      Iteratee-based I/O
 description:
   The Iteratee monad provides strict, safe, and functional I/O. In addition
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
@@ -155,7 +155,9 @@
   step l (Chunk xs)
     | nullC xs     = liftI (step l)
     | otherwise    = liftI $ step (Just $ LL.last xs)
-  step l s@(EOF _) = maybe (icont (step l) . Just . setEOF $ s) return l
+  step l s@(EOF _) = case l of
+    Nothing -> icont (step l) . Just . setEOF $ s
+    Just x  -> idone x s
 {-# INLINE last #-}
 
 
diff --git a/tests/foo.hs b/tests/foo.hs
--- a/tests/foo.hs
+++ b/tests/foo.hs
@@ -1,20 +1,11 @@
-import Data.ByteString (ByteString)
-import Data.Iteratee as I
-import Data.Iteratee.Char
-import System
-
-main = do
-        args <- getArgs
-        let fname     = args !! 0
-        let blockSize = read $ args !! 1
-
-        fileDriver (leak blockSize) fname >>= print
+import Control.Monad.Trans (liftIO)
+import Data.Iteratee.Iteratee
+import qualified Data.Iteratee.ListLike as I
 
-leak :: Int -> Iteratee ByteString IO ()
-leak blockSize = chunkedRead
-    where
-        consChunk :: Iteratee ByteString IO String
-        consChunk = (joinI $ I.take blockSize I.length) >>= return . show
+main = enumPure1Chunk [1..10] myIter >>= run
 
-        chunkedRead :: Iteratee ByteString IO ()
-        chunkedRead = joinI $ convStream consChunk printLinesUnterminated
+myIter :: Iteratee [Int] IO ()
+myIter = do
+   I.last
+   x <- I.peek
+   liftIO $ print x
diff --git a/tests/testIteratee.hs b/tests/testIteratee.hs
--- a/tests/testIteratee.hs
+++ b/tests/testIteratee.hs
@@ -124,6 +124,14 @@
 prop_skip xs = runner1 (enumPure1Chunk xs (skipToEof >> stream2list)) == []
   where types = xs :: [Int]
 
+prop_last1 xs = P.length xs > 0 ==>
+ runner1 (enumPure1Chunk xs (Iter.last)) == P.last xs
+  where types = xs :: [Int]
+
+prop_last2 xs = P.length xs > 0 ==>
+ runner1 (enumPure1Chunk xs (Iter.last >> Iter.peek)) == Nothing
+  where types = xs :: [Int]
+
 -- ---------------------------------------------
 -- Simple enumerator tests
 
@@ -274,6 +282,8 @@
     ,testProperty "null heads" prop_heads2
     ,testProperty "peek" prop_peek
     ,testProperty "peek2" prop_peek2
+    ,testProperty "last" prop_last1
+    ,testProperty "last ends properly" prop_last2
     ,testProperty "skipToEof" prop_skip
     ,testProperty "iteratee Functor 1" prop_iterFmap
     ,testProperty "iteratee Functor 2" prop_iterFmap2
