diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Revision history for merkle-log
 
+## 0.2.0 -- 2023-06-08
+
+*   Switch from cryptonite to crypton package.
+
 ## 0.1.1 -- 2021-06-24
 
 *   Build with GHC-9
diff --git a/bench/Main.hs b/bench/Main.hs
--- a/bench/Main.hs
+++ b/bench/Main.hs
@@ -4,6 +4,7 @@
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PackageImports #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE TypeApplications #-}
 {-# LANGUAGE TypeFamilies #-}
@@ -29,7 +30,8 @@
 import Criterion
 import Criterion.Main
 
-import Crypto.Hash
+import "crypton" Crypto.Hash
+import qualified "cryptonite" Crypto.Hash as CR
 
 import qualified Data.ByteArray as BA
 import qualified Data.ByteString as B
@@ -57,15 +59,15 @@
         [ bgroup "create tree"
             [ bgroup "SHA512t_256"
                 [ createBench @(ML SHA512t_256) e
-                , createBench @(HT SHA512t_256) e
+                , createBench @(HT CR.SHA512t_256) e
                 ]
             , bgroup "SHA256"
                 [ createBench @(ML SHA256) e
-                , createBench @(HT SHA256) e
+                , createBench @(HT CR.SHA256) e
                 ]
             , bgroup "SHA3_256"
                 [ createBench @(ML SHA3_256) e
-                , createBench @(HT SHA3_256) e
+                , createBench @(HT CR.SHA3_256) e
                 ]
             , bgroup "BLAKE2b_256"
                 [ createBench @(ML Blake2b_256) e
@@ -74,15 +76,15 @@
         , bgroup "create inclusion proof"
             [ bgroup "SHA512t_256"
                 [ proofBench @(ML SHA512t_256) e
-                , proofBench @(HT SHA512t_256) e
+                , proofBench @(HT CR.SHA512t_256) e
                 ]
             , bgroup "SHA256"
                 [ proofBench @(ML SHA256) e
-                , proofBench @(HT SHA256) e
+                , proofBench @(HT CR.SHA256) e
                 ]
             , bgroup "SHA3_256"
                 [ proofBench @(ML SHA3_256) e
-                , proofBench @(HT SHA3_256) e
+                , proofBench @(HT CR.SHA3_256) e
                 ]
             , bgroup "BLAKE2b_256"
                 [ proofBench @(ML Blake2b_256) e
@@ -91,15 +93,15 @@
         , bgroup "verify inclusion proof"
             [ bgroup "SHA512t_256"
                 [ verifyBench @(ML SHA512t_256) e
-                , verifyBench @(HT SHA512t_256) e
+                , verifyBench @(HT CR.SHA512t_256) e
                 ]
             , bgroup "SHA256"
                 [ verifyBench @(ML SHA256) e
-                , verifyBench @(HT SHA256) e
+                , verifyBench @(HT CR.SHA256) e
                 ]
             , bgroup "SHA3_256"
                 [ verifyBench @(ML SHA3_256) e
-                , verifyBench @(HT SHA3_256) e
+                , verifyBench @(HT CR.SHA3_256) e
                 ]
             , bgroup "BLAKE2b_256"
                 [ verifyBench @(ML Blake2b_256) e
@@ -216,7 +218,9 @@
     tree = ML.merkleTree @a . fmap ML.InputNode
     root = ML.merkleRoot
     proof t ix i =
-        let Right p = ML.merkleProof (ML.InputNode ix) i t
+        let p = case ML.merkleProof (ML.InputNode ix) i t of
+                Right x -> x
+                Left e -> error $ "proof creation failed in benchmark: " <> show e
         in MLProof p (ML.merkleRoot t)
     verify (MLProof p r) = ML.runMerkleProof p == r
 
@@ -233,7 +237,7 @@
     {-# UNPACK #-} !(HT.InclusionProof a)
     {-# UNPACK #-} !B.ByteString
         -- ^ Proof subject (leaf)
-    {-# UNPACK #-} !(Digest a)
+    {-# UNPACK #-} !(CR.Digest a)
         -- ^ Root of the Tree
     deriving (Generic)
 
@@ -251,17 +255,17 @@
 
 data HT a
 
-htSettings :: forall a . HashAlgorithm a => HT.Settings B.ByteString a
+htSettings :: forall a . CR.HashAlgorithm a => HT.Settings B.ByteString a
 htSettings = HT.defaultSettings
-    { HT.hash0 = hash @B.ByteString @a mempty
-    , HT.hash1 = \x -> hash @_ @a (B.singleton 0x00 `B.append` x)
-    , HT.hash2 = \x y -> hash @_ @a $ B.concat [B.singleton 0x01, BA.convert x, BA.convert y]
+    { HT.hash0 = CR.hash @B.ByteString @a mempty
+    , HT.hash1 = \x -> CR.hash @_ @a (B.singleton 0x00 `B.append` x)
+    , HT.hash2 = \x y -> CR.hash @_ @a $ B.concat [B.singleton 0x01, BA.convert x, BA.convert y]
     }
 
-instance HashAlgorithm a => Impl (HT a) where
+instance (CR.HashAlgorithm a) => Impl (HT a) where
     type Tree (HT a) = HT.MerkleHashTrees B.ByteString a
     type Proof (HT a) = HTProof a
-    type Root (HT a) = Digest a
+    type Root (HT a) = CR.Digest a
 
     label = "hash-tree"
     tree = HT.fromList htSettings
diff --git a/merkle-log.cabal b/merkle-log.cabal
--- a/merkle-log.cabal
+++ b/merkle-log.cabal
@@ -1,6 +1,6 @@
 cabal-version: 2.4
 name: merkle-log
-version: 0.1.1
+version: 0.2.0
 synopsis: Merkle Tree Logs
 description: Binary Merkle Trees
 homepage: https://github.com/kadena-io/merkle-log
@@ -9,12 +9,14 @@
 license-file: LICENSE
 author: Lars Kuhtz
 maintainer: Lars Kuhtz <lars@kadena.io>
-copyright: Copyright (c) 2019, Kadena LLC
+copyright: Copyright (c) 2019-2023, Kadena LLC
 category: Data
 tested-with:
-    GHC==9.0.1
-    GHC==8.10.5
-    GHC==8.8.4
+    GHC==9.6
+    GHC==9.4
+    GHC==9.2
+    GHC==9.0
+    GHC==8.10
 extra-source-files:
     README.md
     CHANGELOG.md
@@ -33,7 +35,7 @@
     build-depends:
         , base >=4.11 && <5
         , bytestring >=0.10
-        , cryptonite >=0.25
+        , crypton >=0.31
         , deepseq >=1.4
         , exceptions >=0.10
         , memory >=0.14
@@ -56,7 +58,7 @@
         , QuickCheck >=2.11
         , base >=4.11 && <5
         , bytestring >=0.10
-        , cryptonite >=0.25
+        , crypton >=0.31
         , deepseq >=1.4
         , exceptions >=0.10
         , memory >=0.14
@@ -79,7 +81,8 @@
         , base >=4.11 && <5
         , bytestring >=0.10
         , criterion >=1.5
-        , cryptonite >=0.25
+        , crypton >=0.31
+        , cryptonite >=0.30
         , deepseq >=1.4
         , hash-tree >=0.0
         , memory >=0.14
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -107,27 +107,31 @@
 -- is empty (singleton tree).
 --
 changeProofPath :: HashAlgorithm a => MerkleProof a -> MerkleProof a
-changeProofPath p = p { _merkleProofObject = o }
+changeProofPath p = p { _merkleProofObject = obj }
   where
-    Right o = decodeMerkleProofObject . BA.pack @BA.Bytes
-        $ case splitAt 12 (BA.unpack (_merkleProofObject p)) of
-            (h, 0x00 : t) -> h <> (0x01 : t)
-            (h, 0x01 : t) -> h <> (0x00 : t)
-            (_, _ : _) -> error "invalid proof object"
-            (_, []) -> error "unexpected empty proof object"
+    obj = case decodeMerkleProofObject (BA.pack @BA.Bytes o) of
+        Right x -> x
+        Left e -> error $ "test/Main.chainProofPath: failed to decode proof object: " <> show e
+    o = case splitAt 12 (BA.unpack (_merkleProofObject p)) of
+        (h, 0x00 : t) -> h <> (0x01 : t)
+        (h, 0x01 : t) -> h <> (0x00 : t)
+        (_, _ : _) -> error "invalid proof object"
+        (_, []) -> error "unexpected empty proof object"
 
 
 -- | Change hash of first proof step. Throws error is the proof
 -- is empty (singleton tree).
 --
 changeProofHash :: HashAlgorithm a => MerkleProof a -> MerkleProof a
-changeProofHash p = p { _merkleProofObject = o }
+changeProofHash p = p { _merkleProofObject = obj }
   where
-    Right o = decodeMerkleProofObject . BA.pack @BA.Bytes
-        $ case splitAt 12 (BA.unpack (_merkleProofObject p)) of
-            (h, h1 : h2 : t) -> h <> (h1 : 1 + h2 : t)
-            (_, []) -> error "unexpected empty proof object"
-            _ -> error "invalid proof object"
+    obj = case decodeMerkleProofObject (BA.pack @BA.Bytes o) of
+        Right x -> x
+        Left e -> error $ "test/Main.chainProofHash: failed to decode proof object: " <> show e
+    o = case splitAt 12 (BA.unpack (_merkleProofObject p)) of
+        (h, h1 : h2 : t) -> h <> (h1 : 1 + h2 : t)
+        (_, []) -> error "unexpected empty proof object"
+        _ -> error "invalid proof object"
 
 -- | Changes the proof step count and verifies that decoding of the modified proof object fails.
 -- Throws error is the proof is empty (singleton tree).
@@ -261,7 +265,9 @@
     p = case merkleProof (l !! i) i t of
         Left e -> error (displayException e)
         Right x -> x
-    p' = p { _merkleProofSubject = MerkleProofSubject (InputNode "a") }
+    p' = p { _merkleProofSubject = changeSubject (_merkleProofSubject p) }
+    changeSubject (MerkleProofSubject (InputNode "a")) = MerkleProofSubject (InputNode "b")
+    changeSubject _ = MerkleProofSubject (InputNode "b")
 
 prop_proofInvalidObjectPath
     :: UniqueInputs SHA512t_256
@@ -305,7 +311,9 @@
 prop_chainProof (MerkleTreeChain l)
     = runMerkleProof @SHA512t_256 p === merkleRoot (snd $ NE.last l)
   where
-    Right p = merkleProof_ (InputNode "a") l
+    p = case merkleProof_ (InputNode "a") l of
+        Right x -> x
+        Left e -> error $ "test/Main.prop_chainProof: merkleProof failed: " <> show e
 
 prop_encodeProofObject :: MerkleProof SHA512t_256 -> Property
 prop_encodeProofObject p
