diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -5,6 +5,11 @@
 ## Unreleased changes
 
 
+## Version 0.8.0.0
+
+-   Adapt to breaking changes in upstream libraries (`data-default`).
+
+
 ## Version 0.7.2.0
 
 -   `slynx`: Allow global normalization of mixture models.
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
 
 # The ELynx Suite
 
-Version: 0.7.2.1.
+Version: 0.8.0.0.
 Reproducible evolution made easy.
 
 <p align="center"><img src="https://travis-ci.org/dschrempf/elynx.svg?branch=master"/></p>
@@ -73,9 +73,9 @@
     # OR: stack exec slynx -- --help
     # OR: slynx --help
 
-    ELynx Suite version 0.7.2.1.
+    ELynx Suite version 0.8.0.0.
     Developed by Dominik Schrempf.
-    Compiled on June 15, 2023, at 19:54 pm, UTC.
+    Compiled on October 27, 2024, at 07:14 am, UTC.
     
     Usage: slynx [-v|--verbosity VALUE] [-o|--output-file-basename NAME]
                  [-f|--force] [--no-elynx-file] COMMAND
@@ -143,9 +143,9 @@
     # OR: stack exec slynx -- simulate --help
     # OR: slynx simulate --help
 
-    ELynx Suite version 0.7.2.1.
+    ELynx Suite version 0.8.0.0.
     Developed by Dominik Schrempf.
-    Compiled on June 15, 2023, at 19:54 pm, UTC.
+    Compiled on October 27, 2024, at 07:14 am, UTC.
     
     Usage: slynx simulate (-t|--tree-file Name) [-s|--substitution-model MODEL]
                           [-m|--mixture-model MODEL] [-n|--global-normalization]
diff --git a/elynx-markov.cabal b/elynx-markov.cabal
--- a/elynx-markov.cabal
+++ b/elynx-markov.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               elynx-markov
-version:            0.7.2.2
+version:            0.8.0.0
 synopsis:           Simulate molecular sequences along trees
 description:
   Examine, modify, and simulate molecular sequences in a reproducible way. Please see the README on GitHub at <https://github.com/dschrempf/elynx>.
diff --git a/src/ELynx/MarkovProcess/RateMatrix.hs b/src/ELynx/MarkovProcess/RateMatrix.hs
--- a/src/ELynx/MarkovProcess/RateMatrix.hs
+++ b/src/ELynx/MarkovProcess/RateMatrix.hs
@@ -173,7 +173,7 @@
 
 -- The function is a little weird because HMatrix uses Double indices for Matrix
 -- Double builders.
-fromListBuilderLower :: RealFrac a => [a] -> a -> a -> a
+fromListBuilderLower :: (RealFrac a) => [a] -> a -> a -> a
 fromListBuilderLower es i j
   | i > j = es !! ijToKLower iI jI
   | i == j = 0.0
@@ -187,7 +187,7 @@
 
 -- The function is a little weird because HMatrix uses Double indices for Matrix
 -- Double builders.
-fromListBuilderUpper :: RealFrac a => Int -> [a] -> a -> a -> a
+fromListBuilderUpper :: (RealFrac a) => Int -> [a] -> a -> a -> a
 fromListBuilderUpper n es i j
   | i < j = es !! ijToKUpper n iI jI
   | i == j = 0.0
@@ -199,7 +199,7 @@
     iI = round i :: Int
     jI = round j :: Int
 
-checkEs :: RealFrac a => Int -> [a] -> [a]
+checkEs :: (RealFrac a) => Int -> [a] -> [a]
 checkEs n es
   | length es == nExp = es
   | otherwise = error eStr
diff --git a/src/ELynx/Simulate/MarkovProcess.hs b/src/ELynx/Simulate/MarkovProcess.hs
--- a/src/ELynx/Simulate/MarkovProcess.hs
+++ b/src/ELynx/Simulate/MarkovProcess.hs
@@ -45,7 +45,7 @@
 --
 -- This function is the bottleneck of the simulator and takes up most of the
 -- computation time.
-jump :: StatefulGen g m => State -> ProbMatrix -> g -> m State
+jump :: (StatefulGen g m) => State -> ProbMatrix -> g -> m State
 jump i p = categorical (p ! i)
 
 -- XXX: Maybe for later, use condensed tables.
diff --git a/src/ELynx/Simulate/MarkovProcessAlongTree.hs b/src/ELynx/Simulate/MarkovProcessAlongTree.hs
--- a/src/ELynx/Simulate/MarkovProcessAlongTree.hs
+++ b/src/ELynx/Simulate/MarkovProcessAlongTree.hs
@@ -53,7 +53,7 @@
 toProbTree q = fmap (probMatrix q)
 
 getRootStates ::
-  StatefulGen g m =>
+  (StatefulGen g m) =>
   Int ->
   StationaryDistribution ->
   g ->
@@ -67,7 +67,7 @@
 -- XXX: Improve performance. Use vectors, not lists. I am actually not sure if
 -- this improves performance...
 simulateAndFlatten ::
-  StatefulGen g m =>
+  (StatefulGen g m) =>
   Int ->
   StationaryDistribution ->
   ExchangeabilityMatrix ->
@@ -84,7 +84,7 @@
 -- Recursively jump down the branches to the leafs. Forget states at internal
 -- nodes.
 simulateAndFlatten' ::
-  StatefulGen g m =>
+  (StatefulGen g m) =>
   [State] ->
   Tree ProbMatrix ->
   g ->
@@ -97,7 +97,7 @@
 
 -- | See 'simulateAndFlatten', parallel version.
 simulateAndFlattenPar ::
-  RandomGen g =>
+  (RandomGen g) =>
   Int ->
   StationaryDistribution ->
   ExchangeabilityMatrix ->
@@ -126,7 +126,7 @@
 -- internal nodes. The result is a tree with the list of simulated states as
 -- node labels.
 simulate ::
-  StatefulGen g m =>
+  (StatefulGen g m) =>
   Int ->
   StationaryDistribution ->
   ExchangeabilityMatrix ->
@@ -142,7 +142,7 @@
 -- This is the heart of the simulation. Take a tree and a list of root states.
 -- Recursively jump down the branches to the leafs.
 simulate' ::
-  StatefulGen g m =>
+  (StatefulGen g m) =>
   [State] ->
   Tree ProbMatrix ->
   g ->
@@ -159,7 +159,7 @@
   fmap (\a -> V.map (`probMatrix` a) qs)
 
 getComponentsAndRootStates ::
-  StatefulGen g m =>
+  (StatefulGen g m) =>
   Int ->
   V.Vector Double ->
   V.Vector StationaryDistribution ->
@@ -174,7 +174,7 @@
 -- corresponding weights. Forget states at internal nodes. See also
 -- 'simulateAndFlatten'.
 simulateAndFlattenMixtureModel ::
-  StatefulGen g m =>
+  (StatefulGen g m) =>
   Int ->
   V.Vector Double ->
   V.Vector StationaryDistribution ->
@@ -191,7 +191,7 @@
   return (cs, ss)
 
 simulateAndFlattenMixtureModel' ::
-  StatefulGen g m =>
+  (StatefulGen g m) =>
   [State] ->
   [Int] ->
   Tree (V.Vector ProbMatrix) ->
@@ -216,7 +216,7 @@
 -- requires benchmarks. I am just not sure if it makes sense to spend more time
 -- on this since the parallelization itself is a bit weird. Like so, we walk
 -- along separate trees in each process.
-parComp :: RandomGen g => Int -> (Int -> IOGenM g -> IO b) -> IOGenM g -> IO [b]
+parComp :: (RandomGen g) => Int -> (Int -> IOGenM g -> IO b) -> IOGenM g -> IO [b]
 parComp num fun gen = do
   ncap <- getNumCapabilities
   let chunks = getChunks ncap num
@@ -226,7 +226,7 @@
 
 -- | See 'simulateAndFlattenMixtureModel', parallel version.
 simulateAndFlattenMixtureModelPar ::
-  RandomGen g =>
+  (RandomGen g) =>
   Int ->
   V.Vector Double ->
   V.Vector StationaryDistribution ->
@@ -255,7 +255,7 @@
 -- corresponding weights. Keep states at internal nodes. See also
 -- 'simulate'.
 simulateMixtureModel ::
-  StatefulGen g m =>
+  (StatefulGen g m) =>
   Int ->
   V.Vector Double ->
   V.Vector StationaryDistribution ->
@@ -272,7 +272,7 @@
 -- See 'simulateAlongProbTree', only we have a number of mixture components. The
 -- starting states and the components for each site have to be provided.
 simulateMixtureModel' ::
-  StatefulGen g m =>
+  (StatefulGen g m) =>
   [State] ->
   [Int] ->
   Tree (V.Vector ProbMatrix) ->
