diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,10 @@
 # Change Log
 All notable changes to the `monad-memo` project will be documented in this file
 
+## [0.5.4] - 2022-01-04
+### Fixed
+- Fix GHC 9.2.1 build
+
 ## [0.5.3] - 2020-09-21
 ### Fixed
 - `README.md` links
diff --git a/Control/Monad/Memo/Array/Instances.hs b/Control/Monad/Memo/Array/Instances.hs
--- a/Control/Monad/Memo/Array/Instances.hs
+++ b/Control/Monad/Memo/Array/Instances.hs
@@ -12,7 +12,7 @@
 -}
 
 {-# LANGUAGE NoImplicitPrelude, MultiParamTypeClasses,
-  UndecidableInstances, FlexibleInstances #-}
+  UndecidableInstances, FlexibleInstances, FlexibleContexts #-}
 
 module Control.Monad.Memo.Array.Instances
 (
@@ -27,5 +27,5 @@
 
 
 instance MaybeLike (Maybe v) v => ArrayMemo v (Maybe v)
-        
+
 instance MaybeLike v v => UArrayMemo v v
diff --git a/Control/Monad/Memo/Vector/Instances.hs b/Control/Monad/Memo/Vector/Instances.hs
--- a/Control/Monad/Memo/Vector/Instances.hs
+++ b/Control/Monad/Memo/Vector/Instances.hs
@@ -12,12 +12,12 @@
 -}
 
 {-# LANGUAGE NoImplicitPrelude, MultiParamTypeClasses,
-  UndecidableInstances, FlexibleInstances, TypeFamilies #-}
+  UndecidableInstances, FlexibleInstances, TypeFamilies, FlexibleContexts #-}
 
 module Control.Monad.Memo.Vector.Instances
 (
 
-  
+
 ) where
 
 import Data.Maybe
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -2,39 +2,43 @@
 [![Build Status](https://github.com/EduardSergeev/monad-memo/workflows/master/badge.svg)](https://github.com/EduardSergeev/monad-memo/actions?query=workflow%3Amaster+branch%3Amaster)
 [![Test Coverage](https://coveralls.io/repos/github/EduardSergeev/monad-memo/badge.svg)](https://coveralls.io/github/EduardSergeev/monad-memo)
 [![Hackage](https://img.shields.io/hackage/v/monad-memo.svg)](https://hackage.haskell.org/package/monad-memo)
+[![Hackage](https://img.shields.io/badge/dynamic/xml?color=success&label=Downloads&query=substring-before%28%2F%2F%2A%5B%40id%3D%22properties%22%5D%2Ftable%2Ftbody%2Ftr%2Fth%5Btext%28%29%5Bnormalize-space%28.%29%3D%27Downloads%27%5D%5D%2F..%2Ftd%2C%20%27%20%27%29&url=https%3A%2F%2Fhackage.haskell.org%2Fpackage%2Fmonad-memo)](https://hackage.haskell.org/package/monad-memo)
 
 ## Purpose
 This package provides a convenient mechanism for adding memoization to Haskell monadic functions.
 
 ## Memoization
 Memoization is a well known way to speed up function evaluation by caching previously calculated results and reusing them whenever a memoized function is needed to be evaluated with the same arguments again.
-It is usually associated with dynamic programming techiques. 
+It is usually associated with dynamic programming techiques.
 
 ## Overview
 Even though it is possible to manually add memoization to the code which would benefit from it, this ad-hoc approach has usual ad-hoc drawbacks: code pollution, bugs, resistance to changes.
-This package however encapsulates the underlying plumbing behind its simple monadic interface `MonadMemo` with a single combinator `memo` which, when applied to monadic function, turns it into "memoized" one. 
+This package however encapsulates the underlying plumbing behind its simple monadic interface `MonadMemo` with a single combinator `memo` which, when applied to monadic function, turns it into "memoized" one.
 
 The package offers various implementation of `MonadMemo` (which differs in terms of performance and requirements) and it is possible to choose/change the implementation without affecting the main function code.
 The range of supported implementations "out of box" is limited by the range of containers provided by the standard packages installed by [Haskel Platform](http://www.haskell.org/platform/):
 from default pure "fit them all" [Data.Map](http://hackage.haskell.org/packages/archive/containers/latest/doc/html/Data-Map.html) to very fast but limiting [vector](http://hackage.haskell.org/packages/archive/vector/latest/doc/html/Data-Vector-Generic-Mutable.html).
-It is also possible to plug-in a custom container (from a third-party library) and run existing monadic code with it. 
+It is also possible to plug-in a custom container (from a third-party library) and run existing monadic code with it.
 
 The default implementation of `MonadMemo` is also [monad transformer](http://en.wikibooks.org/wiki/Haskell/Monad_transformers) so it can be "mixed" with other monads.
-The package also provides the "memoized" versions of most standard monads found in [mtl](http://hackage.haskell.org/package/mtl). 
+The package also provides the "memoized" versions of most standard monads found in [mtl](http://hackage.haskell.org/package/mtl).
 
 ## Example of usage
 
 A clasic example of function which greatelly benefits from memoization is a recursively defined Fibonacci number function.
 A plain version of this function can be written in the following way:
+
 ```haskell
 fib :: Integer -> Integer
 fib 0 = 0
 fib 1 = 1
 fib n = fib (n-1) + fib (n-2)
 ```
+
 which is very inefficient (impractical for `n>40`).
 
 We can rewrite this definition as a monad:
+
 ```haskell
 fibm :: Monad m => Integer -> m Integer
 fibm 0 = return 0
@@ -44,13 +48,16 @@
   f2 <- fibm (n-2)
   return (f1+f2)
 ```
+
 and even run it with `Identity` monad with identical inefficiency:
+
 ```haskell
 evalFibmId :: Integer -> Integer
 evalFibmId = runIdentity . fibm
 ```
 
 But all we need to do to make this function "computable" for reasonable argument is to add memoization for both recursive branches with `memo` combinator:
+
 ```haskell
 fibm :: (MonadMemo Integer Integer m) => Integer -> m Integer
 fibm 0 = return 0
@@ -60,11 +67,14 @@
   f2 <- memo fibm (n-2)
   return (f1+f2)
 ```
+
 then, to evaluate it with default `Data.Map` based memoization cache we use the following "eval*" function:
+
 ```haskell
 evalFibm :: Integer -> Integer
 evalFibm = startEvalMemo . fibm
 ```
+
 Now the range of the arguments it can handle is limited only by `Integer` computation complexity and stack memory limit.
 
 ## More Examples
@@ -78,7 +88,7 @@
 ackm 0 n = return (n+1)
 ackm m 0 = for2 memo ackm (m-1) 1
 ackm m n = do
-  n1 <- for2 memo ackm m (n-1)    -- 'for2' adapts 'memo' for 2-argument 'ackm' 
+  n1 <- for2 memo ackm m (n-1)    -- 'for2' adapts 'memo' for 2-argument 'ackm'
   for2 memo ackm (m-1) n1
 
 evalAckm :: (Num n, Ord n) => n -> n -> n
@@ -94,7 +104,7 @@
 -- 'f' depends on 'g'
 f :: Int -> (Int,String)
 f 0 = (1,"+")
-f (n+1)	=(g(n,fst(f n)),"-" ++ snd(f n))
+f (n+1) = (g(n,fst(f n)),"-" ++ snd(f n))
 
 -- 'g' depends on 'f'
 g :: (Int, Int) -> Int
@@ -114,7 +124,7 @@
   gn <- memo gm (n , fst fn)
   return (gn , "-" ++ snd fn)
 
-gm (0,m) = return (m+1) 
+gm (0,m) = return (m+1)
 gm (n+1,m) = do
   fn <- memo fm n
   gn <- memo gm (n,m)
@@ -123,10 +133,12 @@
 
 GHC complains:
 
+```text
     "Occurs check: cannot construct the infinite type: t = (t, v)
          Expected type: t
-   
+
          Inferred type: (t, v)"
+```
 
 which is understandable since we are trying to use the same cache for storing "key-value" pairs of the functions of different types (`fm :: Int -> m (Int,String)` and `gm :: (Int, Int) -> m Int`).
 Obviously, to cache both function we will need _two_ caches (even if the types of the functions were identical, it's not very good idea to share the same cache).
@@ -156,7 +168,7 @@
   return (gn , "-" ++ snd fn)
 
 gm :: (Int,Int) -> MemoFG Int
-gm (0,m) = return (m+1) 
+gm (0,m) = return (m+1)
 gm (n+1,m) = do
   fn <- memol0 fm n
   gn <- memol1 gm (n,m)
@@ -185,7 +197,7 @@
 
 -- 2-argument function now
 gm2 :: Int -> Int -> MemoFG Int
-gm2 0 m = return (m+1) 
+gm2 0 m = return (m+1)
 gm2 n m = do
   fn <- memol0 fm2 (n-1)
   gn <- for2 memol1 gm2 (n-1) m   -- 'for2' adapts 'memol1' for 2-argument gm2
@@ -193,7 +205,7 @@
 
 evalFm2 :: Int -> (Int, String)
 evalFm2 = evalAll . fm2
-    
+
 evalGm2 :: Int -> Int -> Int
 evalGm2 n m = evalAll $ gm2 n m
 ```
@@ -245,7 +257,7 @@
 
 Unfortunatelly you cannot always use this `MonadCache` due to array's natural limitations:
 
-* The key must be an instance of [Ix](http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Ix.html#t:Ix) typeclass   
+* The key must be an instance of [Ix](http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Ix.html#t:Ix) typeclass
 * The bounds of the array must be known (and specified) beforehand and array cannot be resized
 * Array is a continious space of values, so if the key distribution is wide and sparse the memory will be wasted (or array may not even fit into memory)
 
@@ -267,6 +279,7 @@
 evalFibmSTA :: Integer -> Integer
 evalFibmSTA n = runST $ evalArrayMemo (fibm n) (0,n)
 ```
+
 here the `(0,n)` argument defines the bounds of cache array.
 Is it equally easy to use unboxed version of the array, but `Integer` cannot be unboxed (it isn't primitive type), so lets just use `Double` for our function result:
 
@@ -274,7 +287,7 @@
 evalFibmSTUA :: Integer -> Double
 evalFibmSTUA n = runST $ evalUArrayMemo (fibm n) (0,n)
 ```
- 
+
 Instead of `ST` you can use `IO` monad:
 
 ```haskell
@@ -291,6 +304,7 @@
 Note however that this `MonadCache` is even more limiting that `ArrayCache` since `vector` supports only `Int` as an index.
 
 The usage is very similar to `ArrayCache`, but instead of range we need to specify the length of the vector:
+
 ```haskell
 evalFibmSTV :: Int -> Integer
 evalFibmSTV n = runST $ evalVectorMemo (fibm n) n
@@ -298,7 +312,9 @@
 evalFibmIOUV :: Int -> IO Double
 evalFibmIOUV n = evalUVectorMemo (fibm n) n
 ```
+
 Use "Expandable" version to avoid specifying length parameter:
+
 ```haskell
 import qualified Control.Monad.Memo.Vector.Expandable as VE
 
@@ -306,24 +322,24 @@
 evalFibmSTVE n = runST $ VE.startEvalVectorMemo (fibm n)
 ```
 
-## Performance of different `MonadCache`'s:
+## Performance of different `MonadCache`'s
 
 The difference in performance for different `MonadCache`'s with Fibonacci function is demonstrated by [this criterion test](benchmark/Main.hs).
 The test runs memoized Fibonacci function using the following caches:
- * default Map-based
- * State-based with Data.IntMap
- * array and unboxed array based (Array and UArray)
- * vector, unsafe vector and expandable vector (both boxed and unboxed vectors)
+* default Map-based
+* State-based with Data.IntMap
+* array and unboxed array based (Array and UArray)
+* vector, unsafe vector and expandable vector (both boxed and unboxed vectors)
 
 ![summary](benchmark/results/fib_memo.png)
 
 Full report can be [found here](http://htmlpreview.github.com/?https://github.com/EduardSergeev/monad-memo/blob/dev/benchmark/results/fib_memo.html).
 
-
 ## Custom mutable cache
 
 It is also possible to use a mutable container as a `MonadCache` not defined here.
 For example if we wish to use mutable hash-table from [hashtables package](http://hackage.haskell.org/package/hashtables) we can do so with the following code:
+
 ```haskell
 {-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, FlexibleInstances #-}
 
@@ -347,7 +363,7 @@
               v <- f k
               lift $ H.insert (toTable c) k v
               return v
-            else return (fromJust e) 
+            else return (fromJust e)
 
 {-# INLINE fib1 #-}
 fibm 0 = return 0
@@ -363,9 +379,8 @@
    evalReaderCache (fibm n) (Container c)
 ```
 
-
 ## References
-* http://www.haskell.org/haskellwiki/Memoization
+* [Memoization Haskell wiki](http://www.haskell.org/haskellwiki/Memoization)
 * ["Monadic Memoization Mixins" by Daniel Brown and William R. Cook](http://www.cs.utexas.edu/~wcook/Drafts/2006/MemoMixins.pdf)
 * [data-memocombinators](http://hackage.haskell.org/packages/archive/data-memocombinators/latest/doc/html/Data-MemoCombinators.html)
 * ["Fun with Type Functions" by Oleg Kiselyov, Ken Shan, and Simon Peyton Jones (see 3.1 - "Type-directed memoization")](http://research.microsoft.com/~simonpj/papers/assoc-types/fun-with-type-funs/typefun.pdf)
diff --git a/monad-memo.cabal b/monad-memo.cabal
--- a/monad-memo.cabal
+++ b/monad-memo.cabal
@@ -1,6 +1,6 @@
 Name:               monad-memo
 
-Version:            0.5.3
+Version:            0.5.4
 
 -- A short (one-line) description of the package.
 Synopsis:           Memoization monad transformer
@@ -53,12 +53,13 @@
 Cabal-version:      >=1.10
 
 Tested-with:
-  GHC==7.8.4,
-  GHC==7.10.3,
-  GHC==8.2.2,
+  GHC==7.8.4
+  GHC==7.10.3
+  GHC==8.2.2
   GHC==8.4.3
   GHC==8.6.5
   GHC==8.8.4
+  GHC==9.2.1
 
 Extra-source-files:
   CHANGELOG.md,
