diff --git a/Data/Conduit/ImageSize.hs b/Data/Conduit/ImageSize.hs
--- a/Data/Conduit/ImageSize.hs
+++ b/Data/Conduit/ImageSize.hs
@@ -2,6 +2,8 @@
 module Data.Conduit.ImageSize
     ( sinkImageSize
     , Size (..)
+    , sinkImageInfo
+    , FileFormat (..)
     ) where
 
 import qualified Data.ByteString.Lazy as L
@@ -15,23 +17,33 @@
 data Size = Size { width :: Int, height :: Int }
     deriving (Show, Eq, Ord, Read)
 
-sinkImageSize :: C.Resource m => C.Sink S.ByteString m (Maybe Size)
-sinkImageSize =
-    C.SinkData (pushHeader id) close
+data FileFormat = GIF | PNG | JPG
+    deriving (Show, Eq, Ord, Read, Enum)
+
+-- | Specialized version of 'sinkImageInfo' that returns only the
+-- image size.
+sinkImageSize :: Monad m => C.Sink S.ByteString m (Maybe Size)
+sinkImageSize = fmap (fmap fst) sinkImageInfo
+
+-- | Find out the size of an image.  Also returns the file format
+-- that parsed correctly.  Note that this function does not
+-- verify that the file is indeed in the format that it returns,
+-- since it looks only at a small part of the header.
+sinkImageInfo :: Monad m => C.Sink S.ByteString m (Maybe (Size, FileFormat))
+sinkImageInfo =
+    C.Processing (pushHeader id) close
   where
     close = return Nothing
     pushHeader front bs'
         | S.length bs >= 11 && S.take 5 (S.drop 6 bs) ==
             S.pack [0x4A, 0x46, 0x49, 0x46, 0x00] =
-                C.sinkPush jpg $ S.drop 4 bs
+                sinkPush jpg $ S.drop 4 bs
         | S.length bs >= 6 && S.take 6 bs `elem` gifs =
-            C.sinkPush gif $ S.drop 6 bs
+            sinkPush gif $ S.drop 6 bs
         | S.length bs >= 8 && S.take 8 bs == S.pack [137, 80, 78, 71, 13, 10, 26, 10] =
-            C.sinkPush png $ S.drop 8 bs
-        | S.length bs < 11 = do
-            return $ C.Processing (pushHeader $ S.append bs) close
-        | otherwise = do
-            return $ C.Done (Just bs) Nothing
+            sinkPush png $ S.drop 8 bs
+        | S.length bs < 11 = C.Processing (pushHeader $ S.append bs) close
+        | otherwise = C.Done (Just bs) Nothing
       where
         bs = front bs'
 
@@ -40,7 +52,7 @@
         b <- CB.take 4
         let go x y = fromIntegral x + (fromIntegral y) * 256
         return $ case L.unpack b of
-            [w1, w2, h1, h2] -> Just $ Size (go w1 w2) (go h1 h2)
+            [w1, w2, h1, h2] -> Just (Size (go w1 w2) (go h1 h2), GIF)
             _ -> Nothing
 
     png = do
@@ -50,9 +62,11 @@
             then do
                 mw <- getInt 4 0
                 mh <- getInt 4 0
-                return $ Size <$> mw <*> mh
+                return $ (\w h -> (Size w h, PNG)) <$> mw <*> mh
             else return Nothing
 
+    sinkPush (C.Processing push _) x = push x
+    sinkPush _ _ = error "Data.Conduit.ImageSize.sinkPush"
 
     jpg = do
         mi <- getInt 2 0
@@ -69,15 +83,15 @@
                 my <- CB.head
                 case my of
                     Just 0xC0 -> do
-                        _ <- CB.take 3
-                        h <- getInt 2 0
-                        w <- getInt 2 0
-                        return $ Size <$> w <*> h
+                        _  <- CB.take 3
+                        mh <- getInt 2 0
+                        mw <- getInt 2 0
+                        return $ (\w h -> (Size w h, JPG)) <$> mw <*> mh
                     Just _ -> jpg
                     Nothing -> return Nothing
             _ -> return Nothing
 
-getInt :: (C.Resource m, Integral i)
+getInt :: (Monad m, Integral i)
        => Int
        -> i
        -> C.Sink S.ByteString m (Maybe i)
diff --git a/imagesize-conduit.cabal b/imagesize-conduit.cabal
--- a/imagesize-conduit.cabal
+++ b/imagesize-conduit.cabal
@@ -1,5 +1,5 @@
 Name:                imagesize-conduit
-Version:             0.2.0
+Version:             0.3.0
 Synopsis:            Determine the size of some common image formats.
 Description:         Currently supports PNG, GIF, and JPEG. This package provides a Sink that will consume the minimum number of bytes necessary to determine the image dimensions.
 License:             BSD3
@@ -18,7 +18,7 @@
 Library
   Exposed-modules:     Data.Conduit.ImageSize
   Build-depends:       base                     >= 4            && < 5
-                     , conduit                  >= 0.2          && < 0.3
+                     , conduit                  >= 0.3          && < 0.4
                      , bytestring               >= 0.9
   ghc-options:     -Wall
 
