diff --git a/CHANGES.markdown b/CHANGES.markdown
--- a/CHANGES.markdown
+++ b/CHANGES.markdown
@@ -1,5 +1,31 @@
-% Changelog for `weighted-regexp`
+% Changelog for [`weighted-regexp`]
 
+[`weighted-regexp`]: http://hackage.haskell.org/package/weighted-regexp
+
+# 0.3.0.1
+
+Moved build dependencies for QuickCheck and Criterion test programs
+under a conditional so they are only pulled in if one actually
+compiles these programs using the flags `-fQuickCheck` or
+`-fCriterion`. (Thank you Brent!)
+
+# 0.3.0.0
+
+## Implemented workaround for [GHC ticket 4227]
+
+Currently, GHC can SPECIALIZE functions only where they are defined.
+The types `Leftmost`, `Longest`, and `LeftLong` are now defined in
+separate modules to bring them into the scope of the matching
+functions. Specialization makes the matching functions almost three
+times faster for the types mentioned above.
+
+This workaround allows to specialize the matching functions for types
+defined in this package. Users, however, must use the matching
+functions unspecialized for their own types.
+
+Along with this change, the constructors of the matching types are no
+longer exported.
+
 # 0.2.0.0
 
 ## More general types for matching functions
@@ -29,20 +55,22 @@
 ## Strict numeric semiring
 
 The lazy definition of arithmetic operations for the `Numeric`
-semiring has been dropped in favour of the more efficient
-standard implementation. As a consequence, `matchingCount` no
-longer works with infinite regular expressions.
+semiring has been dropped in favour of the more efficient standard
+implementation. As a consequence, `matchingCount` no longer works with
+infinite regular expressions.
 
 ## SPECIALIZE pragmas prevent memory leak
 
-The generalization of the matching functions leads to a memory
-leak that can be avoided by specializing them for concrete
-semirings. Corresponding pragmas have been added for `Bool` and
-for `Numeric` types but not for the more complex semirings defined
-in the extra matching modules. It is unclear what is the best way
-to specialize them too because the pragma must be placed in the
-module where the matching functions are defined but, there, not
-all semirings are in scope.
+The generalization of the matching functions leads to a memory leak
+that can be avoided by specializing them for concrete
+semirings. Corresponding pragmas have been added for `Bool` and for
+`Numeric` types but not for the more complex semirings defined in the
+extra matching modules. It is unclear what is the best way to
+specialize them too because the pragma must be placed in the module
+where the matching functions are defined but, there, not all semirings
+are in scope. See [GHC ticket 4227].
+
+[GHC ticket 4227]: http://hackage.haskell.org/trac/ghc/ticket/4227
 
 ## Fixed mistake in Criterion benchmarks
 
diff --git a/README.markdown b/README.markdown
--- a/README.markdown
+++ b/README.markdown
@@ -52,9 +52,11 @@
 
 </td><td>
 
-You can install the `weighted-regexp` library by typing the following
+You can install the [`weighted-regexp`] library by typing the following
 into a terminal:
 
+[`weighted-regexp`]: http://hackage.haskell.org/package/weighted-regexp
+
     bash# cabal update
     bash# cabal install weighted-regexp
 
@@ -169,8 +171,7 @@
 fast in this example, in fact, faster than re2[^cpp]. 
 
 [^cpp]: The following C++ program uses the [re2] library and needs
-*4.5s* to match `.*a.{20}a.*` against a string of ~2M random a's ad
-b's:
+*4s* to search for `a.{20}a` in a string of ~2M random a's ad b's:
 
     <script src="http://gist.github.com/488543.js?file=re2.cpp"></script>
 
@@ -208,20 +209,20 @@
 
        matching  acceptance  #matchings  leftmost     longest  leftmost longest
 --------------- ----------- ----------- ---------- ---------- -----------------
- unique full       [4.0 us]   [4.6 us]
- ambiguous full   [11.7 us]   [13.1 us]
- partial          [21.2 us]              [74.2 us]  [68.0 us]         [73.8 us]
+ unique full       [3.8 us]   [4.8 us]
+ ambiguous full   [11.7 us]   [13.4 us]
+ partial          [20.4 us]              [27.2 us]  [26.2 us]         [27.5 us]
 
 Click on the numbers for a more detailed distribution of run times.
 
-[4.0 us]:  http://sebfisch.github.com/haskell-regexp/criterion/full-accept-phone-densities-800x600.png
-[4.6 us]: http://sebfisch.github.com/haskell-regexp/criterion/full-count-phone-densities-800x600.png
+[3.8 us]:  http://sebfisch.github.com/haskell-regexp/criterion/full-accept-phone-densities-800x600.png
+[4.8 us]: http://sebfisch.github.com/haskell-regexp/criterion/full-count-phone-densities-800x600.png
 [11.7 us]: http://sebfisch.github.com/haskell-regexp/criterion/full-accept-html-densities-800x600.png
-[13.1 us]: http://sebfisch.github.com/haskell-regexp/criterion/full-count-html-densities-800x600.png
-[21.2 us]: http://sebfisch.github.com/haskell-regexp/criterion/partial-accept-rna-densities-800x600.png
-[74.2 us]: http://sebfisch.github.com/haskell-regexp/criterion/partial-leftmost-rna-densities-800x600.png
-[68.0 us]: http://sebfisch.github.com/haskell-regexp/criterion/partial-longest-rna-densities-800x600.png
-[73.8 us]: http://sebfisch.github.com/haskell-regexp/criterion/partial-leftlong-rna-densities-800x600.png
+[13.4 us]: http://sebfisch.github.com/haskell-regexp/criterion/full-count-html-densities-800x600.png
+[20.4 us]: http://sebfisch.github.com/haskell-regexp/criterion/partial-accept-rna-densities-800x600.png
+[27.2 us]: http://sebfisch.github.com/haskell-regexp/criterion/partial-leftmost-rna-densities-800x600.png
+[26.2 us]: http://sebfisch.github.com/haskell-regexp/criterion/partial-longest-rna-densities-800x600.png
+[27.5 us]: http://sebfisch.github.com/haskell-regexp/criterion/partial-leftlong-rna-densities-800x600.png
 
 # Collaboration
 
diff --git a/src/Text/RegExp/Matching/Longest.hs b/src/Text/RegExp/Matching/Longest.hs
--- a/src/Text/RegExp/Matching/Longest.hs
+++ b/src/Text/RegExp/Matching/Longest.hs
@@ -1,5 +1,3 @@
-{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}
-
 -- |
 -- Module      : Text.RegExp.Matching.Longest
 -- Copyright   : Thomas Wilke, Frank Huch, and Sebastian Fischer
diff --git a/src/Text/RegExp/Matching/Longest/Type.hs b/src/Text/RegExp/Matching/Longest/Type.hs
--- a/src/Text/RegExp/Matching/Longest/Type.hs
+++ b/src/Text/RegExp/Matching/Longest/Type.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}
+
 module Text.RegExp.Matching.Longest.Type where
 
 import Data.Semiring
diff --git a/weighted-regexp.cabal b/weighted-regexp.cabal
--- a/weighted-regexp.cabal
+++ b/weighted-regexp.cabal
@@ -1,5 +1,5 @@
 Name:          weighted-regexp
-Version:       0.3.0.0
+Version:       0.3.0.1
 Cabal-Version: >= 1.6
 Synopsis:      Weighted Regular Expression Matcher
 Description:
@@ -49,7 +49,10 @@
 
 Executable quickcheck-re
   Main-Is:              quickcheck.lhs
-  Build-Depends:        base >= 3 && < 5, QuickCheck < 2
+  If flag(QuickCheck)
+    Build-Depends:      base >= 3 && < 5, QuickCheck < 2
+  Else
+    Buildable:          False
   HS-Source-Dirs:       src
   Other-Modules:        Text.RegExp,
                         Text.RegExp.Matching.Leftmost,
@@ -72,8 +75,6 @@
                         OverloadedStrings,
                         ScopedTypeVariables
   GHC-Options:          -fhpc -fno-warn-missing-methods -fno-warn-orphans
-  If !flag(QuickCheck)
-    Buildable:          False
 
 Flag Criterion
   Description:          Build executable to run Criterion benchmarks
@@ -81,7 +82,10 @@
 
 Executable criterion-re
   Main-Is:              criterion.lhs
-  Build-Depends:        base >= 3 && < 5, criterion >= 0.5 && < 0.6
+  If flag(Criterion)
+    Build-Depends:      base >= 3 && < 5, criterion >= 0.5 && < 0.6
+  Else
+    Buildable:          False
   HS-Source-Dirs:       src
   Other-Modules:        Text.RegExp,
                         Text.RegExp.Matching.Leftmost,
@@ -102,8 +106,6 @@
                         GeneralizedNewtypeDeriving,
                         OverloadedStrings
   GHC-Options:          
-  If !flag(Criterion)
-    Buildable:          False
 
 Source-Repository head
   type:     git
