diff --git a/cereal.cabal b/cereal.cabal
--- a/cereal.cabal
+++ b/cereal.cabal
@@ -1,5 +1,5 @@
 name:                   cereal
-version:                0.4.1.0
+version:                0.4.1.1
 license:                BSD3
 license-file:           LICENSE
 author:                 Lennart Kolmodin <kolmodin@dtek.chalmers.se>,
diff --git a/src/Data/Serialize.hs b/src/Data/Serialize.hs
--- a/src/Data/Serialize.hs
+++ b/src/Data/Serialize.hs
@@ -255,6 +255,14 @@
 
 ------------------------------------------------------------------------
 
+-- Safely wrap `chr` to avoid exceptions. 
+-- `chr` source: http://hackage.haskell.org/package/base-4.7.0.2/docs/src/GHC-Char.html#chr
+chrEither :: Int -> Either String Char
+chrEither i
+  | i <= 0x10FFFF = Right (chr i) -- Or: C# (chr# i#)
+  | otherwise =
+     Left ("bad argument: " ++ show i)
+
 -- Char is serialised as UTF-8
 instance Serialize Char where
     put a | c <= 0x7f     = put (fromIntegral c :: Word8)
@@ -296,7 +304,11 @@
                                 z <- liftM (xor 0x80) getByte
                                 return (z .|. shiftL6 (y .|. shiftL6
                                         (x .|. shiftL6 (xor 0xf0 w))))
-        return $! chr r
+        case chrEither r of
+            Right r' -> 
+                return $! r'
+            Left err ->
+                fail err
 
 ------------------------------------------------------------------------
 -- Instances for the first few tuples
