diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,8 @@
+# 0.0.0.6
+
+Fix broken builds on GHC <= 9.2.
+
+
 # 0.0.0.5
 
 Support more recent GHCs, remove some redundant constraints, and obviate the need for the dependency on `hashable`.
diff --git a/semilattices.cabal b/semilattices.cabal
--- a/semilattices.cabal
+++ b/semilattices.cabal
@@ -1,5 +1,5 @@
 name:                semilattices
-version:             0.0.0.5
+version:             0.0.0.6
 synopsis:            Semilattices
 description:         Join- and meet-semilattices, with optional upper and lower bounds, and a variety of instances for each.
 homepage:            https://github.com/robrix/semilattices
@@ -35,6 +35,7 @@
   build-depends:
       base >=4.9 && <5
     , containers >=0.5 && <0.7
+    , hashable >=1.2 && <1.5
     , unordered-containers >=0.2 && <0.3
   hs-source-dirs:      src
   default-language:    Haskell2010
@@ -57,6 +58,9 @@
     ghc-options: -Wno-missing-safe-haskell-mode
   if (impl(ghc >= 9.2))
     ghc-options: -Wno-missing-kind-signatures
+  -- recent unordered-containers versions don't require Hashable for unionWith.
+  if (impl(ghc >= 9.4))
+    ghc-options: -Wno-redundant-constraints
 
 test-suite doctests
   type:                exitcode-stdio-1.0
diff --git a/src/Data/Semilattice/Join.hs b/src/Data/Semilattice/Join.hs
--- a/src/Data/Semilattice/Join.hs
+++ b/src/Data/Semilattice/Join.hs
@@ -6,6 +6,7 @@
 , LessThan(..)
 ) where
 
+import Data.Hashable
 import Data.HashMap.Lazy as HashMap
 import Data.HashSet as HashSet
 import Data.IntMap as IntMap
@@ -268,7 +269,7 @@
 --   Identity:
 --
 --   prop> lowerBound \/ a == (a :: HashMap Char (Set Char))
-instance (Eq k, Join a) => Join (HashMap k a) where
+instance (Eq k, Hashable k, Join a) => Join (HashMap k a) where
   (\/) = HashMap.unionWith (\/)
 
 -- | HashSet union forms a semilattice.
@@ -288,7 +289,7 @@
 --   Identity:
 --
 --   prop> lowerBound \/ a == (a :: HashSet Char)
-instance Eq a => Join (HashSet a) where
+instance (Eq a, Hashable a) => Join (HashSet a) where
   (\/) = HashSet.union
 
 
diff --git a/src/Data/Semilattice/Meet.hs b/src/Data/Semilattice/Meet.hs
--- a/src/Data/Semilattice/Meet.hs
+++ b/src/Data/Semilattice/Meet.hs
@@ -6,6 +6,7 @@
 , GreaterThan(..)
 ) where
 
+import Data.Hashable
 import Data.HashMap.Lazy as HashMap
 import Data.HashSet as HashSet
 import Data.IntMap as IntMap
@@ -268,7 +269,7 @@
 --   Absorption:
 --
 --   prop> lowerBound /\ a == (lowerBound :: HashMap Char (Set Char))
-instance (Eq k, Meet a) => Meet (HashMap k a) where
+instance (Eq k, Hashable k, Meet a) => Meet (HashMap k a) where
   (/\) = HashMap.intersectionWith (/\)
 
 -- | HashSet intersection forms a semilattice.
@@ -288,7 +289,7 @@
 --   Absorption:
 --
 --   prop> lowerBound /\ a == (lowerBound :: HashSet Char)
-instance Eq a => Meet (HashSet a) where
+instance (Eq a, Hashable a) => Meet (HashSet a) where
   (/\) = HashSet.intersection
 
 
