diff --git a/bench/benchmark.hs b/bench/benchmark.hs
new file mode 100644
--- /dev/null
+++ b/bench/benchmark.hs
@@ -0,0 +1,14 @@
+module Main (main) where
+
+import           Criterion.Main            (bgroup, defaultMain)
+import           Test.QuickCheck.Random    (mkQCGen)
+
+import qualified Data.MessagePack.IntBench
+import qualified Data.MessagePackBench
+
+
+main :: IO ()
+main = defaultMain
+  [ bgroup "Data.MessagePack" Data.MessagePackBench.suite
+  , bgroup "Data.MessagePack.Int" Data.MessagePack.IntBench.suite
+  ]
diff --git a/data-msgpack.cabal b/data-msgpack.cabal
--- a/data-msgpack.cabal
+++ b/data-msgpack.cabal
@@ -1,5 +1,5 @@
 name:                 data-msgpack
-version:              0.0.4
+version:              0.0.5
 synopsis:             A Haskell implementation of MessagePack
 homepage:             http://msgpack.org/
 license:              BSD3
@@ -26,12 +26,16 @@
   default-language: Haskell2010
   hs-source-dirs:
       src
+  ghc-options:
+      -Wall
+      -fno-warn-unused-imports
   exposed-modules:
       Data.MessagePack
       Data.MessagePack.Assoc
       Data.MessagePack.Class
       Data.MessagePack.Generic
       Data.MessagePack.Get
+      Data.MessagePack.Instances
       Data.MessagePack.Object
       Data.MessagePack.Put
       Data.MessagePack.Result
@@ -46,6 +50,7 @@
     , hashable
     , text
     , unordered-containers
+    , void
 
 executable msgpack-parser
   default-language: Haskell2010
@@ -66,6 +71,9 @@
   default-language: Haskell2010
   hs-source-dirs: test
   main-is: testsuite.hs
+  ghc-options:
+      -Wall
+      -fno-warn-unused-imports
   build-depends:
       base < 5
     , QuickCheck
@@ -76,3 +84,20 @@
     , hspec
     , text
     , unordered-containers
+    , void
+
+benchmark benchmark
+  type: exitcode-stdio-1.0
+  default-language: Haskell2010
+  hs-source-dirs: bench
+  main-is: benchmark.hs
+  ghc-options:
+      -Wall
+      -fno-warn-unused-imports
+  build-depends:
+      base < 5
+    , QuickCheck
+    , bytestring
+    , criterion
+    , data-msgpack
+    , deepseq
diff --git a/src/Data/MessagePack.hs b/src/Data/MessagePack.hs
--- a/src/Data/MessagePack.hs
+++ b/src/Data/MessagePack.hs
@@ -23,17 +23,18 @@
   , module X
   ) where
 
-import           Control.Applicative      (Applicative)
-import           Control.Monad            ((>=>))
-import           Data.Binary              (decodeOrFail, encode)
-import qualified Data.ByteString.Lazy     as L
+import           Control.Applicative        (Applicative)
+import           Control.Monad              ((>=>))
+import           Data.Binary                (decodeOrFail, encode)
+import qualified Data.ByteString.Lazy       as L
 
-import           Data.MessagePack.Assoc   as X
-import           Data.MessagePack.Class   as X
-import           Data.MessagePack.Generic ()
-import           Data.MessagePack.Get     as X
-import           Data.MessagePack.Object  as X
-import           Data.MessagePack.Put     as X
+import           Data.MessagePack.Assoc     as X
+import           Data.MessagePack.Class     as X
+import           Data.MessagePack.Generic   ()
+import           Data.MessagePack.Get       as X
+import           Data.MessagePack.Instances as X
+import           Data.MessagePack.Object    as X
+import           Data.MessagePack.Put       as X
 
 
 -- | Pack a Haskell value to MessagePack binary.
diff --git a/src/Data/MessagePack/Class.hs b/src/Data/MessagePack/Class.hs
--- a/src/Data/MessagePack/Class.hs
+++ b/src/Data/MessagePack/Class.hs
@@ -140,18 +140,6 @@
   fromObject obj = T.unpack <$> fromObject obj
 
 
--- Instances for nullable types.
-
-instance MessagePack a => MessagePack (Maybe a) where
-  toObject = \case
-    Just a  -> toObject a
-    Nothing -> ObjectNil
-
-  fromObject = \case
-    ObjectNil -> return Nothing
-    obj       -> Just <$> fromObject obj
-
-
 -- Instances for binary and UTF-8 encoded string.
 
 instance MessagePack S.ByteString where
diff --git a/src/Data/MessagePack/Generic.hs b/src/Data/MessagePack/Generic.hs
--- a/src/Data/MessagePack/Generic.hs
+++ b/src/Data/MessagePack/Generic.hs
@@ -18,6 +18,9 @@
 import           Data.MessagePack.Class
 import           Data.MessagePack.Object (Object (..))
 
+instance GMessagePack V1 where
+  gToObject = undefined
+  gFromObject = fail "can't instantiate void type"
 
 instance GMessagePack U1 where
   gToObject U1 = ObjectNil
diff --git a/src/Data/MessagePack/Instances.hs b/src/Data/MessagePack/Instances.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/MessagePack/Instances.hs
@@ -0,0 +1,14 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+module Data.MessagePack.Instances () where
+
+import           Data.Void                (Void)
+
+import           Data.MessagePack.Class   (MessagePack)
+import           Data.MessagePack.Generic ()
+
+
+instance MessagePack a => MessagePack (Maybe a)
+
+instance (MessagePack a, MessagePack b) => MessagePack (Either a b)
+
+instance MessagePack Void
diff --git a/src/Data/MessagePack/Put.hs b/src/Data/MessagePack/Put.hs
--- a/src/Data/MessagePack/Put.hs
+++ b/src/Data/MessagePack/Put.hs
@@ -48,21 +48,21 @@
 
 putInt :: Int64 -> Put
 putInt n
-  | -32 <= n && n <= 127 =
+  | -0x20 <= n && n < 0x80 =
                      putWord8     (fromIntegral n)
-  | 0 <= n && n < 0x100 =
+  | 0     <= n && n < 0x100 =
     putWord8 0xCC >> putWord8     (fromIntegral n)
-  | 0 <= n && n < 0x10000 =
+  | 0     <= n && n < 0x10000 =
     putWord8 0xCD >> putWord16be  (fromIntegral n)
-  | 0 <= n && n < 0x100000000 =
+  | 0     <= n && n < 0x100000000 =
     putWord8 0xCE >> putWord32be  (fromIntegral n)
-  | 0 <= n =
+  | 0     <= n =
     putWord8 0xCF >> putWord64be  (fromIntegral n)
   | -0x80 <= n =
     putWord8 0xD0 >> putWord8     (fromIntegral n)
   | -0x8000 <= n =
     putWord8 0xD1 >> putWord16be  (fromIntegral n)
-  | -0x80000000  <= n =
+  | -0x80000000 <= n =
     putWord8 0xD2 >> putWord32be  (fromIntegral n)
   | otherwise =
     putWord8 0xD3 >> putWord64be (fromIntegral n)
