diff --git a/hw-json.cabal b/hw-json.cabal
--- a/hw-json.cabal
+++ b/hw-json.cabal
@@ -1,7 +1,7 @@
 cabal-version:  2.2
 
 name:                   hw-json
-version:                1.3.2.3
+version:                1.3.2.4
 synopsis:               Memory efficient JSON parser
 description:            Memory efficient JSON parser. Please see README.md
 category:               Data
@@ -45,13 +45,13 @@
 common attoparsec                 { build-depends: attoparsec                 >= 0.13       && < 0.15   }
 common bits-extra                 { build-depends: bits-extra                 >= 0.0.1.3    && < 0.1    }
 common bytestring                 { build-depends: bytestring                 >= 0.10.6     && < 0.12   }
-common criterion                  { build-depends: criterion                  >= 1.4        && < 1.6    }
+common criterion                  { build-depends: criterion                  >= 1.4        && < 1.7    }
 common directory                  { build-depends: directory                  >= 1.3        && < 1.4    }
 common dlist                      { build-depends: dlist                      >= 0.8        && < 1.1    }
 common doctest                    { build-depends: doctest                    >= 0.16.2     && < 0.21   }
 common doctest-discover           { build-depends: doctest-discover           >= 0.2        && < 0.3    }
 common generic-lens               { build-depends: generic-lens               >= 1.2.0.1    && < 2.3    }
-common hedgehog                   { build-depends: hedgehog                   >= 0.6        && < 1.2    }
+common hedgehog                   { build-depends: hedgehog                   >= 0.6        && < 1.3    }
 common hspec                      { build-depends: hspec                      >= 2.4        && < 3      }
 common hw-balancedparens          { build-depends: hw-balancedparens          >= 0.3.0.0    && < 0.5    }
 common hw-bits                    { build-depends: hw-bits                    >= 0.7.0.5    && < 0.8    }
@@ -69,10 +69,10 @@
 common mmap                       { build-depends: mmap                       >= 0.5        && < 0.6    }
 common optparse-applicative       { build-depends: optparse-applicative       >= 0.14       && < 0.18   }
 common scientific                 { build-depends: scientific                 >= 0.3.6.2    && < 0.4    }
-common text                       { build-depends: text                       >= 1.2        && < 2.1    }
+common text                       { build-depends: text                       >= 1.2        && < 3      }
 common transformers               { build-depends: transformers               >= 0.4        && < 0.7    }
 common unordered-containers       { build-depends: unordered-containers       >= 0.2        && < 0.3    }
-common vector                     { build-depends: vector                     >= 0.12       && < 0.13   }
+common vector                     { build-depends: vector                     >= 0.12       && < 0.14   }
 common word8                      { build-depends: word8                      >= 0.1        && < 0.2    }
 
 common config
diff --git a/src/HaskellWorks/Data/Json/Internal/Value.hs b/src/HaskellWorks/Data/Json/Internal/Value.hs
--- a/src/HaskellWorks/Data/Json/Internal/Value.hs
+++ b/src/HaskellWorks/Data/Json/Internal/Value.hs
@@ -58,4 +58,7 @@
       b <- parseHexDigit
       c <- parseHexDigit
       d <- parseHexDigit
-      return $ chr $ a `shift` 24 .|. b `shift` 16 .|. c `shift` 8 .|. d
+      let res =  a `shift` 12 .|. b `shift` 8 .|. c `shift` 4 .|. d
+      return $ if res <= 0x10FFFF
+                then chr res
+                else '�'
diff --git a/test/HaskellWorks/Data/Json/LightJsonSpec.hs b/test/HaskellWorks/Data/Json/LightJsonSpec.hs
--- a/test/HaskellWorks/Data/Json/LightJsonSpec.hs
+++ b/test/HaskellWorks/Data/Json/LightJsonSpec.hs
@@ -104,6 +104,8 @@
     forJson "[null]" $ \cursor -> do
       it "should have correct value"      $ requireTest $ jsonValueVia (Just cursor) === Right (JsonArray [JsonNull])
       it "should have correct value"      $ requireTest $ jsonValueVia (fc   cursor) === Right  JsonNull
+    forJson "\"codepoint\\u2019s\"" $ \cursor -> do
+      it "should have correct value"      $ requireTest $ jsonValueVia (Just cursor) === Right (JsonString "codepoint’s")
     forJson "[null, {\"field\": 1}]" $ \cursor -> do
       it "cursor can navigate to second child of array" $ requireTest $ do
         jsonValueVia ((fc >=> ns)   cursor) === Right (                     JsonObject [("field", JsonNumber 1)] )
diff --git a/test/HaskellWorks/Data/Json/ValueSpec.hs b/test/HaskellWorks/Data/Json/ValueSpec.hs
--- a/test/HaskellWorks/Data/Json/ValueSpec.hs
+++ b/test/HaskellWorks/Data/Json/ValueSpec.hs
@@ -80,6 +80,9 @@
     forJson "[null]" $ \cursor -> do
       it "should have correct value"      $ requireTest $ jsonValueVia (Just cursor) === Right (JsonArray [JsonNull])
       it "should have correct value"      $ requireTest $ jsonValueVia (fc   cursor) === Right  JsonNull
+      it "should have correct value"      $ requireTest $ jsonValueVia (fc   cursor) === Right  JsonNull
+    forJson "\"codepoint\\u2019s\"" $ \cursor -> do
+      it "should have correct value"      $ requireTest $ jsonValueVia (Just cursor) === Right (JsonString "codepoint’s")
     forJson "[null, {\"field\": 1}]" $ \cursor -> do
       it "cursor can navigate to second child of array" $ requireTest $ do
         jsonValueVia ((fc >=> ns)   cursor) === Right (                     JsonObject [("field", JsonNumber 1)] )
