diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+0.9.1
+------------------------------------------------
+
+* Supported GHCs up to 9.8 ([#38](https://github.com/fumieval/extensible/pull/38) by [@kgtkr](https://github.com/kgtkr))
+* Exported `Assoc`, `(>:)`, and `Lookup` from `Data.Extensible.Effect`
+* Added `coinclusionAssoc`, `wrenchAssoc`, and `retrenchAssoc` ([#36](https://github.com/fumieval/extensible/pull/36) by [@At-sushi](https://github.com/At-sushi))
+
 0.9
 ------------------------------------------------
 
diff --git a/extensible.cabal b/extensible.cabal
--- a/extensible.cabal
+++ b/extensible.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.4
 name:                extensible
-version:             0.9
+version:             0.9.1
 synopsis:            Extensible, efficient, optics-friendly data types and effects
 homepage:            https://github.com/fumieval/extensible
 bug-reports:         http://github.com/fumieval/extensible/issues
@@ -80,7 +80,7 @@
     , CPP
     , NoStarIsType
   build-depends:       base >= 4.8 && <5
-    , aeson >= 1.5 && <2.1
+    , aeson >= 1.5 && <2.3
     , bytestring
     , comonad
     , constraints
diff --git a/src/Data/Extensible/Nullable.hs b/src/Data/Extensible/Nullable.hs
--- a/src/Data/Extensible/Nullable.hs
+++ b/src/Data/Extensible/Nullable.hs
@@ -15,7 +15,10 @@
   , retrench
   , Nullable(..)
   , mapNullable
-  , fromNullable) where
+  , fromNullable
+  , coinclusionAssoc
+  , wrenchAssoc
+  , retrenchAssoc) where
 
 import Control.DeepSeq (NFData)
 import Data.Extensible.Class
@@ -80,3 +83,22 @@
 fromNullable :: h x -> Nullable h x -> h x
 fromNullable def = fromMaybe def . getNullable
 {-# INLINE fromNullable #-}
+
+------------------------------------------------------------------
+
+-- | The inverse of 'inclusionAssoc'.
+coinclusionAssoc :: (IncludeAssoc ys xs, Generate ys) => ys :& Nullable (Membership xs)
+coinclusionAssoc = S.hfrozen $ do
+  s <- S.newRepeat $ Nullable Nothing
+  hfoldrWithIndex
+    (\i m cont -> S.set s m (Nullable $ Just i) >> cont) (return s) inclusionAssoc
+
+-- | Extend a product and fill missing fields by 'Null'.
+wrenchAssoc :: (Generate ys, IncludeAssoc ys xs) => xs :& h -> ys :& Nullable h
+wrenchAssoc xs = mapNullable (flip hlookup xs) `hmap` coinclusionAssoc
+{-# INLINE wrenchAssoc #-}
+
+-- | Narrow the range of the sum, if possible.
+retrenchAssoc :: (Generate ys, IncludeAssoc ys xs) => ys :/ h -> Nullable ((:/) xs) h
+retrenchAssoc (EmbedAt i h) = views (pieceAt i) (mapNullable (`EmbedAt`h)) coinclusionAssoc
+{-# INLINE retrenchAssoc #-}
