diff --git a/Tests/Properties.hs b/Tests/Properties.hs
deleted file mode 100644
--- a/Tests/Properties.hs
+++ /dev/null
@@ -1,36 +0,0 @@
-
-module Main where
-
-import Test.QuickCheck
-
-import Data.Complex
-import Data.Int
-import Data.Word
-import Data.Ratio
-
-import qualified Text.Show.ByteString as S
-
-import qualified Data.ByteString.Lazy.Char8 as L
-
-test_matchesShow :: (Show a, S.Show a, Arbitrary a) => a -> Bool
-test_matchesShow a = show a == L.unpack (S.show a)
-
-test_all :: IO ()
-test_all = do quickCheck (test_matchesShow :: Int -> Bool)
---              quickCheck (test_matchesShow :: Int8 -> Bool)
---              quickCheck (test_matchesShow :: Int16 -> Bool)
---              quickCheck (test_matchesShow :: Int32 -> Bool)
---              quickCheck (test_matchesShow :: Word -> Bool)
---              quickCheck (test_matchesShow :: Word8 -> Bool)
---              quickCheck (test_matchesShow :: Word16 -> Bool)
---              quickCheck (test_matchesShow :: Word32 -> Bool)
-              quickCheck (test_matchesShow :: () -> Bool)
-              quickCheck (test_matchesShow :: Integer -> Bool)
-              quickCheck (test_matchesShow :: Float -> Bool)
-              quickCheck (test_matchesShow :: Double -> Bool)
-              quickCheck (test_matchesShow :: Rational -> Bool)
-              quickCheck (test_matchesShow :: (Int,Int,Int) -> Bool)
-              quickCheck (test_matchesShow :: (Int,Int,Int,Int) -> Bool)
-              quickCheck (test_matchesShow :: [Int] -> Bool)
-
-main = test_all
diff --git a/Text/Show/ByteString.hs b/Text/Show/ByteString.hs
--- a/Text/Show/ByteString.hs
+++ b/Text/Show/ByteString.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE TypeSynonymInstances #-}
+{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}
 
 -- ---------------------------------------------------------------------------
 -- |
@@ -22,6 +22,8 @@
                               -- * Putting digits
                             , unsafePutDigit
                             , putDigit
+                              -- * Putting integers
+                            , showpIntAtBase
                               -- * Putting floats
                             , showpGFloat
                             , showpFFloat
@@ -32,13 +34,17 @@
                             , showpParen
                               -- * Printing values
                             , print
+                              -- * Put
+                            , Put
+                            , PutM(..)
+                            , runPut
                             ) where
 
 import Prelude hiding (Show(..), print, putStrLn)
 import qualified Prelude
 
 import Data.Binary.Put
-import Data.ByteString.Lazy
+import Data.ByteString.Lazy.Char8
 
 import Data.Int
 import Data.Word
@@ -161,6 +167,11 @@
 
   showpPrec k i = showpParen (i < 0 && k > 0) $ showpInt32 i
 
+instance Show Int64 where
+  showp = showpInt64
+
+  showpPrec k i = showpParen (i < 0 && k > 0) $ showpInt64 i
+
 instance Show Word where
   showp = showpWord
 
@@ -172,6 +183,9 @@
 
 instance Show Word32 where
   showp = showpWord32
+
+instance Show Word64 where
+  showp = showpWord64
 
 instance Show Integer where
   showp = showpInteger
diff --git a/Text/Show/ByteString/Float.hs b/Text/Show/ByteString/Float.hs
--- a/Text/Show/ByteString/Float.hs
+++ b/Text/Show/ByteString/Float.hs
@@ -46,7 +46,7 @@
   | otherwise                 = go fmt (floatToDigits (toInteger base) f)
  where
  base = 10
- 
+
  go FFGeneric p@(_,e)
    | e < 0 || e > 7 = go FFExponent p
    | otherwise      = go FFFixed    p
@@ -86,6 +86,6 @@
        let (ei, is') = roundTo base dec' (replicate (-e) 0 ++ is)
            d:ds      = if ei > 0 then is' else 0:is'
        in unsafePutDigit d >> when (not $ null ds) (putAscii '.' >> mapM_ unsafePutDigit ds)
- 
+
  mk0 [] = putAscii '0'
  mk0 rs = mapM_ unsafePutDigit rs
diff --git a/Text/Show/ByteString/Int.hs b/Text/Show/ByteString/Int.hs
--- a/Text/Show/ByteString/Int.hs
+++ b/Text/Show/ByteString/Int.hs
@@ -1,4 +1,6 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE MagicHash #-}
+{-# LANGUAGE BangPatterns #-}
 
 -- ---------------------------------------------------------------------------
 -- |
@@ -12,6 +14,8 @@
 --
 -- The code in this module is based on the printing in the GHC modules.
 
+#include "MachDeps.h"
+
 module Text.Show.ByteString.Int where
 
 import GHC.Base
@@ -24,18 +28,46 @@
 
 putI :: Int# -> Put
 putI i#
+#if __GLASGOW_HASKELL__ && __GLASGOW_HASKELL__ >= 708
+  = case i# <# 0# of
+      1#       -> let !(I# minInt#) = minInt
+#elif __GLASGOW_HASKELL__ && __GLASGOW_HASKELL__ >= 611
+  | i# <# 0#  = let !(I# minInt#) = minInt
+#else
   | i# <# 0#  = let I# minInt# = minInt
-                in if i# ==# minInt#
-                   then putWord8 45 >> putW (int2Word# (negateInt# (i# `quotInt#` 10#)))
+#endif
+                in case i# ==# minInt# of
+#if __GLASGOW_HASKELL__ && __GLASGOW_HASKELL__ >= 708
+                     1# ->
+#else
+                     True ->
+#endif
+                        putWord8 45 >> putW (int2Word# (negateInt# (i# `quotInt#` 10#)))
                                     >> putW (int2Word# (negateInt# (i# `remInt#` 10#)))
-                   else putWord8 45 >> putW (int2Word# (negateInt# i#))
+                     _ ->
+                        putWord8 45 >> putW (int2Word# (negateInt# i#))
+#if __GLASGOW_HASKELL__ && __GLASGOW_HASKELL__ >= 708
+      _        -> putW (int2Word# i#)
+#else
   | otherwise = putW (int2Word# i#)
+#endif
 
 putW :: Word# -> Put
 putW w#
-  | w# `ltWord#` int2Word# 10# = unsafePutDigit# w#
-  | otherwise                  = putW (w# `quotWord#` int2Word# 10#)
-                              >> unsafePutDigit# (w# `remWord#` int2Word# 10#)
+#if __GLASGOW_HASKELL__ && __GLASGOW_HASKELL__ >= 708
+  = case w# `ltWord#` int2Word# 10# of
+      1# ->
+#else
+  | w# `ltWord#` int2Word# 10# =
+#endif
+        unsafePutDigit# w#
+#if __GLASGOW_HASKELL__ && __GLASGOW_HASKELL__ >= 708
+      _  ->
+#else
+  | otherwise =
+#endif
+        putW (w# `quotWord#` int2Word# 10#)
+        >> unsafePutDigit# (w# `remWord#` int2Word# 10#)
 
 showpInt :: Int -> Put
 showpInt (I# i#) = putI i#
@@ -49,6 +81,22 @@
 showpInt32 :: Int32 -> Put
 showpInt32 (I32# i#) = putI i#
 
+showpInt64 :: Int64 -> Put
+#if WORD_SIZE_IN_BITS >= 64
+showpInt64 (I64# i#) = putI i#
+#else /* WORD_SIZE_IN_BITS < 64 */
+showpInt64 = putI64
+
+-- Unboxed 64-bit-specific operations aren't exported
+
+putI64 :: Int64 -> Put
+putI64 i | i == minBound = putWord8 45
+                           >> putW64 (fromIntegral $ negate (i `quot` 10))
+                           >> putW64 (fromIntegral $ negate (i `rem` 10))
+         | i < 0         = putWord8 45 >> putW64 (fromIntegral $ negate i)
+         | otherwise     = putW64 (fromIntegral i)
+#endif
+
 showpWord :: Word -> Put
 showpWord (W# w#) = putW w#
 
@@ -60,3 +108,17 @@
 
 showpWord32 :: Word32 -> Put
 showpWord32 (W32# w#) = putW w#
+
+showpWord64 :: Word64 -> Put
+#if WORD_SIZE_IN_BITS >= 64
+showpWord64 (W64# w#) = putW w#
+#else /* WORD_SIZE_IN_BITS < 64 */
+showpWord64 = putW64
+
+putW64 :: Word64 -> Put
+putW64 w | w < 10    = unsafePutDigit64 w
+         | otherwise = putW64 (w `quot` 10)
+                       >> unsafePutDigit64 (w `rem` 10)
+    where unsafePutDigit64 w = unsafePutDigit# (case fromIntegral w of (W# w#) -> w#)
+
+#endif
diff --git a/Text/Show/ByteString/Integer.hs b/Text/Show/ByteString/Integer.hs
--- a/Text/Show/ByteString/Integer.hs
+++ b/Text/Show/ByteString/Integer.hs
@@ -16,8 +16,12 @@
 
 import GHC.Base
 
-#ifdef INTEGER_GMP
+#if   __GLASGOW_HASKELL__ && __GLASGOW_HASKELL__ <  611 && INTEGER_GMP
 import GHC.Integer.Internals
+#elif __GLASGOW_HASKELL__ && __GLASGOW_HASKELL__ >= 611 && INTEGER_GMP
+import GHC.Integer.GMP.Internals
+#elif __GLASGOW_HASKELL__ && INTEGER_SIMPLE
+import GHC.Integer.Simple.Internals
 #endif
 
 import GHC.Num
@@ -34,7 +38,12 @@
  where mi = fromIntegral (maxBound :: Int)
 
 showpInteger :: Integer -> Put
+#ifdef INTEGER_SIMPLE
+#elif INTEGER_GMP
 showpInteger (S# i#) = putI i#
+#else
+showpInteger (I# i#) = putI i#
+#endif
 showpInteger n
   | n < 0     = putAscii '-' >> posIntegerPut (-n)
   | otherwise = posIntegerPut n
@@ -53,10 +62,10 @@
 splith :: Integer -> [Integer] -> [Integer]
 splith _ [    ] = error "splith: the impossible happened."
 splith p (n:ns) = case n `quotRemInteger` p of
-#ifdef INTEGER_GMP
+#if defined(INTEGER_GMP) || defined(INTEGER_SIMPLE)
   (# q, r #) ->
 #else
-  (q, r) -> 
+  (q, r) ->
 #endif
           if q > 0
             then q : r : splitb p ns
@@ -65,7 +74,7 @@
 splitb :: Integer -> [Integer] -> [Integer]
 splitb _ [    ] = []
 splitb p (n:ns) = case n `quotRemInteger` p of
-#ifdef INTEGER_GMP
+#if defined(INTEGER_GMP) || defined(INTEGER_SIMPLE)
   (# q, r #) ->
 #else
   (q, r) ->
@@ -75,7 +84,7 @@
 printh :: [Integer] -> Put
 printh [    ] = error "printh: the impossible happened."
 printh (n:ns) = case n `quotRemInteger` mx of
-#ifdef INTEGER_GMP
+#if defined(INTEGER_GMP) || defined(INTEGER_SIMPLE)
   (# q', r' #) ->
 #else
   (q', r') ->
@@ -88,7 +97,7 @@
 printb :: [Integer] -> Put
 printb [    ] = return ()
 printb (n:ns) = case n `quotRemInteger` mx of
-#ifdef INTEGER_GMP
+#if defined(INTEGER_GMP) || defined(INTEGER_SIMPLE)
   (# q', r' #) ->
 #else
   (q', r') ->
@@ -108,3 +117,15 @@
   | d == 1    = unsafePutDigit n
   | otherwise = pblock' (d-1) q >> unsafePutDigit r
  where (q, r) = n `quotRemInt` 10
+
+-- | Shows an Integral number using the base specified by the first
+-- argument and the chracter representation specified by the second.
+showpIntAtBase :: Integral a => a -> (Int -> Char) -> a -> Put
+showpIntAtBase b f n | n < 0     = putAscii '-' >> showpIntAtBase b f (-n)
+                     | n == 0    = putAscii (f 0)
+                     | otherwise = let
+  go k | k == 0    = return ()
+       | otherwise = go d >> putAscii (f $ fromIntegral m)
+   where
+   (d, m) = k `divMod` b
+  in go n
diff --git a/bytestring-show.cabal b/bytestring-show.cabal
--- a/bytestring-show.cabal
+++ b/bytestring-show.cabal
@@ -1,5 +1,5 @@
 name:              bytestring-show
-version:           0.2.1
+version:           0.3.5.6
 license:           BSD3
 license-file:      LICENSE
 author:            Dan Doel
@@ -9,10 +9,14 @@
 synopsis:          Efficient conversion of values into readable byte strings.
 description:       Efficient conversion of values into readable byte strings.
 build-type:        Simple
-cabal-version:     >= 1.2
+cabal-version:     >= 1.6
 
+flag integer-simple
+        default: False
+        description: use with integer-simple build of GHC
+
 library
-    build-depends: base, binary, bytestring >= 0.9, array, containers
+    build-depends: base < 5, binary < 0.8, bytestring >= 0.9 && <= 1, array < 0.6, containers < 0.6
 
     exposed-modules:
         Text.Show.ByteString
@@ -24,12 +28,21 @@
         Text.Show.ByteString.Float
         Text.Show.ByteString.Integer
 
-    extensions:
-        UnboxedTuples, MagicHash, BangPatterns, TypeSynonymInstances, CPP
-
     ghc-options:
         -O2 -Wall
 
-    if impl(ghc >= 6.9)
-        build-depends: integer
+    if flag(integer-simple)
+        cpp-options: -DINTEGER_SIMPLE
+        build-depends: integer-simple
+
+    if impl(ghc >= 6.11) && !flag(integer-simple)
         cpp-options: -DINTEGER_GMP
+        build-depends: integer-gmp >= 0.2
+
+    if impl(ghc >= 6.9) && impl(ghc < 6.11) && !flag(integer-simple)
+        cpp-options: -DINTEGER_GMP
+        build-depends: integer >= 0.1 && < 0.2
+
+source-repository head
+  type: darcs
+  location: http://hub.darcs.net/dolio/bytestring-show
