diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,12 @@
 (!) Breaking change
 ```
 
+2.0.0.1 [2026-08-03]
+--------------------
+```
+(!) hash(class): Fix Hashable Char instance for UTF-8
+```
+
 2.0.0.0 [2026-08-01]
 --------------------
 ```
diff --git a/mini.cabal b/mini.cabal
--- a/mini.cabal
+++ b/mini.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               mini
-version:            2.0.0.0
+version:            2.0.0.1
 license:            MIT
 license-file:       LICENSE
 author:             Victor Wallsten <victor.wallsten@protonmail.com>
diff --git a/src/Mini/Hash/Class.hs b/src/Mini/Hash/Class.hs
--- a/src/Mini/Hash/Class.hs
+++ b/src/Mini/Hash/Class.hs
@@ -16,6 +16,8 @@
   FiniteBits,
   finiteBitSize,
   shiftR,
+  (.&.),
+  (.|.),
  )
 import Data.Int (
   Int,
@@ -34,6 +36,9 @@
 import Mini.Data.Array (
   Array,
  )
+import Mini.Data.Recursion (
+  bool,
+ )
 import Prelude (
   Bool,
   Char,
@@ -49,6 +54,7 @@
   take,
   ($),
   (.),
+  (<=),
  )
 
 -- Classes
@@ -70,7 +76,30 @@
   toBytes = enumToBytes
 
 instance Hashable Char where
-  toBytes = enumToBytes
+  toBytes = fmap fromIntegral . go . fromEnum
+   where
+    go c =
+      bool
+        ( bool
+            ( bool
+                [ 0xf0 .|. (c `shiftR` 18)
+                , 0x80 .|. ((c `shiftR` 12) .&. 0x3f)
+                , 0x80 .|. ((c `shiftR` 6) .&. 0x3f)
+                , 0x80 .|. (c .&. 0x3f)
+                ]
+                [ 0xe0 .|. (c `shiftR` 12)
+                , 0x80 .|. ((c `shiftR` 6) .&. 0x3f)
+                , 0x80 .|. (c .&. 0x3f)
+                ]
+                $ c <= 0xffff
+            )
+            [ 0xc0 .|. (c `shiftR` 6)
+            , 0x80 .|. (c .&. 0x3f)
+            ]
+            $ c <= 0x7ff
+        )
+        [c]
+        $ c <= 0x7f
 
 instance Hashable Int where
   toBytes = finiteBitsIntegralToBytes
