diff --git a/README.markdown b/README.markdown
--- a/README.markdown
+++ b/README.markdown
@@ -14,7 +14,7 @@
 
 Master [git repository](http://github.com/haskell/aeson):
 
-* `git clone git://github.com/haskell/aeson.git`
+* `git clone https://github.com/haskell/aeson.git`
 
 See what's changed in recent (and upcoming) releases:
 
diff --git a/aeson.cabal b/aeson.cabal
--- a/aeson.cabal
+++ b/aeson.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.2
 name:               aeson
-version:            2.2.3.0
+version:            2.2.4.0
 license:            BSD-3-Clause
 license-file:       LICENSE
 category:           Text, Web, JSON
@@ -18,9 +18,10 @@
    || ==9.0.2
    || ==9.2.8
    || ==9.4.8
-   || ==9.6.5
-   || ==9.8.2
+   || ==9.6.6
+   || ==9.8.4
    || ==9.10.1
+   || ==9.12.1
 
 synopsis:           Fast JSON parsing and encoding
 homepage:           https://github.com/haskell/aeson
@@ -97,10 +98,10 @@
     , containers        >=0.6.0.1  && <0.8
     , deepseq           >=1.4.4.0  && <1.6
     , exceptions        >=0.10.4   && <0.11
-    , ghc-prim          >=0.5.0.0  && <0.12
-    , template-haskell  >=2.14.0.0 && <2.23
+    , ghc-prim          >=0.5.0.0  && <0.14
+    , template-haskell  >=2.14.0.0 && <2.24
     , text              >=1.2.3.0  && <1.3  || >=2.0 && <2.2
-    , time              >=1.8.0.2  && <1.13
+    , time              >=1.8.0.2  && <1.15
 
   -- Compat
   build-depends:
@@ -115,14 +116,14 @@
     , character-ps          ^>=0.1
     , data-fix              ^>=0.3.2
     , dlist                 ^>=1.0
-    , hashable              ^>=1.4.6.0
+    , hashable              ^>=1.4.6.0  || ^>=1.5.0.0
     , indexed-traversable   ^>=0.1.2
     , integer-conversion    ^>=0.1
     , integer-logarithms    ^>=1.0.3.1
     , network-uri           ^>=2.6.4.1
     , OneTuple              ^>=0.4.1.1
     , primitive             ^>=0.8.0.0  || ^>=0.9.0.0
-    , QuickCheck            ^>=2.14.3 || ^>=2.15
+    , QuickCheck            ^>=2.14.3   || ^>=2.15    || ^>=2.16.0.0 || ^>=2.17.1.0 || ^>=2.18.0.0
     , scientific            ^>=0.3.7.0
     , semialign             ^>=1.3
     , strict                ^>=0.5
@@ -134,7 +135,7 @@
     , unordered-containers  ^>=0.2.10.0
     , uuid-types            ^>=1.0.5
     , vector                ^>=0.13.0.0
-    , witherable            ^>=0.4.2 || ^>=0.5
+    , witherable            ^>=0.4.2    || ^>=0.5
 
   ghc-options:      -Wall
 
@@ -174,6 +175,7 @@
     Regression.Issue571
     Regression.Issue687
     Regression.Issue967
+    Regression.Issue1138
     RFC8785
     SerializationFormatSpec
     Types
@@ -202,7 +204,7 @@
     , containers
     , data-fix
     , deepseq
-    , Diff                  >=0.4    && <0.6
+    , Diff                  >=0.4    && <0.6  || ^>=1.0.2
     , directory
     , dlist
     , filepath
@@ -215,8 +217,8 @@
     , network-uri
     , OneTuple
     , primitive
-    , QuickCheck            >=2.14.2 && <2.16
-    , quickcheck-instances  >=0.3.29 && <0.4
+    , QuickCheck
+    , quickcheck-instances  >=0.3.29 && <0.5
     , scientific
     , strict
     , tagged
@@ -242,4 +244,4 @@
 
 source-repository head
   type:     git
-  location: git://github.com/haskell/aeson.git
+  location: https://github.com/haskell/aeson.git
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,9 @@
 For the latest version of this document, please see [https://github.com/haskell/aeson/blob/master/changelog.md](https://github.com/haskell/aeson/blob/master/changelog.md).
 
+### 2.2.4.0
+
+* Check for control characters in text literals everywhere
+
 ### 2.2.3.0
 
 * Support `hashable-1.4.6.0`.
diff --git a/src/Data/Aeson.hs b/src/Data/Aeson.hs
--- a/src/Data/Aeson.hs
+++ b/src/Data/Aeson.hs
@@ -253,7 +253,7 @@
 
 -- | Like 'decodeFileStrict'' but returns an error message when decoding fails.
 --
--- Since @2.2.0.0@ an alias for 'eitherDecodeFileStrict''.
+-- Since @2.2.0.0@ an alias for 'eitherDecodeFileStrict'.
 eitherDecodeFileStrict' :: (FromJSON a) => FilePath -> IO (Either String a)
 eitherDecodeFileStrict' = eitherDecodeFileStrict
 {-# INLINE eitherDecodeFileStrict' #-}
diff --git a/src/Data/Aeson/Decoding/ByteString.hs b/src/Data/Aeson/Decoding/ByteString.hs
--- a/src/Data/Aeson/Decoding/ByteString.hs
+++ b/src/Data/Aeson/Decoding/ByteString.hs
@@ -153,7 +153,9 @@
             Right t -> ok t (BS.drop (n + 1) bs0)
             Left e  -> err (show e)
         Just (92, bs') -> goSlash (n + 1) bs'
-        Just (_,  bs') -> goEsc (n + 1) bs'
+        Just (w8, bs')
+            | w8 < 0x20  -> errCC
+            | otherwise  -> goEsc (n + 1) bs'
 
     goSlash :: Int -> ByteString -> r
     goSlash !n !bs = case BS.uncons bs of
diff --git a/src/Data/Aeson/Decoding/ByteString/Lazy.hs b/src/Data/Aeson/Decoding/ByteString/Lazy.hs
--- a/src/Data/Aeson/Decoding/ByteString/Lazy.hs
+++ b/src/Data/Aeson/Decoding/ByteString/Lazy.hs
@@ -159,7 +159,9 @@
             Right t -> ok t (lbsDrop (n + 1) bs0)
             Left e  -> err (show e)
         Just (92, bs') -> goSlash (n + 1) bs'
-        Just (_,  bs') -> goEsc (n + 1) bs'
+        Just (w8, bs')
+            | w8 < 0x20  -> errCC
+            | otherwise  -> goEsc (n + 1) bs'
 
     goSlash :: Int -> ByteString -> r
     goSlash !n !bs = case LBS.uncons bs of
diff --git a/src/Data/Aeson/Decoding/Text.hs b/src/Data/Aeson/Decoding/Text.hs
--- a/src/Data/Aeson/Decoding/Text.hs
+++ b/src/Data/Aeson/Decoding/Text.hs
@@ -36,7 +36,7 @@
 #endif
 
 
--- | Lex (and parse) strict 'ByteString' into 'Tokens' stream.
+-- | Lex (and parse) strict 'Text' into 'Tokens' stream.
 --
 -- @since 2.2.1.0
 --
@@ -163,7 +163,9 @@
             Right t -> ok t (unsafeDropPoints (n + 1) bs0)
             Left e  -> err (show e)
         Just (92, bs') -> goSlash (n + 1) bs'
-        Just (_,  bs') -> goEsc (n + 1) bs'
+        Just (w8, bs')
+            | w8 < 0x20  -> errCC
+            | otherwise  -> goEsc (n + 1) bs'
 
     goSlash :: Int -> Text -> r
     goSlash !n !bs = case unconsPoint bs of
diff --git a/src/Data/Aeson/Types/ToJSON.hs b/src/Data/Aeson/Types/ToJSON.hs
--- a/src/Data/Aeson/Types/ToJSON.hs
+++ b/src/Data/Aeson/Types/ToJSON.hs
@@ -371,7 +371,7 @@
     explicitToField f name value = KM.singleton name (f value)
     {-# INLINE explicitToField #-}
 
--- | An optional key-value pair for envoding to a JSON object
+-- | An optional key-value pair for encoding to a JSON object
 --
 -- @since 2.2.0.0
 --
diff --git a/tests/Instances.hs b/tests/Instances.hs
--- a/tests/Instances.hs
+++ b/tests/Instances.hs
@@ -28,6 +28,11 @@
 import Data.Orphans ()
 import Test.QuickCheck.Instances ()
 
+#if !MIN_VERSION_base(4,16,0)
+import Data.Semigroup (Option (..))
+import Data.Tuple.Solo (Solo (..))
+#endif
+
 -- "System" types.
 
 instance Arbitrary DotNetTime where
@@ -157,9 +162,13 @@
 
 #if !MIN_VERSION_base(4,16,0)
 instance Arbitrary OptionField where
-    arbitrary = OptionField <$> arbitrary
+    arbitrary = OptionField . Option <$> arbitrary
 #endif
 
+#if !MIN_VERSION_base(4,16,0) && MIN_VERSION_QuickCheck(2,17,0)
+instance Arbitrary a => Arbitrary (Solo a) where
+    arbitrary = MkSolo <$> arbitrary
+#endif
 
 instance ApproxEq Char where
     (=~) = (==)
diff --git a/tests/Regression/Issue1138.hs b/tests/Regression/Issue1138.hs
new file mode 100644
--- /dev/null
+++ b/tests/Regression/Issue1138.hs
@@ -0,0 +1,23 @@
+{-# LANGUAGE OverloadedStrings #-}
+module Regression.Issue1138 (issue1138) where
+
+import Test.Tasty (TestTree, testGroup)
+import Test.Tasty.HUnit (testCase, assertFailure)
+
+import Data.Aeson
+
+assertDecodeFailure :: Either String Value -> IO ()
+assertDecodeFailure (Right v) = assertFailure $ "Unexpected success: " ++ show v
+assertDecodeFailure (Left _)  = return ()
+
+issue1138 :: TestTree
+issue1138 = testGroup "Issue #1138" $ map (testCase "-")
+  [ assertDecodeFailure $ eitherDecode "\"\t\""
+  , assertDecodeFailure $ eitherDecode "\"\\\\\t\""
+
+  , assertDecodeFailure $ eitherDecodeStrict "\"\t\""
+  , assertDecodeFailure $ eitherDecodeStrict "\"\\\\\t\""
+
+  , assertDecodeFailure $ eitherDecodeStrictText "\"\t\""
+  , assertDecodeFailure $ eitherDecodeStrictText "\"\\\\\t\""
+  ]
diff --git a/tests/UnitTests.hs b/tests/UnitTests.hs
--- a/tests/UnitTests.hs
+++ b/tests/UnitTests.hs
@@ -64,6 +64,7 @@
 import Regression.Issue571
 import Regression.Issue687
 import Regression.Issue967
+import Regression.Issue1138
 import UnitTests.OmitNothingFieldsNote
 import UnitTests.FromJSONKey
 import UnitTests.Hashable
@@ -568,6 +569,7 @@
   , issue571
   , issue687
   , issue967
+  , issue1138
   , keyMapInsertWithTests
   , omitNothingFieldsNoteTests
   , noThunksTests
