+\begin{code}
+data Word8 = W8# Word#
+
+instance CCallable Word8
+instance CReturnable Word8
+
+word8ToWord32 (W8# x) = W32# x
+word32ToWord8 (W32# x) = W8# (wordToWord8# x)
+
+-- mask out upper three bytes.
+intToWord8# :: Int# -> Word#
+intToWord8# i# = (int2Word# i#) `and#` (int2Word# 0xff#)
+
+wordToWord8# :: Word# -> Word#
+wordToWord8# w# = w# `and#` (int2Word# 0xff#)
+
+instance Eq Word8 where
+ (W8# x) == (W8# y) = x `eqWord#` y
+ (W8# x) /= (W8# y) = x `neWord#` y
+
+instance Ord Word8 where
+ compare (W8# x#) (W8# y#) = compareWord# x# y#
+ (<) (W8# x) (W8# y) = x `ltWord#` y
+ (<=) (W8# x) (W8# y) = x `leWord#` y
+ (>=) (W8# x) (W8# y) = x `geWord#` y
+ (>) (W8# x) (W8# y) = x `gtWord#` y
+ max x@(W8# x#) y@(W8# y#) =
+ case (compareWord# x# y#) of { LT -> y ; EQ -> x ; GT -> x }
+ min x@(W8# x#) y@(W8# y#) =
+ case (compareWord# x# y#) of { LT -> x ; EQ -> x ; GT -> y }
+
+-- Helper function, used by Ord Word* instances.
+compareWord# :: Word# -> Word# -> Ordering
+compareWord# x# y#
+ | x# `ltWord#` y# = LT
+ | x# `eqWord#` y# = EQ
+ | otherwise = GT