diff --git a/alex.cabal b/alex.cabal
--- a/alex.cabal
+++ b/alex.cabal
@@ -1,5 +1,5 @@
 name: alex
-version: 3.0
+version: 3.0.1
 license: BSD3
 license-file: LICENSE
 copyright: (c) Chis Dornan, Simon Marlow
@@ -52,6 +52,8 @@
 	tests/tokens_gscan.x
 	tests/tokens_posn.x
         tests/tokens_bytestring.x
+        tests/tokens_posn_bytestring.x
+        tests/tokens_strict_bytestring.x
         tests/unicode.x
 
 source-repository head
diff --git a/templates/wrappers.hs b/templates/wrappers.hs
--- a/templates/wrappers.hs
+++ b/templates/wrappers.hs
@@ -8,7 +8,8 @@
 #if defined(ALEX_BASIC_BYTESTRING) || defined(ALEX_POSN_BYTESTRING) || defined(ALEX_MONAD_BYTESTRING)
 
 import qualified Data.Char
-import qualified Data.ByteString.Lazy as ByteString
+import qualified Data.ByteString.Lazy     as ByteString
+import qualified Data.ByteString.Internal as ByteString (w2c)
 
 #elif defined(ALEX_STRICT_BYTESTRING)
 
@@ -80,11 +81,40 @@
 alexGetByte (p,_,cs) | ByteString.null cs = Nothing
                      | otherwise = let b   = ByteString.head cs
                                        cs' = ByteString.tail cs
-                                       c   = Data.Char.chr (fromIntegral b)
+                                       c   = ByteString.w2c b
                                        p'  = alexMove p c
                                     in p' `seq` cs' `seq` Just (b, (p', c, cs'))
 #endif
 
+#ifdef ALEX_BASIC_BYTESTRING
+type AlexInput = (Char,
+                  ByteString.ByteString)
+
+alexInputPrevChar :: AlexInput -> Char
+alexInputPrevChar (c,_) = c
+
+alexGetByte (_, cs)
+   | ByteString.null cs = Nothing
+   | otherwise          = Just (ByteString.head cs,
+                                (ByteString.w2c $ ByteString.head cs,
+                                 ByteString.tail cs))
+#endif
+
+#ifdef ALEX_STRICT_BYTESTRING
+data AlexInput = AlexInput { alexChar :: {-# UNPACK #-}!Char
+                           , alexStr  :: {-# UNPACK #-}!ByteString.ByteString }
+
+alexInputPrevChar :: AlexInput -> Char
+alexInputPrevChar = alexChar
+
+alexGetByte (AlexInput _ cs)
+    | ByteString.null cs = Nothing
+    | otherwise          = Just $!  (ByteString.head cs, AlexInput c cs')
+    where
+        (c,cs') = (ByteString.w2c (ByteString.unsafeHead cs)
+                  , ByteString.unsafeTail cs)
+#endif
+
 -- -----------------------------------------------------------------------------
 -- Token positions
 
@@ -318,13 +348,7 @@
 -- Basic wrapper, ByteString version
 
 #ifdef ALEX_BASIC_BYTESTRING
-type AlexInput = (Char,ByteString.ByteString)
 
-alexGetByte (_, cs) | ByteString.null cs = Nothing
-                    | otherwise          = Just (ByteString.head cs, (ByteString.head cs, ByteString.tail cs))
-
-alexInputPrevChar (c,_) = c
-
 -- alexScanTokens :: String -> [token]
 alexScanTokens str = go ('\n',str)
   where go inp@(_,str) =
@@ -338,18 +362,6 @@
 #endif
 
 #ifdef ALEX_STRICT_BYTESTRING
-
-data AlexInput = AlexInput { alexChar :: {-# UNPACK #-}!Char
-                           , alexStr  :: {-# UNPACK #-}!ByteString.ByteString }
-
-alexGetByte (AlexInput _ cs)
-    | ByteString.null cs = Nothing
-    | otherwise          = Just $!  (ByteString.head cs, AlexInput c cs')
-    where
-        (c,cs') = (ByteString.w2c (ByteString.unsafeHead cs)
-                  , ByteString.unsafeTail cs)
-
-alexInputPrevChar = alexChar
 
 -- alexScanTokens :: String -> [token]
 alexScanTokens str = go (AlexInput '\n' str)
diff --git a/tests/Makefile b/tests/Makefile
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -9,7 +9,7 @@
 HS_PROG_EXT = .bin
 endif
 
-TESTS = unicode.x simple.x tokens.x tokens_posn.x tokens_gscan.x tokens_bytestring.x
+TESTS = unicode.x simple.x tokens.x tokens_posn.x tokens_gscan.x tokens_bytestring.x tokens_posn_bytestring.x tokens_strict_bytestring.x
 
 TEST_ALEX_OPTS = --template=..
 
diff --git a/tests/tokens_bytestring.x b/tests/tokens_bytestring.x
--- a/tests/tokens_bytestring.x
+++ b/tests/tokens_bytestring.x
@@ -5,7 +5,7 @@
 import Data.ByteString.Lazy.Char8 (unpack)
 }
 
-%wrapper "posn-bytestring"
+%wrapper "basic-bytestring"
 
 $digit = 0-9			-- digits
 $alpha = [a-zA-Z]		-- alphabetic characters
@@ -14,33 +14,29 @@
 
   $white+				;
   "--".*				;
-  let					{ tok (\p s -> Let p) }
-  in					{ tok (\p s -> In p) }
-  $digit+                               { tok (\p s -> Int p (read (unpack s))) }
-  [\=\+\-\*\/\(\)]                      { tok (\p s -> Sym p (head (unpack s))) }
-  $alpha [$alpha $digit \_ \']*         { tok (\p s -> Var p (unpack s)) }
+  let					{ \s -> Let }
+  in					{ \s -> In }
+  $digit+                               { \s -> Int (read (unpack s)) }
+  [\=\+\-\*\/\(\)]                      { \s -> Sym (head (unpack s)) }
+  $alpha [$alpha $digit \_ \']*         { \s -> Var (unpack s) }
 
 {
--- Each right-hand side has type :: AlexPosn -> String -> Token
-
--- Some action helpers:
-tok f p s = f p s
+-- Each right-hand side has type :: ByteString -> Token
 
 -- The token type:
 data Token =
-	Let AlexPosn		|
-	In  AlexPosn		|
-	Sym AlexPosn Char	|
-        Var AlexPosn String     |
-	Int AlexPosn Int	|
-	Err AlexPosn
+	Let 		|
+	In  		|
+	Sym Char	|
+	Var String	|
+	Int Int		|
+	Err 
 	deriving (Eq,Show)
 
 main = if test1 /= result1 then exitFailure
-			   else exitWith ExitSuccess
+                           else exitWith ExitSuccess
 
 test1 = alexScanTokens "  let in 012334\n=+*foo bar__'"
-result1 = [Let (AlexPn 2 1 3),In (AlexPn 6 1 7),Int (AlexPn 9 1 10) 12334,Sym (AlexPn 16 2 1) '=',Sym (AlexPn 17 2 2) '+',Sym (AlexPn 18 2 3) '*',Var (AlexPn 19 2 4) "foo",Var (AlexPn 23 2 8) "bar__'"]
-
+result1 = [Let,In,Int 12334,Sym '=',Sym '+',Sym '*',Var "foo",Var "bar__'"]
 
 }
diff --git a/tests/tokens_posn_bytestring.x b/tests/tokens_posn_bytestring.x
new file mode 100644
--- /dev/null
+++ b/tests/tokens_posn_bytestring.x
@@ -0,0 +1,46 @@
+{
+{-# LANGUAGE OverloadedStrings #-}
+module Main (main) where
+import System.Exit
+import Data.ByteString.Lazy.Char8 (unpack)
+}
+
+%wrapper "posn-bytestring"
+
+$digit = 0-9			-- digits
+$alpha = [a-zA-Z]		-- alphabetic characters
+
+tokens :-
+
+  $white+				;
+  "--".*				;
+  let					{ tok (\p s -> Let p) }
+  in					{ tok (\p s -> In p) }
+  $digit+                               { tok (\p s -> Int p (read (unpack s))) }
+  [\=\+\-\*\/\(\)]                      { tok (\p s -> Sym p (head (unpack s))) }
+  $alpha [$alpha $digit \_ \']*         { tok (\p s -> Var p (unpack s)) }
+
+{
+-- Each right-hand side has type :: AlexPosn -> String -> Token
+
+-- Some action helpers:
+tok f p s = f p s
+
+-- The token type:
+data Token =
+	Let AlexPosn		|
+	In  AlexPosn		|
+	Sym AlexPosn Char	|
+        Var AlexPosn String     |
+	Int AlexPosn Int	|
+	Err AlexPosn
+	deriving (Eq,Show)
+
+main = if test1 /= result1 then exitFailure
+			   else exitWith ExitSuccess
+
+test1 = alexScanTokens "  let in 012334\n=+*foo bar__'"
+result1 = [Let (AlexPn 2 1 3),In (AlexPn 6 1 7),Int (AlexPn 9 1 10) 12334,Sym (AlexPn 16 2 1) '=',Sym (AlexPn 17 2 2) '+',Sym (AlexPn 18 2 3) '*',Var (AlexPn 19 2 4) "foo",Var (AlexPn 23 2 8) "bar__'"]
+
+
+}
diff --git a/tests/tokens_strict_bytestring.x b/tests/tokens_strict_bytestring.x
new file mode 100644
--- /dev/null
+++ b/tests/tokens_strict_bytestring.x
@@ -0,0 +1,42 @@
+{
+{-# LANGUAGE OverloadedStrings #-}
+module Main (main) where
+import System.Exit
+import Data.ByteString.Char8 (unpack)
+}
+
+%wrapper "strict-bytestring"
+
+$digit = 0-9			-- digits
+$alpha = [a-zA-Z]		-- alphabetic characters
+
+tokens :-
+
+  $white+				;
+  "--".*				;
+  let					{ \s -> Let }
+  in					{ \s -> In }
+  $digit+                               { \s -> Int (read (unpack s)) }
+  [\=\+\-\*\/\(\)]                      { \s -> Sym (head (unpack s)) }
+  $alpha [$alpha $digit \_ \']*         { \s -> Var (unpack s) }
+
+{
+-- Each right-hand side has type :: ByteString -> Token
+
+-- The token type:
+data Token =
+	Let 		|
+	In  		|
+	Sym Char	|
+	Var String	|
+	Int Int		|
+	Err 
+	deriving (Eq,Show)
+
+main = if test1 /= result1 then exitFailure
+                           else exitWith ExitSuccess
+
+test1 = alexScanTokens "  let in 012334\n=+*foo bar__'"
+result1 = [Let,In,Int 12334,Sym '=',Sym '+',Sym '*',Var "foo",Var "bar__'"]
+
+}
