diff --git a/ChangeLog.md b/ChangeLog.md
new file mode 100644
--- /dev/null
+++ b/ChangeLog.md
@@ -0,0 +1,15 @@
+0.9.1
+===
+* GHC 9.0.1 support
+* API fixes
+
+0.8.0
+=====
+
+* GHC 8.10.2 support
+* Removed hmatrix support. See [numhask-hmatrix](https://github.com/tonyday567/numhask-hmatrix)
+
+0.7.0
+=====
+
+* GHC 8.10.1 support
diff --git a/Setup.hs b/Setup.hs
--- a/Setup.hs
+++ b/Setup.hs
@@ -1,2 +1,3 @@
 import Distribution.Simple
+
 main = defaultMain
diff --git a/numhask-array.cabal b/numhask-array.cabal
--- a/numhask-array.cabal
+++ b/numhask-array.cabal
@@ -1,8 +1,8 @@
 cabal-version: 2.4
 name:          numhask-array
-version:       0.9.0
+version:       0.9.1
 synopsis:
-    Multi-dimensional array interface for numhask.
+    Multi-dimensional arrays.
 description:
     This package provides an interface into the [numhask](https://hackage.haskell.org/package/numhask) API, and both type- and value-level shape manipulation routines.
     .
@@ -35,11 +35,14 @@
 license-file:
   LICENSE
 tested-with:
-  GHC==8.10.1 GHC==9.0.1
+   GHC ==8.8.4
+   || ==8.10.4
+   || ==9.0.1
+   || ==9.2.0.20210821
 build-type:
   Simple
 extra-source-files:
-  readme.md
+  ChangeLog.md
 source-repository head
   type:
     git
@@ -69,24 +72,3 @@
     NumHask.Array.Dynamic
     NumHask.Array.Shape
   default-language: Haskell2010
-test-suite test
-  type:
-    exitcode-stdio-1.0
-  main-is:
-    test.hs
-  hs-source-dirs:
-    test
-  default-extensions:
-  build-depends:
-    base >=4.11 && <5,
-    doctest >=0.13 && <0.19,
-    numhask-array
-  default-language: Haskell2010
-  ghc-options:
-    -Wall
-    -Wcompat
-    -Wincomplete-record-updates
-    -Wincomplete-uni-patterns
-    -Wredundant-constraints
-    -fwrite-ide-info
-    -hiedir=.hie
diff --git a/readme.md b/readme.md
deleted file mode 100644
--- a/readme.md
+++ /dev/null
@@ -1,32 +0,0 @@
-numhask-array
-===
-
-[![Build Status](https://travis-ci.org/tonyday567/numhask.svg)](https://travis-ci.org/tonyday567/numhask) 
-[![Hackage](https://img.shields.io/hackage/v/numhask-array.svg)](https://hackage.haskell.org/package/numhask-array) 
-
-This package provides an interface into the numhask API, and both type and value level shape manipulation routines.
-
-Usage
-===
-
-``` haskell
-{-# LANGUAGE NegativeLiterals #-}
-{-# LANGUAGE RebindableSyntax #-}
-import NumHask.Prelude
-import NumHask.Array
-```
-
-In situations where shape is only known at runtime, a clear module configuration is:
-
-``` haskell
-import NumHask.Array.Shape
-import qualified NumHask.Array.Fixed as F
-import qualified NumHask.Array.Dynamic as D
-```
-
-Performance
-===
-
-Performance experiments are located in [numhask-bench](https://github.com/tonyday567/numhask-bench). [numhask-hmatrix](https://github.com/tonyday567/numhask-hmatrix) provides a more performant and similar interface.
-
-
diff --git a/src/NumHask/Array/Dynamic.hs b/src/NumHask/Array/Dynamic.hs
--- a/src/NumHask/Array/Dynamic.hs
+++ b/src/NumHask/Array/Dynamic.hs
@@ -11,16 +11,17 @@
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE NoStarIsType #-}
 {-# OPTIONS_GHC -Wno-redundant-constraints #-}
-{-# OPTIONS_GHC -fno-warn-incomplete-uni-patterns #-}
 {-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}
+{-# OPTIONS_GHC -fno-warn-incomplete-uni-patterns #-}
 
 -- | Arrays with a dynamic shape.
 module NumHask.Array.Dynamic
-  ( -- $setup
+  ( -- $usage
     Array (..),
 
     -- * Conversion
     fromFlatList,
+    toFlatList,
 
     -- * representable replacements
     index,
@@ -36,6 +37,7 @@
     selectsExcept,
     folds,
     extracts,
+    extractsExcept,
     joins,
     maps,
     concatenate,
@@ -78,11 +80,29 @@
 -- >>> :set -XOverloadedLists
 -- >>> :set -XTypeFamilies
 -- >>> :set -XFlexibleContexts
+-- >>> :set -XRebindableSyntax
+-- >>> import NumHask.Prelude
+-- >>> import NumHask.Array.Dynamic
+-- >>> import NumHask.Array.Shape
 -- >>> let s = fromFlatList [] [1] :: Array Int
 -- >>> let a = fromFlatList [2,3,4] [1..24] :: Array Int
 -- >>> let v = fromFlatList [3] [1,2,3] :: Array Int
 -- >>> let m = fromFlatList [3,4] [0..11] :: Array Int
 
+-- $usage
+-- >>> :set -XDataKinds
+-- >>> :set -XOverloadedLists
+-- >>> :set -XTypeFamilies
+-- >>> :set -XFlexibleContexts
+-- >>> :set -XRebindableSyntax
+-- >>> import NumHask.Prelude
+-- >>> import NumHask.Array.Dynamic
+-- >>> import NumHask.Array.Shape
+-- >>> let s = fromFlatList [] [1] :: Array Int
+-- >>> let a = fromFlatList [2,3,4] [1..24] :: Array Int
+-- >>> let v = fromFlatList [3] [1,2,3] :: Array Int
+-- >>> let m = fromFlatList [3,4] [0..11] :: Array Int
+
 -- | a multidimensional array with a value-level shape
 --
 -- >>> let a = fromFlatList [2,3,4] [1..24] :: Array Int
@@ -424,7 +444,6 @@
 -- >>> contract sum [1,2] (apply (fmap (*) b) (transpose b))
 -- [[14, 32],
 --  [32, 77]]
---
 apply ::
   Array (a -> b) ->
   Array a ->
@@ -549,7 +568,7 @@
 -- | Convert a number to a scalar.
 --
 -- >>> :t toScalar 2
--- toScalar 2 :: Num a => Array a
+-- toScalar 2 :: FromInteger a => Array a
 toScalar :: a -> Array a
 toScalar a = fromFlatList [] [a]
 
diff --git a/src/NumHask/Array/Fixed.hs b/src/NumHask/Array/Fixed.hs
--- a/src/NumHask/Array/Fixed.hs
+++ b/src/NumHask/Array/Fixed.hs
@@ -15,12 +15,12 @@
 {-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE NoStarIsType #-}
 {-# OPTIONS_GHC -Wno-redundant-constraints #-}
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
 {-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
 
 -- | Arrays with a fixed shape.
 module NumHask.Array.Fixed
-  ( -- $setup
+  ( -- $usage
     Array (..),
 
     -- * Conversion
@@ -38,6 +38,7 @@
     selectsExcept,
     folds,
     extracts,
+    extractsExcept,
     joins,
     maps,
     concatenate,
@@ -82,6 +83,7 @@
 import Data.Distributive (Distributive (..))
 import Data.Functor.Rep
 import Data.List ((!!))
+import Data.Proxy
 import qualified Data.Vector as V
 import GHC.Exts (IsList (..))
 import GHC.Show (Show (..))
@@ -89,22 +91,42 @@
 import qualified NumHask.Array.Dynamic as D
 import NumHask.Array.Shape
 import NumHask.Prelude as P hiding (toList)
-import Data.Proxy
 
 -- $setup
+--
 -- >>> :set -XDataKinds
 -- >>> :set -XOverloadedLists
 -- >>> :set -XTypeFamilies
 -- >>> :set -XFlexibleContexts
+-- >>> :set -XRebindableSyntax
+-- >>> import NumHask.Prelude
+-- >>> import GHC.TypeLits (Nat)
+-- >>> import Data.Proxy
+-- >>> import Data.Functor.Rep
 -- >>> let s = [1] :: Array ('[] :: [Nat]) Int -- scalar
 -- >>> let v = [1,2,3] :: Array '[3] Int       -- vector
 -- >>> let m = [0..11] :: Array '[3,4] Int     -- matrix
 -- >>> let a = [1..24] :: Array '[2,3,4] Int
 
--- | a multidimensional array with a type-level shape
+-- $usage
 --
+-- >>> :set -XDataKinds
+-- >>> :set -XOverloadedLists
+-- >>> :set -XTypeFamilies
+-- >>> :set -XFlexibleContexts
+-- >>> :set -XRebindableSyntax
+-- >>> import NumHask.Prelude
+-- >>> import NumHask.Array.Fixed
+-- >>> import GHC.TypeLits (Nat)
+-- >>> let s = [1] :: Array ('[] :: [Nat]) Int -- scalar
+-- >>> let v = [1,2,3] :: Array '[3] Int       -- vector
+-- >>> let m = [0..11] :: Array '[3,4] Int     -- matrix
 -- >>> let a = [1..24] :: Array '[2,3,4] Int
--- >>> a
+
+-- | a multidimensional array with a type-level shape
+--
+-- >>> :set -XDataKinds
+-- >>> [1..24] :: Array '[2,3,4] Int
 -- [[[1, 2, 3, 4],
 --   [5, 6, 7, 8],
 --   [9, 10, 11, 12]],
@@ -248,6 +270,7 @@
 
 -- | Use a dynamic array in a fixed context.
 --
+-- >>> import qualified NumHask.Array.Dynamic as D
 -- >>> with (D.fromFlatList [2,3,4] [1..24]) (selects (Proxy :: Proxy '[0,1]) [1,1] :: Array '[2,3,4] Int -> Array '[4] Int)
 -- [17, 18, 19, 20]
 with ::
@@ -658,7 +681,6 @@
 -- >>> contract sum (Proxy :: Proxy '[1,2]) (apply (fmap (*) b) (transpose b))
 -- [[14, 32],
 --  [32, 77]]
---
 apply ::
   forall s s' a b.
   ( HasShape s,
@@ -914,7 +936,7 @@
 -- | Convert a number to a scalar.
 --
 -- >>> :t toScalar 2
--- toScalar 2 :: Num a => Array '[] a
+-- toScalar 2 :: FromInteger a => Array '[] a
 toScalar :: (HasShape ('[] :: [Nat])) => a -> Array ('[] :: [Nat]) a
 toScalar a = fromList [a]
 
@@ -1023,4 +1045,3 @@
     n = fromIntegral $ natVal @n Proxy
     k = fromIntegral $ natVal @k Proxy
 {-# INLINE mmult #-}
-
diff --git a/src/NumHask/Array/Shape.hs b/src/NumHask/Array/Shape.hs
--- a/src/NumHask/Array/Shape.hs
+++ b/src/NumHask/Array/Shape.hs
@@ -77,11 +77,19 @@
   )
 where
 
+import Data.Proxy
 import Data.Type.Bool
+import Data.Type.Equality
 import GHC.TypeLits as L
 import NumHask.Prelude as P hiding (Last, minimum)
-import Data.Proxy
-import Data.Type.Equality
+
+-- $setup
+-- >>> :set -XDataKinds
+-- >>> :set -XOverloadedLists
+-- >>> :set -XTypeFamilies
+-- >>> :set -XFlexibleContexts
+-- >>> :set -XRebindableSyntax
+-- >>> import NumHask.Prelude
 
 -- | The Shape type holds a [Nat] at type level and the equivalent [Int] at value level.
 -- Using [Int] as the index for an array nicely represents the practical interests and constraints downstream of this high-level API: densely-packed numbers (reals or integrals), indexed and layered.
diff --git a/test/test.hs b/test/test.hs
deleted file mode 100644
--- a/test/test.hs
+++ /dev/null
@@ -1,19 +0,0 @@
-{-# LANGUAGE DataKinds #-}
-{-# LANGUAGE FlexibleContexts #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# OPTIONS_GHC -Wall #-}
-
-module Main where
-
-import Prelude as P
-import Test.DocTest
-
-main :: IO ()
-main = do
-  putStrLn "NumHask.Array.Fixed DocTest turned on"
-  doctest ["src/NumHask/Array/Fixed.hs"]
-  putStrLn "NumHask.Array.Shape DocTest turned on"
-  doctest ["src/NumHask/Array/Shape.hs"]
-  putStrLn "NumHask.Array.Dynamic DocTest turned on"
-  doctest ["src/NumHask/Array/Dynamic.hs"]
