diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright John Ky (c) 2016
+Copyright John Ky (c) 2016-2019
 
 All rights reserved.
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,2 +1,3 @@
 # hw-balancedparens
-[![0.0-branch](https://circleci.com/gh/haskell-works/hw-balancedparens/tree/0.0-branch.svg?style=svg)](https://circleci.com/gh/haskell-works/hw-balancedparens/tree/0.0-branch)
+
+[![CircleCI](https://circleci.com/gh/haskell-works/hw-balancedparens.svg?style=svg)](https://circleci.com/gh/haskell-works/hw-balancedparens)
diff --git a/bench/Main.hs b/bench/Main.hs
--- a/bench/Main.hs
+++ b/bench/Main.hs
@@ -2,21 +2,26 @@
 
 module Main where
 
-import           Criterion.Main
-import qualified Data.Vector.Storable                                   as DVS
-import           Data.Word
-import           HaskellWorks.Data.BalancedParens.FindClose
-import           HaskellWorks.Data.BalancedParens.RangeMinMax
-import           HaskellWorks.Data.Bits.Broadword
-import           HaskellWorks.Data.Bits.FromBitTextByteString
-import           HaskellWorks.Data.Naive
+import Criterion.Main
+import Data.Word
+import HaskellWorks.Data.BalancedParens.FindClose
+import HaskellWorks.Data.Bits.Broadword
+import HaskellWorks.Data.Bits.FromBitTextByteString
+import HaskellWorks.Data.Naive
 
+import qualified Data.Vector.Storable                          as DVS
+import qualified HaskellWorks.Data.BalancedParens.RangeMinMax  as RMM
+import qualified HaskellWorks.Data.BalancedParens.RangeMinMax2 as RMM2
+
 setupEnvVector :: Int -> IO (DVS.Vector Word64)
 setupEnvVector n = return $ DVS.fromList (take n (cycle [maxBound, 0]))
 
-setupEnvRmmVector :: Int -> IO (RangeMinMax (DVS.Vector Word64))
-setupEnvRmmVector n = return $ mkRangeMinMax $ DVS.fromList (take n (cycle [maxBound, 0]))
+setupEnvRmmVector :: Int -> IO (RMM.RangeMinMax (DVS.Vector Word64))
+setupEnvRmmVector n = return $ RMM.mkRangeMinMax $ DVS.fromList (take n (cycle [maxBound, 0]))
 
+setupEnvRmm2Vector :: Int -> IO (RMM2.RangeMinMax2 (DVS.Vector Word64))
+setupEnvRmm2Vector n = return $ RMM2.mkRangeMinMax2 $ DVS.fromList (take n (cycle [maxBound, 0]))
+
 setupEnvBP2 :: IO Word64
 setupEnvBP2 = return $ DVS.head (fromBitTextByteString "10")
 
@@ -61,7 +66,13 @@
     [ bench "Broadword"     (whnf (findClose (Broadword w)) 1)
     , bench "Naive"         (whnf (findClose (Naive     w)) 1)
     ]
-  , env (setupEnvVector 1000000) $ \bv -> bgroup "RangeMinMax"
+  , env (setupEnvVector 1000000) $ \bv -> bgroup "Vanilla"
+    [ bench "findClose"   (nf   (map (findClose bv)) [0, 1000..10000000])
+    ]
+  , env (setupEnvRmmVector 1000000) $ \bv -> bgroup "RangeMinMax"
+    [ bench "findClose"   (nf   (map (findClose bv)) [0, 1000..10000000])
+    ]
+  , env (setupEnvRmm2Vector 1000000) $ \bv -> bgroup "RangeMinMax2"
     [ bench "findClose"   (nf   (map (findClose bv)) [0, 1000..10000000])
     ]
   ]
diff --git a/hw-balancedparens.cabal b/hw-balancedparens.cabal
--- a/hw-balancedparens.cabal
+++ b/hw-balancedparens.cabal
@@ -1,9 +1,7 @@
--- This file has been generated from package.yaml by hpack version 0.18.1.
---
--- see: https://github.com/sol/hpack
+cabal-version:  2.2
 
 name:           hw-balancedparens
-version:        0.2.0.2
+version:        0.2.0.3
 synopsis:       Balanced parentheses
 description:    Balanced parentheses.
 category:       Data, Bit, Succinct Data Structures, Data Structures
@@ -11,84 +9,93 @@
 bug-reports:    https://github.com/haskell-works/hw-balancedparens/issues
 author:         John Ky
 maintainer:     newhoggy@gmail.com
-copyright:      2016 John Ky
-license:        BSD3
+copyright:      2016-2019 John Ky
+license:        BSD-3-Clause
 license-file:   LICENSE
-tested-with:    GHC == 8.4.2, GHC == 8.2.2, GHC == 8.0.2, GHC == 7.10.3
+tested-with:    GHC == 8.6.5, GHC == 8.4.4, GHC == 8.2.2
 build-type:     Simple
-cabal-version:  >= 1.10
-
 extra-source-files:
-    README.md
+  README.md
 
 source-repository head
-  type: git
+  type:     git
   location: https://github.com/haskell-works/hw-balancedparens
 
+common base               { build-depends: base                 >= 4        && < 5      }
+
+common QuickCheck         { build-depends: QuickCheck           >= 2.10     && < 2.12   }
+common criterion          { build-depends: criterion            >= 1.2      && < 1.6    }
+common deepseq            { build-depends: deepseq              >= 1.4.2.0  && < 1.5    }
+common hspec              { build-depends: hspec                >= 2.2      && < 2.6    }
+common hw-bits            { build-depends: hw-bits              >= 0.4.0.0  && < 0.8    }
+common hw-excess          { build-depends: hw-excess            >= 0.2.0.3  && < 0.3    }
+common hw-prim            { build-depends: hw-prim              >= 0.4.0.0  && < 0.7    }
+common hw-rankselect-base { build-depends: hw-rankselect-base   >= 0.2.0.0  && < 0.4    }
+common vector             { build-depends: vector               >= 0.12     && < 0.13   }
+
+common config
+  default-language:   Haskell2010
+  ghc-options:        -Wall -O2 -msse4.2
+
 library
-  hs-source-dirs:
-      src
-  ghc-options: -Wall -O2 -msse4.2
-  build-depends:
-      base >=4 && <5
-    , hw-bits >=0.4.0.0 && < 0.8
-    , hw-prim >=0.4.0.0 && < 0.7
-    , vector >= 0.12 && < 0.13
-    , hw-excess >=0.2.0.0 && < 0.3
-    , hw-rankselect-base >=0.2.0.0 && < 0.4
+  import:   base, config
+          , deepseq
+          , hw-bits
+          , hw-excess
+          , hw-prim
+          , hw-rankselect-base
+          , vector
   exposed-modules:
-      HaskellWorks.Data.BalancedParens
-      HaskellWorks.Data.BalancedParens.BalancedParens
-      HaskellWorks.Data.BalancedParens.Broadword
-      HaskellWorks.Data.BalancedParens.CloseAt
-      HaskellWorks.Data.BalancedParens.Enclose
-      HaskellWorks.Data.BalancedParens.FindClose
-      HaskellWorks.Data.BalancedParens.FindCloseN
-      HaskellWorks.Data.BalancedParens.FindOpen
-      HaskellWorks.Data.BalancedParens.FindOpenN
-      HaskellWorks.Data.BalancedParens.NewCloseAt
-      HaskellWorks.Data.BalancedParens.NewOpenAt
-      HaskellWorks.Data.BalancedParens.OpenAt
-      HaskellWorks.Data.BalancedParens.RangeMinMax
-      HaskellWorks.Data.BalancedParens.RangeMinMax2
-      HaskellWorks.Data.BalancedParens.Simple
-  other-modules:
-      Paths_hw_balancedparens
-  default-language: Haskell2010
+    HaskellWorks.Data.BalancedParens
+    HaskellWorks.Data.BalancedParens.BalancedParens
+    HaskellWorks.Data.BalancedParens.Broadword
+    HaskellWorks.Data.BalancedParens.CloseAt
+    HaskellWorks.Data.BalancedParens.Enclose
+    HaskellWorks.Data.BalancedParens.FindClose
+    HaskellWorks.Data.BalancedParens.FindCloseN
+    HaskellWorks.Data.BalancedParens.FindOpen
+    HaskellWorks.Data.BalancedParens.FindOpenN
+    HaskellWorks.Data.BalancedParens.NewCloseAt
+    HaskellWorks.Data.BalancedParens.NewOpenAt
+    HaskellWorks.Data.BalancedParens.OpenAt
+    HaskellWorks.Data.BalancedParens.RangeMinMax
+    HaskellWorks.Data.BalancedParens.RangeMinMax2
+    HaskellWorks.Data.BalancedParens.Simple
+  other-modules:      Paths_hw_balancedparens
+  autogen-modules:    Paths_hw_balancedparens
+  hs-source-dirs:     src
 
 test-suite hw-balancedparens-test
-  type: exitcode-stdio-1.0
-  main-is: Spec.hs
-  hs-source-dirs:
-      test
-  ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N
-  build-depends:
-      base >=4 && <5
-    , hw-bits >=0.4.0.0 && < 0.8
-    , hw-prim >=0.4.0.0 && < 0.7
-    , vector >= 0.12 && < 0.13
-    , hspec >= 2.2 && < 2.6
-    , hw-balancedparens
-    , hw-rankselect-base >=0.2.0.0 && < 0.4
-    , QuickCheck >= 2.10 && < 2.12
+  import:   base, config
+          , QuickCheck
+          , hspec
+          , hw-bits
+          , hw-prim
+          , hw-rankselect-base
+          , vector
+  type:               exitcode-stdio-1.0
+  main-is:            Spec.hs
   other-modules:
       HaskellWorks.Data.BalancedParens.Internal.BroadwordSpec
       HaskellWorks.Data.BalancedParens.RangeMinMax2Spec
       HaskellWorks.Data.BalancedParens.RangeMinMaxSpec
       HaskellWorks.Data.BalancedParens.SimpleSpec
-  default-language: Haskell2010
+      Paths_hw_balancedparens
+  hs-source-dirs:     test
+  ghc-options:        -threaded -rtsopts -with-rtsopts=-N
+  build-depends:      hw-balancedparens
+  autogen-modules:    Paths_hw_balancedparens
+  build-tool-depends: hspec-discover:hspec-discover
 
 benchmark bench
-  type: exitcode-stdio-1.0
-  main-is: Main.hs
-  hs-source-dirs:
-      bench
-  ghc-options: -Wall -O2 -msse4.2
-  build-depends:
-      base >=4 && <5
-    , hw-bits >=0.4.0.0 && < 0.8
-    , hw-prim >=0.4.0.0 && < 0.7
-    , vector >= 0.12 && < 0.13
-    , criterion >= 1.2 && < 1.5
-    , hw-balancedparens
-  default-language: Haskell2010
+  import:   base, config
+          , criterion
+          , hw-bits
+          , hw-prim
+          , vector
+  type:               exitcode-stdio-1.0
+  main-is:            Main.hs
+  other-modules:      Paths_hw_balancedparens
+  autogen-modules:    Paths_hw_balancedparens
+  hs-source-dirs:     bench
+  build-depends:      hw-balancedparens
diff --git a/src/HaskellWorks/Data/BalancedParens/RangeMinMax.hs b/src/HaskellWorks/Data/BalancedParens/RangeMinMax.hs
--- a/src/HaskellWorks/Data/BalancedParens/RangeMinMax.hs
+++ b/src/HaskellWorks/Data/BalancedParens/RangeMinMax.hs
@@ -1,4 +1,6 @@
 {-# LANGUAGE BangPatterns      #-}
+{-# LANGUAGE DeriveAnyClass    #-}
+{-# LANGUAGE DeriveGeneric     #-}
 {-# LANGUAGE FlexibleContexts  #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE InstanceSigs      #-}
@@ -9,7 +11,9 @@
   , mkRangeMinMax
   ) where
 
+import Control.DeepSeq
 import Data.Int
+import GHC.Generics
 import HaskellWorks.Data.AtIndex
 import HaskellWorks.Data.BalancedParens.BalancedParens
 import HaskellWorks.Data.BalancedParens.CloseAt
@@ -44,7 +48,7 @@
   , rangeMinMaxL2Min    :: !(DVS.Vector Int16)
   , rangeMinMaxL2Max    :: !(DVS.Vector Int16)
   , rangeMinMaxL2Excess :: !(DVS.Vector Int16)
-  }
+  } deriving (NFData, Generic)
 
 factorL0 :: Integral a => a
 factorL0 = 1
diff --git a/src/HaskellWorks/Data/BalancedParens/RangeMinMax2.hs b/src/HaskellWorks/Data/BalancedParens/RangeMinMax2.hs
--- a/src/HaskellWorks/Data/BalancedParens/RangeMinMax2.hs
+++ b/src/HaskellWorks/Data/BalancedParens/RangeMinMax2.hs
@@ -1,8 +1,10 @@
-{-# LANGUAGE BangPatterns       #-}
-{-# LANGUAGE FlexibleContexts   #-}
-{-# LANGUAGE FlexibleInstances  #-}
-{-# LANGUAGE InstanceSigs       #-}
-{-# LANGUAGE TypeFamilies       #-}
+{-# LANGUAGE BangPatterns      #-}
+{-# LANGUAGE DeriveAnyClass    #-}
+{-# LANGUAGE DeriveGeneric     #-}
+{-# LANGUAGE FlexibleContexts  #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE InstanceSigs      #-}
+{-# LANGUAGE TypeFamilies      #-}
 
 module HaskellWorks.Data.BalancedParens.RangeMinMax2
   ( RangeMinMax2(..)
@@ -11,7 +13,9 @@
   , genMax
   ) where
 
+import Control.DeepSeq
 import Data.Int
+import GHC.Generics
 import HaskellWorks.Data.AtIndex
 import HaskellWorks.Data.BalancedParens.BalancedParens
 import HaskellWorks.Data.BalancedParens.CloseAt
@@ -20,8 +24,8 @@
 import HaskellWorks.Data.BalancedParens.FindCloseN
 import HaskellWorks.Data.BalancedParens.FindOpen
 import HaskellWorks.Data.BalancedParens.FindOpenN
-import HaskellWorks.Data.BalancedParens.OpenAt
 import HaskellWorks.Data.BalancedParens.NewCloseAt
+import HaskellWorks.Data.BalancedParens.OpenAt
 import HaskellWorks.Data.Bits.AllExcess.AllExcess1
 import HaskellWorks.Data.Bits.BitLength
 import HaskellWorks.Data.Bits.BitWise
@@ -31,7 +35,7 @@
 import HaskellWorks.Data.RankSelect.Base.Rank0
 import HaskellWorks.Data.RankSelect.Base.Rank1
 import HaskellWorks.Data.Vector.AsVector64
-import Prelude hiding (length)
+import Prelude                                         hiding (length)
 
 import qualified Data.Vector          as DV
 import qualified Data.Vector.Storable as DVS
@@ -53,7 +57,7 @@
   , rangeMinMax2L4Min    :: !(DVS.Vector Int16)
   , rangeMinMax2L4Max    :: !(DVS.Vector Int16)
   , rangeMinMax2L4Excess :: !(DVS.Vector Int16)
-  }
+  } deriving (NFData, Generic)
 
 factorL0 :: Integral a => a
 factorL0 = 1
