diff --git a/net-mqtt.cabal b/net-mqtt.cabal
--- a/net-mqtt.cabal
+++ b/net-mqtt.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           net-mqtt
-version:        0.8.6.2
+version:        0.8.6.3
 synopsis:       An MQTT Protocol Implementation.
 description:    Please see the README on GitHub at <https://github.com/dustin/mqtt-hs#readme>
 category:       Network
@@ -38,7 +38,7 @@
   hs-source-dirs:
       src
   build-depends:
-      QuickCheck >=2.12.6.1 && <2.15
+      QuickCheck >=2.12.6.1 && <2.17
     , async >=2.2.1 && <2.3
     , attoparsec >=0.13.2 && <0.15
     , attoparsec-binary >=0.2 && <1.0
@@ -47,7 +47,7 @@
     , bytestring >=0.10.8 && <0.13
     , conduit >=1.3.1 && <1.5
     , conduit-extra >=1.3.0 && <1.5
-    , containers >=0.5.0 && <0.7
+    , containers >=0.5.0 && <0.8
     , crypton-connection >=0.3.0
     , data-default-class >=0.1.2
     , deepseq >=1.4.3.0 && <1.6
@@ -68,7 +68,7 @@
       app/example
   ghc-options: -threaded -rtsopts -with-rtsopts=-N
   build-depends:
-      QuickCheck >=2.12.6.1 && <2.15
+      QuickCheck >=2.12.6.1 && <2.17
     , async >=2.2.1 && <2.3
     , attoparsec >=0.13.2 && <0.15
     , attoparsec-binary >=0.2 && <1.0
@@ -77,7 +77,7 @@
     , bytestring >=0.10.8 && <0.13
     , conduit >=1.3.1 && <1.5
     , conduit-extra >=1.3.0 && <1.5
-    , containers >=0.5.0 && <0.7
+    , containers >=0.5.0 && <0.8
     , crypton-connection >=0.3.0
     , data-default-class >=0.1.2
     , deepseq >=1.4.3.0 && <1.6
@@ -99,7 +99,7 @@
       app/mqtt-watch
   ghc-options: -threaded -rtsopts -eventlog -with-rtsopts=-N
   build-depends:
-      QuickCheck >=2.12.6.1 && <2.15
+      QuickCheck >=2.12.6.1 && <2.17
     , async >=2.2.1 && <2.3
     , attoparsec >=0.13.2 && <0.15
     , attoparsec-binary >=0.2 && <1.0
@@ -108,7 +108,7 @@
     , bytestring
     , conduit >=1.3.1 && <1.5
     , conduit-extra >=1.3.0 && <1.5
-    , containers >=0.5.0 && <0.7
+    , containers >=0.5.0 && <0.8
     , crypton-connection >=0.3.0
     , data-default-class >=0.1.2
     , deepseq >=1.4.3.0 && <1.6
@@ -138,7 +138,7 @@
   ghc-options: -threaded -rtsopts -with-rtsopts=-N
   build-depends:
       HUnit
-    , QuickCheck >=2.12.6.1 && <2.15
+    , QuickCheck >=2.12.6.1 && <2.17
     , async >=2.2.1 && <2.3
     , attoparsec >=0.13.2 && <0.15
     , attoparsec-binary >=0.2 && <1.0
@@ -148,7 +148,7 @@
     , checkers
     , conduit >=1.3.1 && <1.5
     , conduit-extra >=1.3.0 && <1.5
-    , containers >=0.5.0 && <0.7
+    , containers >=0.5.0 && <0.8
     , crypton-connection >=0.3.0
     , data-default-class >=0.1.2
     , deepseq >=1.4.3.0 && <1.6
diff --git a/src/Network/MQTT/Client.hs b/src/Network/MQTT/Client.hs
--- a/src/Network/MQTT/Client.hs
+++ b/src/Network/MQTT/Client.hs
@@ -97,6 +97,9 @@
   -- In high throughput scenarios, slow callbacks may result in a high number of Haskell threads,
   -- potentially bringing down the entire application when running out of memory.
   -- Typically faster than `OrderedCallback`.
+  -- Use 'System.Mem.setAllocationCounter' and 'System.Mem.enableAllocationLimit'
+  -- to restrain the unbounded threads memory use.
+  -- Use a simple 'System.Timeout.timeout' to restrain unbounded thread runtime.
   | SimpleCallback (MQTTClient -> Topic -> BL.ByteString -> [Property] -> IO ())
   -- | Callbacks are guaranteed to be invoked in the same order messages are received.
   -- In high throughput scenarios, slow callbacks may cause the underlying TCP connection to block,
diff --git a/src/Network/MQTT/Types.hs b/src/Network/MQTT/Types.hs
--- a/src/Network/MQTT/Types.hs
+++ b/src/Network/MQTT/Types.hs
@@ -41,7 +41,11 @@
 import           Data.Word                       (Word16, Word32, Word8)
 
 -- | QoS values for publishing and subscribing.
-data QoS = QoS0 | QoS1 | QoS2 deriving (Bounded, Enum, Eq, Show, Ord)
+--   cf https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901103
+data QoS = QoS0 -- ^ At most once delivered, default. (eg you may get nothing!)
+         | QoS1 -- ^ At least once delivered (you may get dups)
+         | QoS2 -- ^ Delivered exactly once (NB aws iot core doesn't support this)
+         deriving (Bounded, Enum, Eq, Show, Ord)
 
 qosW :: QoS -> Word8
 qosW = toEnum . fromEnum
