diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # Changelog for qrcode-core
 
+## 0.9.1 -- 2019-05-23
+
+* Support for primitive 0.7
+
 ## 0.9.0 -- 2019-02-16
 
 * Changed UTF-8 encoding: encoding a code point outside the unicode range will
diff --git a/qrcode-core.cabal b/qrcode-core.cabal
--- a/qrcode-core.cabal
+++ b/qrcode-core.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 57abfabcf9a41777287c8a5a350a210d519b6b6a7e87289f3d47dc4a4b05bd9b
+-- hash: 3050ad8a7d91248f29f4d59e8ed7b871f0e3e78e7f0603a7d1b6526796add27b
 
 name:           qrcode-core
-version:        0.9.0
+version:        0.9.1
 synopsis:       QR code library in pure Haskell
 description:    Please see the README on GitHub at <https://github.com/alexkazik/qrcode/qrcode-core#readme>
 category:       codec
@@ -71,7 +71,7 @@
     , case-insensitive >=1.2.0.5 && <1.3
     , containers >=0.5.6.2 && <0.7
     , dlist >=0.7.1.2 && <0.9
-    , primitive >=0.6.1.0 && <0.7
+    , primitive >=0.6.1.0 && <0.8
     , text >=1.2.2.0 && <1.3
     , vector >=0.11.0.0 && <0.13
   if impl(ghc < 8)
diff --git a/src/Codec/QRCode/Data/ByteStreamBuilder.hs b/src/Codec/QRCode/Data/ByteStreamBuilder.hs
--- a/src/Codec/QRCode/Data/ByteStreamBuilder.hs
+++ b/src/Codec/QRCode/Data/ByteStreamBuilder.hs
@@ -14,9 +14,7 @@
 
 import           Codec.QRCode.Base
 
-import           Data.Char         (intToDigit)
 import qualified Data.DList        as DL
-import           Data.List         (intercalate)
 
 -- | List of bits. Stored as a pair of Int, how many bits to store and the data, in a DList.
 --   The DList gives a O(1) append.
@@ -86,15 +84,3 @@
   : (x .&.   1 /= 0)
   : toBitStream xs
 toBitStream [] = []
-
-instance Show ByteStreamBuilder where
-  show b =
-    intercalate ", " (map go (DL.toList $ unBitStreamBuilder b)) ++
-    " aka " ++
-    intercalate "," (map (hexit . fromIntegral) (toList (b <> encodeBits 7 0))) ++
-    go2 (Codec.QRCode.Data.ByteStreamBuilder.length b `mod` 8)
-    where
-      hexit a = [intToDigit (a `shiftR` 4), intToDigit (a .&. 0x0f)]
-      go (n, b') = show b' ++ '/' : show n
-      go2 0 = ""
-      go2 n = '/':show n
diff --git a/src/Codec/QRCode/Data/ErrorLevel.hs b/src/Codec/QRCode/Data/ErrorLevel.hs
--- a/src/Codec/QRCode/Data/ErrorLevel.hs
+++ b/src/Codec/QRCode/Data/ErrorLevel.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE StandaloneDeriving #-}
 
 module Codec.QRCode.Data.ErrorLevel
   ( ErrorLevel(..)
@@ -14,5 +13,3 @@
   | Q -- ^ Allows error recovery up to 25%
   | H -- ^ Allows error recovery up to 30%
   deriving (Bounded, Enum, Eq)
-
-deriving instance Show ErrorLevel
diff --git a/src/Codec/QRCode/Data/Mask.hs b/src/Codec/QRCode/Data/Mask.hs
--- a/src/Codec/QRCode/Data/Mask.hs
+++ b/src/Codec/QRCode/Data/Mask.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE StandaloneDeriving #-}
 
 module Codec.QRCode.Data.Mask
   ( Mask(..)
@@ -18,5 +17,3 @@
   | Mask6
   | Mask7
   deriving (Bounded, Enum, Eq)
-
-deriving instance Show Mask
diff --git a/src/Codec/QRCode/Data/QRImage.hs b/src/Codec/QRCode/Data/QRImage.hs
--- a/src/Codec/QRCode/Data/QRImage.hs
+++ b/src/Codec/QRCode/Data/QRImage.hs
@@ -1,6 +1,5 @@
 {-# LANGUAGE NoImplicitPrelude #-}
 {-# LANGUAGE RecordWildCards #-}
-{-# LANGUAGE StandaloneDeriving #-}
 {-# LANGUAGE TypeFamilies #-}
 
 module Codec.QRCode.Data.QRImage
@@ -65,5 +64,3 @@
           (bool wh bl)
           (UV.toList $ UV.take qrImageSize $ UV.drop (ofs * qrImageSize) qrImageData)
         )
-
-deriving instance Show QRImage
diff --git a/src/Codec/QRCode/Data/QRIntermediate/Internal.hs b/src/Codec/QRCode/Data/QRIntermediate/Internal.hs
--- a/src/Codec/QRCode/Data/QRIntermediate/Internal.hs
+++ b/src/Codec/QRCode/Data/QRIntermediate/Internal.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE StandaloneDeriving #-}
 
 module Codec.QRCode.Data.QRIntermediate.Internal
   ( QRIntermediate(..)
@@ -20,5 +19,3 @@
     , qrIntermediateData_       :: !BSB.ByteStreamBuilder
     , qrIntermediateMask_       :: !(Maybe Mask)
     }
-
-deriving instance Show QRIntermediate
diff --git a/src/Codec/QRCode/Data/QRSegment/Internal.hs b/src/Codec/QRCode/Data/QRSegment/Internal.hs
--- a/src/Codec/QRCode/Data/QRSegment/Internal.hs
+++ b/src/Codec/QRCode/Data/QRSegment/Internal.hs
@@ -9,8 +9,6 @@
 
 import           Codec.QRCode.Base
 
-import           Data.List                           (intercalate)
-
 import qualified Codec.QRCode.Data.ByteStreamBuilder as BSB
 import           Codec.QRCode.Data.Result
 import           Codec.QRCode.Data.Version
@@ -46,10 +44,3 @@
     if l >= (1 `shiftL` n)
       then empty
       else pure $ BSB.encodeBits n l
-
-instance Show QRSegment where
-  show (QRSegment s) =
-    "\n" ++ intercalate "\n" (map go [minBound .. maxBound]) ++ "\n"
-    where
-      go vr =
-        show vr ++ ": " ++ show (getResult $ s vr)
diff --git a/src/Codec/QRCode/Data/Version.hs b/src/Codec/QRCode/Data/Version.hs
--- a/src/Codec/QRCode/Data/Version.hs
+++ b/src/Codec/QRCode/Data/Version.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE StandaloneDeriving #-}
 
 module Codec.QRCode.Data.Version
   ( Version
@@ -29,10 +28,3 @@
 versionsInRangeLimitedBy Version1to9   start end = map Version [start `max`  1 .. end `min`  9]
 versionsInRangeLimitedBy Version10to26 start end = map Version [start `max` 10 .. end `min` 26]
 versionsInRangeLimitedBy Version27to40 start end = map Version [start `max` 27 .. end `min` 40]
-
-deriving instance Show Version
-
-instance Show VersionRange where
-  show Version1to9   = "Version  1- 9"
-  show Version10to26 = "Version 10-26"
-  show Version27to40 = "Version 27-40"
