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
@@ -110,7 +110,8 @@
              in blockAndDo newCtx rest
         else ctx { mdLeftOver = blk }
   where
-  blk = B.concat $ L.toChunks top
+  blk = if isAligned blk' then blk' else B.copy blk'
+  blk' = B.concat $ L.toChunks top
   (top,rest) = L.splitAt blockSizeBytesI64 bs
 {-# INLINE blockAndDo #-}
 
@@ -118,20 +119,21 @@
 -- 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
+        let MD5Par a' b' c' d' = {- if isAligned bs
                                     then applyMD5Rounds par bs getAlignedNthWord
-                                    else applyMD5Rounds par bs getUnalignedNthWord
+                                    else applyMD5Rounds par bs getUnalignedNthWord -}
+                                    applyMD5Rounds par bs
         in MD5Ctx {
                         mdPartial = MD5Par (a' + a) (b' + b) (c' + c) (d' + d),
                         mdLeftOver = B.empty,
                         mdTotalLen = len + blockSizeBits
                         }
-  where
-  isAligned (PS _ off _) = off `rem` 4 == 0
 {-# INLINE performMD5Update #-}
 
-applyMD5Rounds :: MD5Partial -> ByteString -> (Int -> ByteString -> Word32) -> MD5Partial
-applyMD5Rounds par@(MD5Par a b c d) w getNthWord = {-# SCC "applyMD5Rounds" #-}
+isAligned (PS _ off _) = off `rem` 4 == 0
+
+applyMD5Rounds :: MD5Partial -> ByteString -> MD5Partial
+applyMD5Rounds par@(MD5Par a b c d) w = {-# SCC "applyMD5Rounds" #-}
         let -- Round 1
             !r0  = ff  a  b  c  d   (w!!0)  7  3614090360
             !r1  = ff  d r0  b  c   (w!!1)  12 3905402710
@@ -234,24 +236,11 @@
         {-# INLINE (!!) #-}
 {-# INLINE applyMD5Rounds #-}
 
--- getAlignedNthWord :: Word32 -> ByteString -> Word32
-getAlignedNthWord n bs@(PS ptr off len) =
+getNthWord n bs@(PS ptr off len) =
         inlinePerformIO $ withForeignPtr ptr $ \ptr' -> do
         let p = castPtr $ plusPtr ptr' off
         peekElemOff p n
-{-# INLINE getAlignedNthWord #-}
-
--- getUnalignedNthWord :: Word32 -> ByteString -> Word32
-getUnalignedNthWord n bs@(PS ptr off len) =
-        inlinePerformIO $ withForeignPtr ptr $ \ptr' -> do
-        let p = castPtr $ plusPtr ptr' (off + n*4) :: Ptr Word8
-        w1 <- peekElemOff p 0
-        w2 <- peekElemOff p 1
-        w3 <- peekElemOff p 2
-        w4 <- peekElemOff p 3
-        let y = (w4 .<. 24 .|. w3 .<. 16 .|. w2 .<.8 .|. fromIntegral w1)
-        return y
-{-# INLINE getUnalignedNthWord #-}
+{-# INLINE getNthWord #-}
 
 infix 9 .<.
 (.<.) :: Word8 -> Int -> Word32
diff --git a/pureMD5.cabal b/pureMD5.cabal
--- a/pureMD5.cabal
+++ b/pureMD5.cabal
@@ -1,5 +1,5 @@
 name:		pureMD5
-version:	1.0.0.2
+version:	1.0.0.3
 license:	BSD3
 license-file:	LICENSE
 author:		Thomas DuBuisson <thomas.dubuisson@gmail.com>
@@ -17,10 +17,7 @@
   Description: Choose the split-up base package.
 
 Library
-  if flag(small_base)
-    Build-Depends: base >= 3 && < 5, bytestring >= 0.9 && < 0.10, binary >= 0.4.0 && < 0.5.0
-  else
-    Build-Depends: base >= 3, bytestring, binary >= 0.4.0
+  Build-Depends: base >= 3 && < 5, bytestring >= 0.9 && < 0.10, binary >= 0.4.0 && < 0.6.0
   hs-source-dirs:
   exposed-modules: Data.Digest.Pure.MD5
   ghc-options:	-O2 -funfolding-use-threshold66 -funfolding-creation-threshold66 -fexcess-precision -funbox-strict-fields
