diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,15 @@
 Changelog
 =========
 
+Version 0.3.1.0
+---------------
+
+*July 4, 2023*
+
+<https://github.com/mstksg/functor-products/releases/tag/v0.3.1.0>
+
+*   Now requires singletons-3.0 and above, and GHC 9.2 and above
+
 Version 0.3.0.0
 ---------------
 
diff --git a/decidable.cabal b/decidable.cabal
--- a/decidable.cabal
+++ b/decidable.cabal
@@ -1,13 +1,11 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.31.2.
+-- This file has been generated from package.yaml by hpack version 0.35.2.
 --
 -- see: https://github.com/sol/hpack
---
--- hash: d32fc68e2c0f9fc18f6d1c665774f308fc7e98fa1f9d71d0de5ffe287b57bae7
 
 name:           decidable
-version:        0.3.0.0
+version:        0.3.1.0
 synopsis:       Combinators for manipulating dependently-typed predicates.
 description:    This library provides combinators and typeclasses for working and manipulating
                 type-level predicates in Haskell, which are represented as matchable type-level
@@ -22,8 +20,9 @@
 copyright:      (c) Justin Le 2018
 license:        BSD3
 license-file:   LICENSE
-tested-with:    GHC >= 8.8
 build-type:     Simple
+tested-with:
+    GHC >= 9.2
 extra-source-files:
     README.md
     CHANGELOG.md
@@ -47,9 +46,10 @@
       src
   ghc-options: -Wall -Wredundant-constraints -Wcompat -Werror=incomplete-patterns
   build-depends:
-      base >=4.13 && <5
-    , functor-products >=0.1.1
-    , microlens
-    , singletons >=2.6
-    , vinyl
+      base >=4.16 && <5
+    , functor-products >=0.1.2 && <0.2
+    , microlens <0.5
+    , singletons >=3.0 && <3.1
+    , singletons-base <3.2
+    , vinyl <0.15
   default-language: Haskell2010
diff --git a/src/Data/Type/Predicate.hs b/src/Data/Type/Predicate.hs
--- a/src/Data/Type/Predicate.hs
+++ b/src/Data/Type/Predicate.hs
@@ -52,17 +52,21 @@
   , mapRefuted
   ) where
 
+import           Data.Either.Singletons
+import           Data.Function.Singletons
 import           Data.Functor.Identity
+import           Data.Functor.Identity.Singletons
 import           Data.Kind
-import           Data.List.NonEmpty                    (NonEmpty(..))
+import           Data.List.NonEmpty               (NonEmpty(..))
+import           Data.List.Singletons hiding      (ElemSym1)
 import           Data.Maybe
+import           Data.Maybe.Singletons
 import           Data.Singletons
 import           Data.Singletons.Decide
-import           Data.Singletons.Prelude hiding        (Not, ElemSym1)
-import           Data.Singletons.Prelude.Identity
+import           Data.Tuple.Singletons
 import           Data.Type.Functor.Product
 import           Data.Void
-import qualified Data.Singletons.Prelude.List.NonEmpty as NE
+import qualified Data.List.NonEmpty.Singletons    as NE
 
 -- | A type-level predicate in Haskell.  We say that the predicate @P ::
 -- 'Predicate' k@ is true/satisfied by input @x :: k@ if there exists
@@ -367,7 +371,7 @@
 -- | @since 3.0.0
 instance Provable (TyPred WrappedSing) where
     prove = WrapSing
-    
+
 
 -- | @since 3.0.0
 instance Provable p => Provable (TyPred (Rec (Wit p))) where
diff --git a/src/Data/Type/Predicate/Param.hs b/src/Data/Type/Predicate/Param.hs
--- a/src/Data/Type/Predicate/Param.hs
+++ b/src/Data/Type/Predicate/Param.hs
@@ -42,8 +42,8 @@
 import           Data.Kind
 import           Data.Singletons
 import           Data.Singletons.Decide
-import           Data.Singletons.Prelude.Tuple
 import           Data.Singletons.Sigma
+import           Data.Tuple.Singletons
 import           Data.Type.Functor.Product
 import           Data.Type.Predicate
 import           Data.Type.Predicate.Logic
@@ -140,7 +140,7 @@
 -- @
 --
 -- Applied to specific things:
--- 
+--
 -- @
 -- 'IsTC' ''Just' :: 'ParamPred' (Maybe v) v
 -- 'Found' ('IsTC' ''Just'') :: 'Predicate' (Maybe v)
diff --git a/src/Data/Type/Universe.hs b/src/Data/Type/Universe.hs
--- a/src/Data/Type/Universe.hs
+++ b/src/Data/Type/Universe.hs
@@ -48,19 +48,22 @@
   , pickElem
   ) where
 
+import           Data.Either.Singletons hiding    (IsLeft, IsRight)
 import           Data.Functor.Identity
+import           Data.Functor.Identity.Singletons
 import           Data.Kind
-import           Data.List.NonEmpty                    (NonEmpty(..))
+import           Data.List.NonEmpty               (NonEmpty(..))
+import           Data.List.Singletons hiding      (Elem, ElemSym0, ElemSym1, ElemSym2, All, Any, Null)
+import           Data.Maybe.Singletons hiding     (IsJust, IsNothing)
 import           Data.Singletons
 import           Data.Singletons.Decide
-import           Data.Singletons.Prelude hiding        (Elem, ElemSym0, ElemSym1, ElemSym2, Any, All, Null, Not)
-import           Data.Singletons.Prelude.Identity
+import           Data.Tuple.Singletons
 import           Data.Type.Functor.Product
 import           Data.Type.Predicate
 import           Data.Type.Predicate.Logic
-import           GHC.Generics                          ((:*:)(..))
-import           Prelude hiding                        (any, all)
-import qualified Data.Singletons.Prelude.List.NonEmpty as NE
+import           GHC.Generics                     ((:*:)(..))
+import           Prelude hiding                   (any, all)
+import qualified Data.List.NonEmpty.Singletons    as NE
 
 -- | A @'WitAny' p as@ is a witness that, for at least one item @a@ in the
 -- type-level collection @as@, the predicate @p a@ is true.
@@ -400,7 +403,7 @@
       $ f IId x
     idecideAll f (SIdentity x) =
         mapDecision (\p -> WitAll $ \case IId -> p)
-                    (`runWitAll` IId)
+                    (\y -> runWitAll y IId)
       $ f IId x
     allProd f (SIdentity x) a = PIdentity $ f x (runWitAll a IId)
     prodAll f (PIdentity x) = WitAll $ \case IId -> f x
