diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+# 1.0.5
+
+* Add head, headDef and lastDef combinators
+
 # 1.0.4
 
 * Move into mono-traversable repo, support mono-traversable 1.0
diff --git a/Data/Conduit/Combinators.hs b/Data/Conduit/Combinators.hs
--- a/Data/Conduit/Combinators.hs
+++ b/Data/Conduit/Combinators.hs
@@ -89,10 +89,13 @@
     , sinkLazyBuilder
     , sinkNull
     , awaitNonNull
+    , head
+    , headDef
     , headE
     , peek
     , peekE
     , last
+    , lastDef
     , lastE
     , length
     , lengthE
@@ -212,7 +215,7 @@
 import           Data.Conduit.Internal       (ConduitM (..), Pipe (..))
 import qualified Data.Conduit.List           as CL
 import           Data.IOData
-import           Data.Maybe                  (isNothing, isJust)
+import           Data.Maybe                  (fromMaybe, isNothing, isJust)
 import           Data.Monoid                 (Monoid (..))
 import           Data.MonoTraversable
 import qualified Data.Sequences              as Seq
@@ -1029,6 +1032,18 @@
     go' = maybe go (return . Just) . NonNull.fromNullable
 {-# INLINE awaitNonNull #-}
 
+-- | Take a single value from the stream, if available.
+--
+-- Since 1.0.5
+head :: Monad m => Consumer a m (Maybe a)
+head = CL.head
+
+-- | Same as 'head', but returns a default value if none are available from the stream.
+--
+-- Since 1.0.5
+headDef :: Monad m => a -> Consumer a m a
+headDef a = fromMaybe a <$> head
+
 -- | Get the next element in the chunked stream.
 --
 -- Since 1.0.0
@@ -1079,6 +1094,12 @@
   where
     loop prev = await >>= maybe (return $ Just prev) loop
 STREAMING0(last, lastC, lastS)
+
+-- | Same as 'last', but returns a default value if none are available from the stream.
+--
+-- Since 1.0.5
+lastDef :: Monad m => a -> Consumer a m a
+lastDef a = fromMaybe a <$> last
 
 -- | Retrieve the last element in the chunked stream, if present.
 --
diff --git a/Data/Conduit/Combinators/Unqualified.hs b/Data/Conduit/Combinators/Unqualified.hs
--- a/Data/Conduit/Combinators/Unqualified.hs
+++ b/Data/Conduit/Combinators/Unqualified.hs
@@ -75,10 +75,13 @@
     , sinkLazyBuilder
     , sinkNull
     , awaitNonNull
+    , headC
+    , headDefC
     , headCE
     , peekC
     , peekCE
     , lastC
+    , lastDefC
     , lastCE
     , lengthC
     , lengthCE
@@ -183,6 +186,8 @@
 import qualified Data.Traversable
 #if ! MIN_VERSION_base(4,8,0)
 import           Control.Applicative         ((<$>))
+#else
+import           Prelude                     ((<$>))
 #endif
 import           Control.Monad.Base          (MonadBase (..))
 import           Control.Monad.IO.Class      (MonadIO (..))
@@ -191,6 +196,7 @@
 import           Data.Conduit
 import qualified Data.Conduit.List           as CL
 import           Data.IOData
+import           Data.Maybe                  (fromMaybe)
 import           Data.Monoid                 (Monoid (..))
 import           Data.MonoTraversable
 import qualified Data.Sequences              as Seq
@@ -777,6 +783,18 @@
 awaitNonNull = CC.awaitNonNull
 {-# INLINE awaitNonNull #-}
 
+-- | Take a single value from the stream, if available.
+--
+-- Since 1.0.5
+headC :: Monad m => Consumer a m (Maybe a)
+headC = CC.head
+
+-- | Same as 'headC', but returns a default value if none are available from the stream.
+--
+-- Since 1.0.5
+headDefC :: Monad m => a -> Consumer a m a
+headDefC = CC.headDef
+
 -- | Get the next element in the chunked stream.
 --
 -- Since 1.0.0
@@ -804,6 +822,12 @@
 lastC :: Monad m => Consumer a m (Maybe a)
 lastC = CC.last
 {-# INLINE lastC #-}
+
+-- | Same as 'lastC', but returns a default value if none are available from the stream.
+--
+-- Since 1.0.5
+lastDefC :: Monad m => a -> Consumer a m a
+lastDefC = CC.lastDef
 
 -- | Retrieve the last element in the chunked stream, if present.
 --
diff --git a/conduit-combinators.cabal b/conduit-combinators.cabal
--- a/conduit-combinators.cabal
+++ b/conduit-combinators.cabal
@@ -1,5 +1,5 @@
 name:                conduit-combinators
-version:             1.0.4
+version:             1.0.5
 synopsis:            Commonly used conduit functions, for both chunked and unchunked data
 description:         Provides a replacement for Data.Conduit.List, as well as a convenient Conduit module.
 homepage:            https://github.com/snoyberg/mono-traversable
