diff --git a/netpbm.cabal b/netpbm.cabal
--- a/netpbm.cabal
+++ b/netpbm.cabal
@@ -1,5 +1,5 @@
 name:          netpbm
-version:       0.1.0
+version:       0.2.0
 license:       MIT
 copyright:     2013 Niklas Hambüchen <mail@nh2.me>
 author:        Niklas Hambüchen <mail@nh2.me>
@@ -28,6 +28,7 @@
     , attoparsec >= 0.10
     , attoparsec-binary >= 0.2
     , bytestring >= 0.10
+    , storable-record >= 0.0.2.5
     , unordered-containers >= 0.1.3.0
     , vector >= 0.7
     , vector-th-unbox >= 0.2.0.1
diff --git a/src/Graphics/Netpbm.hs b/src/Graphics/Netpbm.hs
--- a/src/Graphics/Netpbm.hs
+++ b/src/Graphics/Netpbm.hs
@@ -13,6 +13,7 @@
 , PPM (..)
 , PpmPixelRGB8
 , PpmPixelRGB16
+, PpmPixelData (..)
 , parsePPM
 , PpmParseResult
 -- TODO expose attoparsec functions in .Internal package
@@ -27,6 +28,8 @@
 import           Data.Char (ord)
 import           Data.List (foldl')
 import           Data.Word (Word8, Word16)
+import           Foreign.Storable.Record as Store
+import           Foreign.Storable (Storable (..))
 
 import qualified Data.Vector.Unboxed as U
 import qualified Data.Vector.Generic
@@ -77,6 +80,8 @@
                   | PpmPixelDataRGB16 (U.Vector PpmPixelRGB16) -- ^ For 16-bit PPMs.
 
 
+-- * Unbox instance for pixels
+
 derivingUnbox "PpmPixelRGB8"
     [t| PpmPixelRGB8 -> (Word8, Word8, Word8) |]
     [| \ (PpmPixelRGB8 a b c) -> (a, b, c) |]
@@ -88,6 +93,35 @@
     [| \ (a, b, c) -> PpmPixelRGB16 a b c |]
 
 
+-- * Storable instance for pixels
+
+storePixel8 :: Store.Dictionary PpmPixelRGB8
+storePixel8 =
+  Store.run $ liftA3 PpmPixelRGB8
+    (Store.element (\(PpmPixelRGB8 x _ _) -> x))
+    (Store.element (\(PpmPixelRGB8 _ y _) -> y))
+    (Store.element (\(PpmPixelRGB8 _ _ z) -> z))
+
+storePixel16 :: Store.Dictionary PpmPixelRGB16
+storePixel16 =
+  Store.run $ liftA3 PpmPixelRGB16
+    (Store.element (\(PpmPixelRGB16 x _ _) -> x))
+    (Store.element (\(PpmPixelRGB16 _ y _) -> y))
+    (Store.element (\(PpmPixelRGB16 _ _ z) -> z))
+
+instance Storable PpmPixelRGB8 where
+  sizeOf = Store.sizeOf storePixel8
+  alignment = Store.alignment storePixel8
+  peek = Store.peek storePixel8
+  poke = Store.poke storePixel8
+
+instance Storable PpmPixelRGB16 where
+  sizeOf = Store.sizeOf storePixel16
+  alignment = Store.alignment storePixel16
+  peek = Store.peek storePixel16
+  poke = Store.poke storePixel16
+
+
 -- | Parses a netpbm magic number.
 -- One of P1, P2, P3, P4, P5, P6.
 magicNumberParser :: Parser PPMType
@@ -195,3 +229,4 @@
     Done ""   images -> Right (images, Nothing)
     Done rest images -> Right (images, Just rest)
     Partial _        -> error "parsePPM bug: Got a partial result after end of input"
+    Fail _ _ e       -> Left e
