diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,8 @@
+# 0.0.0.5
+
+Support more recent GHCs, remove some redundant constraints, and obviate the need for the dependency on `hashable`.
+
+
 # 0.0.0.4
 
 Support GHC 8.8.1 and loosen the bounds on `hashable` and `base`.
diff --git a/semilattices.cabal b/semilattices.cabal
--- a/semilattices.cabal
+++ b/semilattices.cabal
@@ -1,5 +1,5 @@
 name:                semilattices
-version:             0.0.0.4
+version:             0.0.0.5
 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
@@ -7,7 +7,7 @@
 license-file:        LICENSE
 author:              Rob Rix
 maintainer:          rob.rix@me.com
-copyright:           2017-2019 Rob Rix
+copyright:           2017-2024 Rob Rix
 category:            Algebra, Data, Data Structures, Math
 build-type:          Simple
 cabal-version:       >=1.10
@@ -35,7 +35,6 @@
   build-depends:
       base >=4.9 && <5
     , containers >=0.5 && <0.7
-    , hashable >=1.2 && <1.4
     , unordered-containers >=0.2 && <0.3
   hs-source-dirs:      src
   default-language:    Haskell2010
@@ -54,6 +53,10 @@
     ghc-options: -Wno-star-is-type
   if (impl(ghc >= 8.8))
     ghc-options: -Wno-missing-deriving-strategies
+  if (impl(ghc >= 8.10))
+    ghc-options: -Wno-missing-safe-haskell-mode
+  if (impl(ghc >= 9.2))
+    ghc-options: -Wno-missing-kind-signatures
 
 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,7 +6,6 @@
 , LessThan(..)
 ) where
 
-import Data.Hashable
 import Data.HashMap.Lazy as HashMap
 import Data.HashSet as HashSet
 import Data.IntMap as IntMap
@@ -269,7 +268,7 @@
 --   Identity:
 --
 --   prop> lowerBound \/ a == (a :: HashMap Char (Set Char))
-instance (Eq k, Hashable k, Join a) => Join (HashMap k a) where
+instance (Eq k, Join a) => Join (HashMap k a) where
   (\/) = HashMap.unionWith (\/)
 
 -- | HashSet union forms a semilattice.
@@ -289,7 +288,7 @@
 --   Identity:
 --
 --   prop> lowerBound \/ a == (a :: HashSet Char)
-instance (Eq a, Hashable a) => Join (HashSet a) where
+instance Eq a => Join (HashSet a) where
   (\/) = HashSet.union
 
 
diff --git a/src/Data/Semilattice/Lower.hs b/src/Data/Semilattice/Lower.hs
--- a/src/Data/Semilattice/Lower.hs
+++ b/src/Data/Semilattice/Lower.hs
@@ -8,9 +8,9 @@
 import Data.Coerce
 import Data.Functor.Const
 import Data.Functor.Identity
-import Data.Int
 import Data.HashMap.Lazy as HashMap
 import Data.HashSet as HashSet
+import Data.Int
 import Data.IntMap as IntMap
 import Data.IntSet as IntSet
 import Data.Map as Map
@@ -25,7 +25,10 @@
 import Foreign.C.Types
 import Foreign.Ptr
 import GHC.Generics
+
+#if !defined(OS_Win32)
 import System.Posix.Types
+#endif
 
 -- | The greatest lower bound of @s@.
 --
@@ -190,6 +193,7 @@
 instance Lower SourceUnpackedness
 instance Lower Associativity
 
+#if !defined(OS_Win32)
 -- System.Posix.Types
 instance Lower Fd
 instance Lower CRLim
@@ -203,6 +207,7 @@
 instance Lower CMode
 instance Lower CIno
 instance Lower CDev
+#endif
 
 #if MIN_VERSION_base(4,10,0)
 instance Lower CKey
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,7 +6,6 @@
 , GreaterThan(..)
 ) where
 
-import Data.Hashable
 import Data.HashMap.Lazy as HashMap
 import Data.HashSet as HashSet
 import Data.IntMap as IntMap
@@ -269,7 +268,7 @@
 --   Absorption:
 --
 --   prop> lowerBound /\ a == (lowerBound :: HashMap Char (Set Char))
-instance (Eq k, Hashable k, Meet a) => Meet (HashMap k a) where
+instance (Eq k, Meet a) => Meet (HashMap k a) where
   (/\) = HashMap.intersectionWith (/\)
 
 -- | HashSet intersection forms a semilattice.
@@ -289,7 +288,7 @@
 --   Absorption:
 --
 --   prop> lowerBound /\ a == (lowerBound :: HashSet Char)
-instance (Eq a, Hashable a) => Meet (HashSet a) where
+instance Eq a => Meet (HashSet a) where
   (/\) = HashSet.intersection
 
 
diff --git a/src/Data/Semilattice/Upper.hs b/src/Data/Semilattice/Upper.hs
--- a/src/Data/Semilattice/Upper.hs
+++ b/src/Data/Semilattice/Upper.hs
@@ -18,7 +18,10 @@
 import Foreign.C.Types
 import Foreign.Ptr
 import GHC.Generics
+
+#if !defined(OS_Win32)
 import System.Posix.Types
+#endif
 
 -- | The least upper bound of @s@.
 --
@@ -176,6 +179,7 @@
 instance Upper SourceUnpackedness
 instance Upper Associativity
 
+#if !defined(OS_Win32)
 -- System.Posix.Types
 instance Upper Fd
 instance Upper CRLim
@@ -189,6 +193,7 @@
 instance Upper CMode
 instance Upper CIno
 instance Upper CDev
+#endif
 
 #if MIN_VERSION_base(4,10,0)
 instance Upper CKey
