diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # lzlib
 
+## 1.0.7.0
+
+  * Add `Bounded` instance to `CompressionLevel`
+
 ## 1.0.6.0
 
   * Export `compressFineTune`
diff --git a/lzlib.cabal b/lzlib.cabal
--- a/lzlib.cabal
+++ b/lzlib.cabal
@@ -1,6 +1,6 @@
 cabal-version:      1.18
 name:               lzlib
-version:            1.0.6.0
+version:            1.0.7.0
 license:            BSD3
 license-file:       LICENSE
 copyright:          Copyright: (c) 2019-2020 Vanessa McHale
@@ -66,11 +66,15 @@
     if impl(ghc >=8.4)
         ghc-options: -Wmissing-export-lists
 
+    if impl(ghc >=8.10)
+        ghc-options: -Wunused-packages
+
 test-suite lzlib-test
     type:             exitcode-stdio-1.0
     main-is:          Spec.hs
     hs-source-dirs:   test
     default-language: Haskell2010
+    ghc-options:      -threaded -rtsopts -with-rtsopts=-N -Wall
     build-depends:
         base -any,
         lzlib -any,
@@ -87,6 +91,9 @@
     if impl(ghc >=8.4)
         ghc-options: -Wmissing-export-lists
 
+    if impl(ghc >=8.10)
+        ghc-options: -Wunused-packages
+
 benchmark lzlib-bench
     type:             exitcode-stdio-1.0
     main-is:          Bench.hs
@@ -107,12 +114,15 @@
     if impl(ghc >=8.4)
         ghc-options: -Wmissing-export-lists
 
+    if impl(ghc >=8.10)
+        ghc-options: -Wunused-packages
+
 benchmark lzlib-mem
     type:             exitcode-stdio-1.0
     main-is:          Mem.hs
     hs-source-dirs:   mem
     default-language: Haskell2010
-    ghc-options:      -Wall
+    ghc-options:      -threaded -rtsopts -with-rtsopts=-N -Wall
     build-depends:
         base -any,
         lzlib -any,
@@ -122,3 +132,6 @@
 
     if impl(ghc >=8.0)
         ghc-options: -Wincomplete-uni-patterns -Wincomplete-record-updates
+
+    if impl(ghc >=8.10)
+        ghc-options: -Wunused-packages
diff --git a/mem/Mem.hs b/mem/Mem.hs
--- a/mem/Mem.hs
+++ b/mem/Mem.hs
@@ -1,14 +1,16 @@
 module Main (main) where
 
 import           Codec.Lzip           (compressFile, decompress)
+import           Control.Concurrent   (forkIO, newEmptyMVar, putMVar, takeMVar)
+import qualified Data.ByteString      as BS
 import qualified Data.ByteString.Lazy as BSL
 import           System.FilePath      ((</>))
 import           System.IO.Temp       (withSystemTempDirectory)
-
 main :: IO ()
 main =
     compressDump *>
-    decompressDump
+    decompressDump *>
+    compressMultithreaded "gmp-6.1.2.tar"
 
 decompressDump :: IO ()
 decompressDump = withSystemTempDirectory "lz" $
@@ -19,3 +21,17 @@
 compressDump = withSystemTempDirectory "lz" $
     \fp -> BSL.writeFile (fp </> "gmp-6.1.2.tar.lz") =<<
         (compressFile "gmp-6.1.2.tar")
+
+forceHead :: BSL.ByteString -> IO ()
+forceHead bsl = BS.length (head $ BSL.toChunks bsl) `seq` mempty
+
+forceBSL :: BSL.ByteString -> IO ()
+forceBSL bsl = BS.length (last $ BSL.toChunks bsl) `seq` mempty
+
+compressMultithreaded :: FilePath -> IO ()
+compressMultithreaded fp = do
+    bsl <- compressFile fp -- compress <$> BSL.readFile fp
+    forceHead bsl
+    done <- newEmptyMVar
+    _ <- forkIO (forceBSL bsl *> putMVar done ())
+    takeMVar done
diff --git a/src/Codec/Lzip.hs b/src/Codec/Lzip.hs
--- a/src/Codec/Lzip.hs
+++ b/src/Codec/Lzip.hs
@@ -64,7 +64,7 @@
     | Seven
     | Eight
     | Nine
-    deriving (Enum)
+    deriving (Enum, Bounded)
 
 data LzOptions = LzOptions
     { dictionarySize :: !Int
@@ -160,33 +160,33 @@
            -> BSL.ByteString
 compressSz = compressWithSz Six
 
--- | Alias for @'compressWithSz' 'Nine'@
+-- | Alias for @'compressWithSz' 'maxBound'@
 --
 -- @since 1.0.2.0
 compressSzBest :: BSL.ByteString
            -> Int -- ^ Size of input data, in bytes
            -> BSL.ByteString
-compressSzBest = compressWithSz Nine
+compressSzBest = compressWithSz maxBound
 
--- | Alias for @'compressWithSz' 'Zero'@
+-- | Alias for @'compressWithSz' 'minBound'@
 --
 -- @since 1.0.2.0
 compressSzFast :: BSL.ByteString
            -> Int -- ^ Size of input data, in bytes
            -> BSL.ByteString
-compressSzFast = compressWithSz Zero
+compressSzFast = compressWithSz minBound
 
--- | Alias for @'compressWith' 'Nine'@
+-- | Alias for @'compressWith' 'maxBound'@
 --
 -- @since 0.3.2.0
 compressBest :: BSL.ByteString -> BSL.ByteString
-compressBest = compressWith Nine
+compressBest = compressWith maxBound
 
--- | Alias for @'compressWith' 'Zero'@
+-- | Alias for @'compressWith' 'minBound'@
 --
 -- @since 0.3.2.0
 compressFast :: BSL.ByteString -> BSL.ByteString
-compressFast = compressWith Zero
+compressFast = compressWith minBound
 
 -- | Use this to avoid forcing the whole file into memory at once
 --
@@ -196,7 +196,7 @@
 
 -- | @since 1.0.3.0
 compressFileBest :: FilePath -> IO BSL.ByteString
-compressFileBest = compressFileLevel Nine
+compressFileBest = compressFileLevel maxBound
 
 -- | @since 1.0.3.0
 compressFileFast :: FilePath -> IO BSL.ByteString
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -3,13 +3,31 @@
 import           Codec.Lzip                   (compress, compressBest,
                                                decompress)
 import           Control.Applicative
+import           Control.Concurrent           (forkIO, newEmptyMVar, putMVar,
+                                               readMVar)
 import           Control.Monad                (filterM)
+import qualified Data.ByteString              as BS
 import qualified Data.ByteString.Lazy         as BSL
 import           Data.ByteString.Pathological (nonstandardRead)
 import           Data.Foldable                (traverse_)
 import           System.Directory             (doesFileExist)
 import           Test.Hspec
 
+forceHead :: BSL.ByteString -> IO ()
+forceHead bsl = BS.length (head $ BSL.toChunks bsl) `seq` (pure ())
+
+forceBSL :: BSL.ByteString -> IO ()
+forceBSL bsl = BS.length (last $ BSL.toChunks bsl) `seq` (pure ())
+
+decompressMultithreaded :: FilePath -> IO ()
+decompressMultithreaded fp = do
+    bsl <- decompress <$> BSL.readFile fp
+    forceHead bsl
+    done <- newEmptyMVar
+    _ <- forkIO (forceBSL bsl *> putMVar done ())
+    _ <- forkIO (forceBSL bsl *> putMVar done ())
+    readMVar done
+
 compressFileGeneral :: (FilePath -> IO BSL.ByteString) -> FilePath -> Spec
 compressFileGeneral f fp = parallel $
     it ("decompress . compress should be identity (" ++ fp ++ ")") $ do
@@ -47,3 +65,6 @@
             traverse_ compressFileFreaky ex
         describe "roundtrip (sketchy)" $
             traverse_ decompressFileFreaky ex'
+        describe "decompress (multithreaded)" $
+            it "should not fail" $
+                traverse_ decompressMultithreaded ex'
