diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # lzlib
 
+## 1.0.4.0
+
+  * Add `Enum` instance to `CompressionLevel`
+
 ## 1.0.3.0
 
   * More laconic internals
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.3.0
+version:            1.0.4.0
 license:            BSD3
 license-file:       LICENSE
 copyright:          Copyright: (c) 2019-2020 Vanessa McHale
@@ -46,6 +46,7 @@
     c-sources:        cbits/lzlib.c
     hs-source-dirs:   src
     other-modules:    Codec.Lzip.Raw
+    other-modules:    Codec.Lzip.Pure
     default-language: Haskell2010
     other-extensions: DeriveDataTypeable TupleSections
     include-dirs:     cbits
diff --git a/src/Codec/Lzip.hs b/src/Codec/Lzip.hs
--- a/src/Codec/Lzip.hs
+++ b/src/Codec/Lzip.hs
@@ -52,6 +52,7 @@
     | Seven
     | Eight
     | Nine
+    deriving (Enum)
 
 data LzOptions = LzOptions
     { _dictionarySize :: !Int
diff --git a/src/Codec/Lzip/Pure.hs b/src/Codec/Lzip/Pure.hs
new file mode 100644
--- /dev/null
+++ b/src/Codec/Lzip/Pure.hs
@@ -0,0 +1,13 @@
+module Codec.Lzip.Pure ( Member (..)
+                       ) where
+
+import qualified Data.ByteString.Lazy as BSL
+import           Data.Word            (Word32, Word64, Word8)
+
+-- see: https://www.nongnu.org/lzip/manual/lzip_manual.html#File-format
+data Member =
+    Member !Word8 !Word8 BSL.ByteString Word32 !Word64 Word64
+-- for some reason this is little endian
+--
+-- pure bz2? huffman coding!
+-- https://www.sourceware.org/bzip2/manual/manual.html#limits
