diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## Version 0.2.1 (2017-05-09)
+
+- Added `ascii`, `latin1`, `unicode` character generators.
+
 ## Version 0.2 (2017-05-06)
 
 - Added a quiet test runner which can be activated by setting `HEDGEHOG_VERBOSITY=0`
diff --git a/hedgehog.cabal b/hedgehog.cabal
--- a/hedgehog.cabal
+++ b/hedgehog.cabal
@@ -1,7 +1,7 @@
 name:
   hedgehog
 version:
-  0.2
+  0.2.1
 license:
   BSD3
 author:
diff --git a/src/Hedgehog/Gen.hs b/src/Hedgehog/Gen.hs
--- a/src/Hedgehog/Gen.hs
+++ b/src/Hedgehog/Gen.hs
@@ -65,6 +65,10 @@
   , upper
   , alpha
   , alphaNum
+  , ascii
+  , latin1
+  , unicode
+  , unicodeAll
 
   -- ** Strings
   , string
@@ -127,6 +131,9 @@
   -- ** Shrinking
   , atLeast
 
+  -- ** Characters
+  , isSurrogate
+
   -- ** Subterms
   , Vec(..)
   , Nat(..)
@@ -728,6 +735,38 @@
 alphaNum =
   -- FIXME optimize lookup, use a SmallArray or something.
   element "abcdefghiklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
+
+-- | Generates an ASCII character: @'\0'..'\127'@
+--
+ascii :: Monad m => Gen m Char
+ascii =
+  enum '\0' '\127'
+
+-- | Generates a Latin-1 character: @'\0'..'\255'@
+--
+latin1 :: Monad m => Gen m Char
+latin1 =
+  enum '\0' '\255'
+
+-- | Generates a Unicode character, excluding invalid standalone surrogates:
+--   @'\0'..'\1114111' (excluding '\55296'..'\57344')@
+--
+unicode :: Monad m => Gen m Char
+unicode =
+  filter (not . isSurrogate) unicodeAll
+
+-- | Generates a Unicode character, including invalid standalone surrogates:
+--   @'\0'..'\1114111'@
+--
+unicodeAll :: Monad m => Gen m Char
+unicodeAll =
+  enumBounded
+
+-- | Check if a character is in the surrogate category.
+--
+isSurrogate :: Char -> Bool
+isSurrogate x =
+  x >= '\55296' && x <= '\57344'
 
 ------------------------------------------------------------------------
 -- Combinators - Strings
