diff --git a/Codec/Binary/Gray/Bits.hs b/Codec/Binary/Gray/Bits.hs
--- a/Codec/Binary/Gray/Bits.hs
+++ b/Codec/Binary/Gray/Bits.hs
@@ -17,9 +17,9 @@
     , shiftL, shiftR, complement, xor, (.&.), (.|.), isSigned)
 
 import qualified Codec.Binary.Gray.List as L
-    
+
 -- | Right shift without extension of the sign bit (reset it to zero).
-shiftR' :: (Bits a) => a -> Int -> a
+shiftR' :: (Bits a, Num a) => a -> Int -> a
 shiftR' n 0    = n
 shiftR' n s
   | isSigned n && signum n == -1 =
@@ -28,17 +28,17 @@
   | otherwise  = shiftR n s
 
 -- | Convert an integer number from binary to Gray code.
--- 
+--
 -- 'gray' is undefined for negative numbers of types that do not have
 -- fixed bitsize, e.g. for negative 'Integer's.
-gray :: (Bits a) => a -> a
+gray :: (Bits a, Num a) => a -> a
 gray n = n `xor` (shiftR' n 1)
 
 -- | Convert an integer number from Gray code to binary.
--- 
+--
 -- 'binary' is undefined for types that do not have fixed bitsize,
 -- e.g. for 'Integer'.
-binary :: (Bits a) => a -> a
+binary :: (Bits a, Num a) => a -> a
 binary 0 = 0
 binary n =
   binary' mask0 n (copyMSB n)
@@ -61,5 +61,5 @@
 
 -- | Render binary code as a string of @0@s and @1@s.
 -- For example, @(42::Int8)@ is formatted as @101010@.
-showBits :: (Bits a) => a -> String
+showBits :: (Bits a, Num a) => a -> String
 showBits = L.showBits . L.toList
diff --git a/Codec/Binary/Gray/List.hs b/Codec/Binary/Gray/List.hs
--- a/Codec/Binary/Gray/List.hs
+++ b/Codec/Binary/Gray/List.hs
@@ -34,10 +34,10 @@
 
 -- | Convert a number to a list of bits in usual binary encoding (most
 -- significant bit last). Truncates unset major bits.
--- 
+--
 -- This function is undefined for negative numbers of types that do not
 -- have fixed bitsize, like 'Integer'.
-toList :: (Bits b) => b -> [Bool]
+toList :: (Bits b, Num b) => b -> [Bool]
 toList 0 = []
 toList i
   | isSigned i && signum i == (-1) =
@@ -52,11 +52,11 @@
 --
 -- Like 'toList', but returns all unset major bits too. So the length
 -- of the output is always the same length as @bitSize i@.
-toList' :: (Bits b) => b -> [Bool]
+toList' :: (Bits b, Num b) => b -> [Bool]
 toList' i = map (testBit i) [0..bitSize i - 1]
 
 -- | Convert a list of bits in binary encoding to a number.
-fromList :: (Bits b) => [Bool] -> b
+fromList :: (Bits b, Num b) => [Bool] -> b
 fromList = sum . map fst . filter snd . zip (map (2^) [0..])
 
 -- | Render a list of bits as a string of @0@s and @1@s.
diff --git a/Codec/Binary/Gray_props.hs b/Codec/Binary/Gray_props.hs
--- a/Codec/Binary/Gray_props.hs
+++ b/Codec/Binary/Gray_props.hs
@@ -45,7 +45,7 @@
   let i = (arbitrary :: Gen Int)
   in  forAll i succ_test
 
-succ_test :: (Bits a) => a -> Bool
+succ_test :: (Bits a, Num a) => a -> Bool
 succ_test = \i ->
       let n2g = L.gray . L.toList
           g1 = n2g i
@@ -78,12 +78,12 @@
 prop_bits_gray_succ_Int = label "hamming x (x+1) == 1 [Int]" $
   forAll (arbitrary :: Gen Int) $ \i ->
       (hammingBits `on` B.gray) i (i+1) == 1
-     
+
 prop_bits_gray_succ_Integer = label "hamming x (x+1) == 1 [Integer]" $
   forAll (arbitrary :: Gen (NonNegative Integer)) $ \(NonNegative i) ->
       (hammingBits `on` B.gray) i (i+1) == 1
-     
-hammingBits :: (Bits a) => a -> a -> Int
+
+hammingBits :: (Bits a, Num a) => a -> a -> Int
 hammingBits = hamming `on` L.toList
 
 ---
diff --git a/gray-code.cabal b/gray-code.cabal
--- a/gray-code.cabal
+++ b/gray-code.cabal
@@ -7,7 +7,7 @@
 -- The package version. See the Haskell package versioning policy
 -- (http://www.haskell.org/haskellwiki/Package_versioning_policy) for
 -- standards guiding when and how versions should be incremented.
-Version:             0.2.1
+Version:             0.2.2
 
 -- A short (one-line) description of the package.
 Synopsis:            Gray code encoder/decoder.
@@ -23,7 +23,7 @@
    @Bits@ is the default implementation.
 
 -- URL for the project homepage or repository.
-Homepage:            http://bitbucket.org/jetxee/hs-gray-code
+Homepage:            http://bitbucket.org/astanin/hs-gray-code
 
 -- The license under which the package is released.
 License:             BSD3
@@ -39,7 +39,7 @@
 Maintainer:          s.astanin@gmail.com
 
 -- A copyright notice.
--- Copyright:           
+-- Copyright:
 
 -- Stability of the pakcage (experimental, provisional, stable...)
 Stability:           Experimental
@@ -54,7 +54,7 @@
      Codec/Binary/Gray_props.hs
 
 -- Constraint on the version of Cabal needed to build this package.
-Cabal-version:       >=1.2
+Cabal-version:       >=1.8
 
 
 Library
@@ -67,10 +67,14 @@
   -- Packages needed in order to build this package.
   Build-depends:
      base >= 3 && < 5
-  
+
   -- Modules not exported by this package.
   -- Other-modules:
-  
+
   -- Extra tools (e.g. alex, hsc2hs, ...) needed to build the source.
-  -- Build-tools:         
-  
+  -- Build-tools:
+
+Test-Suite test-qc
+    type:       exitcode-stdio-1.0
+    main-is:    test.hs
+    build-depends: base, QuickCheck >= 2
diff --git a/test.hs b/test.hs
new file mode 100644
--- /dev/null
+++ b/test.hs
@@ -0,0 +1,18 @@
+module Main where
+
+import Control.Monad (unless)
+import Test.QuickCheck.Test (verboseCheckResult, quickCheckResult, isSuccess)
+import System.Exit (exitFailure)
+import System.Environment (getArgs)
+
+import Codec.Binary.Gray_props
+
+main = do
+  args <- getArgs
+  let testsResult = if (("-v" `elem` args) || ("--verbose" `elem` args))
+                    then verboseCheckResult
+                    else quickCheckResult
+  result <- testsResult all_props
+  unless (isSuccess result) $ do
+         print result
+         exitFailure
