diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,9 +1,19 @@
+0.3.0.1 (2016-07-12)
+====================
+
+-   Compile on 32-bit systems.
+
 0.3.0.0 (2016-06-02)
 ====================
 
 -   Add support for the Thrift Compact Protocol (#2).
 -   Add support for returning the leftover ByteString when parsing Thrift
     payloads (#3).
+
+0.2.0.2 (2016-07-12)
+====================
+
+-   Compile on 32-bit systems.
 
 0.2.0.1 (2016-05-23)
 ====================
diff --git a/bench/pinch-bench/Bench.hs b/bench/pinch-bench/Bench.hs
--- a/bench/pinch-bench/Bench.hs
+++ b/bench/pinch-bench/Bench.hs
@@ -152,38 +152,57 @@
 main :: IO ()
 main = defaultMain
     [ bgroup "A"
-        [ env (generate :: IO A) $ \a -> bench "encode" $ whnf encode a
-        , env generateEncodedA $ \bs -> bench "decode" $
-            nf (P.decode P.binaryProtocol :: ByteString -> Either String A) bs
+        [ env (generate :: IO A) $ \a -> bgroup "encode"
+            [ bench "binary"  $ whnf (P.encode P.binaryProtocol) a
+            , bench "compact" $ whnf (P.encode P.compactProtocol) a
+            ]
+        , bgroup "decode"
+            [ env (generateEncodedA P.binaryProtocol) $ \bs -> bench "binary" $
+                nf (P.decode P.binaryProtocol :: ByteString -> Either String A) bs
+            , env (generateEncodedA P.compactProtocol) $ \bs -> bench "compact" $
+                nf (P.decode P.compactProtocol :: ByteString -> Either String A) bs
+            ]
         ]
     , bgroup "NestedMixed"
-        [ env generateNestedMixedFields $ \ ~(f1, f2, f3) -> bench "encode" $
-            whnf encode (NestedMixed f1 f2 f3)
-        , env generateEncodedNestedMixed $ \bs -> bench "decode" $
-            nf (P.decode P.binaryProtocol :: ByteString -> Either String NestedMixed) bs
+        [ env generateNestedMixedFields $ \ ~(f1, f2, f3) -> bgroup "encode"
+            [ bench "binary" $
+                whnf (P.encode P.binaryProtocol) (NestedMixed f1 f2 f3)
+            , bench "compact" $
+                whnf (P.encode P.compactProtocol) (NestedMixed f1 f2 f3)
+            ]
+        , bgroup "decode"
+            [ env (generateEncodedNestedMixed P.binaryProtocol) $ \bs -> bench "binary" $
+                nf (P.decode P.binaryProtocol :: ByteString -> Either String NestedMixed) bs
+            , env (generateEncodedNestedMixed P.compactProtocol) $ \bs -> bench "compact" $
+                nf (P.decode P.compactProtocol :: ByteString -> Either String NestedMixed) bs
+            ]
+
         ]
     , bgroup "Struct"
-        [ env structFields $ \ ~(f1, f2, f3) -> bench "encode" $
-            whnf encode (Struct f1 f2 f3)
-        , env generateEncodedStruct $ \bs -> bench "deode" $
-            nf (P.decode P.binaryProtocol :: ByteString -> Either String Struct) bs
+        [ env structFields $ \ ~(f1, f2, f3) -> bgroup "encode"
+            [ bench "binary" $ whnf (P.encode P.binaryProtocol) (Struct f1 f2 f3)
+            , bench "compact" $ whnf (P.encode P.compactProtocol) (Struct f1 f2 f3)
+            ]
+        , bgroup "decode"
+            [ env (generateEncodedStruct P.binaryProtocol) $ \bs -> bench "binary" $
+                nf (P.decode P.binaryProtocol :: ByteString -> Either String Struct) bs
+            , env (generateEncodedStruct P.compactProtocol) $ \bs -> bench "compact" $
+                nf (P.decode P.compactProtocol :: ByteString -> Either String Struct) bs
+            ]
         ]
     ]
   where
-    generateEncodedNestedMixed = bracket_ stopProfTimer startProfTimer $ do
+    generateEncodedNestedMixed proto = bracket_ stopProfTimer startProfTimer $ do
         (f1, f2, f3) <- generateNestedMixedFields
-        return $ P.encode P.binaryProtocol (NestedMixed f1 f2 f3)
+        return $ P.encode proto (NestedMixed f1 f2 f3)
 
-    generateEncodedA = bracket_ stopProfTimer startProfTimer $ do
+    generateEncodedA proto = bracket_ stopProfTimer startProfTimer $ do
         a <- generate :: IO A
-        return $ P.encode P.binaryProtocol a
+        return $ P.encode proto a
 
-    generateEncodedStruct = bracket_ stopProfTimer startProfTimer $ do
+    generateEncodedStruct proto = bracket_ stopProfTimer startProfTimer $ do
         (f1, f2, f3) <- structFields
-        return $ P.encode P.binaryProtocol (Struct f1 f2 f3)
+        return $ P.encode proto (Struct f1 f2 f3)
 
     generate :: QC.Arbitrary a => IO a
     generate = QC.generate QC.arbitrary
-
-    encode :: P.Pinchable a => a -> ByteString
-    encode = P.encode P.binaryProtocol
diff --git a/pinch.cabal b/pinch.cabal
--- a/pinch.cabal
+++ b/pinch.cabal
@@ -3,7 +3,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           pinch
-version:        0.3.0.0
+version:        0.3.0.1
 cabal-version:  >= 1.10
 build-type:     Simple
 license:        BSD3
diff --git a/src/Pinch/Internal/Bits.hs b/src/Pinch/Internal/Bits.hs
--- a/src/Pinch/Internal/Bits.hs
+++ b/src/Pinch/Internal/Bits.hs
@@ -18,7 +18,7 @@
 
 #if defined(__GLASGOW_HASKELL__) && !defined(__HADDOCK__)
 import GHC.Base (Int (..), uncheckedShiftL#)
-import GHC.Word (Word16 (..), Word32 (..), Word64 (..))
+import GHC.Word (Word16 (..), Word32 (..), Word64 (..), uncheckedShiftL64#)
 #else
 import Data.Bits (shiftL)
 import Data.Word (Word16, Word32, Word64)
@@ -38,7 +38,7 @@
 #if defined(__GLASGOW_HASKELL__) && !defined(__HADDOCK__)
 w16ShiftL (W16# w) (I# i) = W16# (w `uncheckedShiftL#` i)
 w32ShiftL (W32# w) (I# i) = W32# (w `uncheckedShiftL#` i)
-w64ShiftL (W64# w) (I# i) = W64# (w `uncheckedShiftL#` i)
+w64ShiftL (W64# w) (I# i) = W64# (w `uncheckedShiftL64#` i)
 #else
 w16ShiftL = shiftL
 w32ShiftL = shiftL
