diff --git a/Data/Digest/Pure/MD5.hs b/Data/Digest/Pure/MD5.hs
--- a/Data/Digest/Pure/MD5.hs
+++ b/Data/Digest/Pure/MD5.hs
@@ -46,6 +46,9 @@
 import Data.Binary
 import Data.Binary.Get
 import Data.Binary.Put
+import qualified Data.Serialize.Get as G
+import qualified Data.Serialize.Put as P
+import qualified Data.Serialize as S
 import Numeric
 
 -- | Block size in bits
@@ -119,10 +122,7 @@
 -- context across calls to applyMD5Rounds.
 performMD5Update :: MD5Context -> ByteString -> MD5Context
 performMD5Update !ctx@(MD5Ctx !par@(MD5Par !a !b !c !d) _ !len) !bs = {-# SCC "performMD5Update" #-}
-        let MD5Par a' b' c' d' = {- if isAligned bs
-                                    then applyMD5Rounds par bs getAlignedNthWord
-                                    else applyMD5Rounds par bs getUnalignedNthWord -}
-                                    applyMD5Rounds par bs
+        let MD5Par a' b' c' d' = applyMD5Rounds par bs
         in MD5Ctx {
                         mdPartial = MD5Par (a' + a) (b' + b) (c' + c) (d' + d),
                         mdLeftOver = B.empty,
@@ -236,10 +236,12 @@
         {-# INLINE (!!) #-}
 {-# INLINE applyMD5Rounds #-}
 
-getNthWord n bs@(PS ptr off len) =
-        inlinePerformIO $ withForeignPtr ptr $ \ptr' -> do
-        let p = castPtr $ plusPtr ptr' off
-        peekElemOff p n
+getNthWord :: Int -> B.ByteString -> Word32
+getNthWord n = right . G.runGet (do
+                G.uncheckedSkip (n * sizeOf (undefined :: Word32))
+                G.getWord32le)
+  where
+  right x = case x of Right y -> y
 {-# INLINE getNthWord #-}
 
 infix 9 .<.
@@ -251,12 +253,6 @@
 instance Show MD5Digest where
     show (MD5Digest h) = show h
 
-instance Binary MD5Digest where
-    put (MD5Digest p) = put p
-    get = do
-        p <- get
-        return $ MD5Digest p
-
 instance Show MD5Partial where
   show (MD5Par a b c d) = 
     let bs = runPut $ putWord32be d >> putWord32be c >> putWord32be b >> putWord32be a
@@ -265,6 +261,12 @@
                                  then '0':c
                                 else c) "" (L.unpack bs)
 
+instance Binary MD5Digest where
+    put (MD5Digest p) = put p
+    get = do
+        p <- get
+        return $ MD5Digest p
+
 instance Binary MD5Context where
         put (MD5Ctx p r l) = put p >> putWord8 (fromIntegral (B.length r)) >> 
                              putByteString r >> putWord64be l
@@ -281,3 +283,26 @@
                  c <- getWord32le
                  d <- getWord32le
                  return $ MD5Par a b c d
+
+instance S.Serialize MD5Digest where
+    put (MD5Digest p) = S.put p
+    get = do
+        p <- S.get
+        return $ MD5Digest p
+
+instance S.Serialize MD5Context where
+        put (MD5Ctx p r l) = S.put p >> P.putWord8 (fromIntegral (B.length r)) >>
+                             P.putByteString r >> P.putWord64be l
+        get = do p <- S.get
+                 s <- G.getWord8
+                 r <- G.getByteString (fromIntegral s)
+                 l <- G.getWord64be
+                 return $ MD5Ctx p r l
+
+instance S.Serialize MD5Partial where
+	put (MD5Par a b c d) = P.putWord32le a >> P.putWord32le b >> P.putWord32le c >> P.putWord32le d
+	get = do a <- G.getWord32le
+		 b <- G.getWord32le
+		 c <- G.getWord32le
+		 d <- G.getWord32le
+		 return $ MD5Par a b c d
diff --git a/pureMD5.cabal b/pureMD5.cabal
--- a/pureMD5.cabal
+++ b/pureMD5.cabal
@@ -1,5 +1,5 @@
 name:		pureMD5
-version:	1.0.0.3
+version:	1.1.0.0
 license:	BSD3
 license-file:	LICENSE
 author:		Thomas DuBuisson <thomas.dubuisson@gmail.com>
@@ -9,15 +9,12 @@
 category:	Data, Cryptography
 stability:	stable
 build-type:	Simple
-cabal-version:	>= 1.2
+cabal-version:	>= 1.6
 tested-with:	GHC == 6.10.1
 extra-source-files: Test/MD5.hs Test/md5test.hs
 
-Flag small_base
-  Description: Choose the split-up base package.
-
 Library
-  Build-Depends: base >= 3 && < 5, bytestring >= 0.9 && < 0.10, binary >= 0.4.0 && < 0.6.0
+  Build-Depends: base == 4.*, bytestring >= 0.9 && < 0.10, binary >= 0.4.0 && < 0.6.0, cereal >= 0.2
+  ghc-options:	-O2 -funfolding-use-threshold66 -funfolding-creation-threshold66 -fexcess-precision -funbox-strict-fields
   hs-source-dirs:
   exposed-modules: Data.Digest.Pure.MD5
-  ghc-options:	-O2 -funfolding-use-threshold66 -funfolding-creation-threshold66 -fexcess-precision -funbox-strict-fields
