diff --git a/Distribution/Compiler.hs b/Distribution/Compiler.hs
index 3a4e4421304d84ad1bdc6e286ed1502e51106c5d..dd784057af29f6b112b411966b4ed92717ed0472 100644
--- a/Distribution/Compiler.hs
+++ b/Distribution/Compiler.hs
@@ -42,21 +42,23 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -}
 module Distribution.Compiler (
   -- * Compiler flavor
   CompilerFlavor(..),
-  showCompilerFlavor,
-  readCompilerFlavor,
   buildCompilerFlavor,
   defaultCompilerFlavor,
 
   -- * Compiler id
   CompilerId(..),
-  showCompilerId,
   ) where
 
 import Distribution.Version (Version(..))
 
 import qualified System.Info (compilerName)
-import qualified Data.Char as Char (toLower)
-import Distribution.Text (display)
+import Distribution.Text (Text(..), display)
+import qualified Distribution.Compat.ReadP as Parse
+import qualified Text.PrettyPrint as Disp
+import Text.PrettyPrint ((<>))
+
+import qualified Data.Char as Char (toLower, isDigit, isAlphaNum)
+import Control.Monad (when)
 
 data CompilerFlavor = GHC | NHC | YHC | Hugs | HBC | Helium | JHC
                     | OtherCompiler String
@@ -65,23 +67,34 @@ data CompilerFlavor = GHC | NHC | YHC | Hugs | HBC | Helium | JHC
 knownCompilerFlavors :: [CompilerFlavor]
 knownCompilerFlavors = [GHC, NHC, YHC, Hugs, HBC, Helium, JHC]
 
-showCompilerFlavor :: CompilerFlavor -> String
-showCompilerFlavor (OtherCompiler name) = name
-showCompilerFlavor NHC                  = "nhc98"
-showCompilerFlavor other                = lowercase (show other)
+instance Text CompilerFlavor where
+  disp (OtherCompiler name) = Disp.text name
+  disp NHC                  = Disp.text "nhc98"
+  disp other                = Disp.text (lowercase (show other))
+
+  parse = do
+    comp <- Parse.munch1 Char.isAlphaNum
+    when (all Char.isDigit comp) Parse.pfail
+    return (classifyCompilerFlavor comp)
 
-readCompilerFlavor :: String -> CompilerFlavor
-readCompilerFlavor s =
+classifyCompilerFlavor :: String -> CompilerFlavor
+classifyCompilerFlavor s =
   case lookup (lowercase s) compilerMap of
-    Just arch -> arch
-    Nothing   -> OtherCompiler (lowercase s)
+    Just compiler -> compiler
+    Nothing       -> OtherCompiler (lowercase s)
   where
-    compilerMap = [ (showCompilerFlavor compiler, compiler)
+    compilerMap = [ (display compiler, compiler)
                   | compiler <- knownCompilerFlavors ]
 
 buildCompilerFlavor :: CompilerFlavor
-buildCompilerFlavor = readCompilerFlavor System.Info.compilerName
+buildCompilerFlavor = classifyCompilerFlavor System.Info.compilerName
 
+-- | The default compiler flavour to pick when compiling stuff. This defaults
+-- to the compiler used to build the Cabal lib.
+--
+-- However if it's not a recognised compiler then it's 'Nothing' and the user
+-- will have to specify which compiler they want.
+--
 defaultCompilerFlavor :: Maybe CompilerFlavor
 defaultCompilerFlavor = case buildCompilerFlavor of
   OtherCompiler _ -> Nothing
@@ -94,9 +107,14 @@ defaultCompilerFlavor = case buildCompilerFlavor of
 data CompilerId = CompilerId CompilerFlavor Version
   deriving (Eq, Ord, Read, Show)
 
-showCompilerId :: CompilerId -> String
-showCompilerId (CompilerId f (Version [] _)) = showCompilerFlavor f
-showCompilerId (CompilerId f v) = showCompilerFlavor f ++ '-': display v
+instance Text CompilerId where
+  disp (CompilerId f (Version [] _)) = disp f
+  disp (CompilerId f v) = disp f <> Disp.char '-' <> disp v
+
+  parse = do
+    flavour <- parse
+    version <- (Parse.char '-' >> parse) Parse.<++ return (Version [] [])
+    return (CompilerId flavour version)
 
 lowercase :: String -> String
 lowercase = map Char.toLower
diff --git a/Distribution/PackageDescription.hs b/Distribution/PackageDescription.hs
index 0fbf646f42b7381c82d2c3e2c7e4e794511a4651..20e8782c99dae665cfaf2872753dae1b598eac13 100644
--- a/Distribution/PackageDescription.hs
+++ b/Distribution/PackageDescription.hs
@@ -83,7 +83,7 @@ import Distribution.Package
          ( PackageIdentifier(PackageIdentifier), Dependency, Package(..) )
 import Distribution.Version  (Version(Version), VersionRange(AnyVersion))
 import Distribution.License  (License(AllRightsReserved))
-import Distribution.Compiler (CompilerFlavor, showCompilerFlavor)
+import Distribution.Compiler (CompilerFlavor)
 import Distribution.System   (OS, Arch)
 import Distribution.Text
          ( display )
@@ -469,7 +469,7 @@ instance Show ConfVar where
     show (OS os) = "os(" ++ display os ++ ")"
     show (Arch arch) = "arch(" ++ display arch ++ ")"
     show (Flag (ConfFlag f)) = "flag(" ++ f ++ ")"
-    show (Impl c v) = "impl(" ++ showCompilerFlavor c
+    show (Impl c v) = "impl(" ++ display c
                        ++ " " ++ display v ++ ")"
 
 -- | A boolean expression parameterized over the variable type used.
diff --git a/Distribution/PackageDescription/Configuration.hs b/Distribution/PackageDescription/Configuration.hs
index 030ebf78d35a41c0131f7c045e7d50f43686d8d1..1c4a7f9681d3e0a3c1b60cac7e10a6916cf404a2 100644
--- a/Distribution/PackageDescription/Configuration.hs
+++ b/Distribution/PackageDescription/Configuration.hs
@@ -57,7 +57,7 @@ import Distribution.Simple.PackageIndex (PackageIndex)
 import qualified Distribution.Simple.PackageIndex as PackageIndex
 import Distribution.Version
          ( Version(..), VersionRange(..), withinRange )
-import Distribution.Compiler (CompilerFlavor, readCompilerFlavor)
+import Distribution.Compiler (CompilerFlavor)
 import Distribution.System
          ( OS, Arch )
 import Distribution.Simple.Utils (currentDir)
@@ -162,9 +162,9 @@ parseCondition = condOr
     isIdentChar c = isAlphaNum c || (c `elem` "_-")
     oper s        = sp >> string s >> sp
     sp            = skipSpaces
-    implIdent     = do i <- ident
+    implIdent     = do i <- parse
                        vr <- sp >> option AnyVersion parse
-                       return $ Impl (readCompilerFlavor i) vr
+                       return $ Impl i vr
 
 ------------------------------------------------------------------------------
 
diff --git a/Distribution/Simple/BuildPaths.hs b/Distribution/Simple/BuildPaths.hs
index 849452e4a0e43ba6b35a9bbd3ab92f6e1f034f9e..67ba04311a11eadb48b9b17ea7f38dadde3364dd 100644
--- a/Distribution/Simple/BuildPaths.hs
+++ b/Distribution/Simple/BuildPaths.hs
@@ -65,7 +65,7 @@ import System.FilePath (FilePath, (</>), (<.>))
 import Distribution.Package
          ( PackageIdentifier(pkgName), packageName )
 import Distribution.Compiler
-         ( CompilerId(..), showCompilerFlavor )
+         ( CompilerId(..) )
 import Distribution.PackageDescription (PackageDescription)
 import Distribution.Simple.LocalBuildInfo (LocalBuildInfo(buildDir))
 import Distribution.Text
@@ -118,8 +118,7 @@ mkProfLibName lib = mkLibName lib { pkgName = pkgName lib ++ "_p" }
 mkSharedLibName :: PackageIdentifier -> CompilerId -> String
 mkSharedLibName lib (CompilerId compilerFlavor compilerVersion)
   = "libHS" ++ display lib ++ "-" ++ comp <.> dllExtension
-  where comp = showCompilerFlavor compilerFlavor
-            ++ display compilerVersion
+  where comp = display compilerFlavor ++ display compilerVersion
 
 -- ------------------------------------------------------------
 -- * Platform file extensions
diff --git a/Distribution/Simple/Compiler.hs b/Distribution/Simple/Compiler.hs
index 52e617abd85af71ad9b17d129e87191b189e2120..375e0710b2b7f97d99054a408d7d7efbd701d919 100644
--- a/Distribution/Simple/Compiler.hs
+++ b/Distribution/Simple/Compiler.hs
@@ -58,9 +58,9 @@ module Distribution.Simple.Compiler (
         unsupportedExtensions
   ) where
 
-import Distribution.Compiler hiding (showCompilerId)
-import qualified Distribution.Compiler (showCompilerId)
+import Distribution.Compiler
 import Distribution.Version (Version(..))
+import Distribution.Text (display)
 import Language.Haskell.Extension (Extension(..))
 
 import Data.List (nub)
@@ -73,7 +73,7 @@ data Compiler = Compiler {
     deriving (Show, Read)
 
 showCompilerId :: Compiler -> String
-showCompilerId = Distribution.Compiler.showCompilerId . compilerId
+showCompilerId = display . compilerId
 
 compilerFlavor ::  Compiler -> CompilerFlavor
 compilerFlavor = (\(CompilerId f _) -> f) . compilerId
diff --git a/Distribution/Simple/InstallDirs.hs b/Distribution/Simple/InstallDirs.hs
index a02a97876626205067e0ae213a8362689dc9ca18..4f9a273755d828a3d4ced99da679e07bb7bbc17f 100644
--- a/Distribution/Simple/InstallDirs.hs
+++ b/Distribution/Simple/InstallDirs.hs
@@ -79,7 +79,7 @@ import Distribution.Package
 import Distribution.System
          ( OS(..), buildOS )
 import Distribution.Compiler
-         ( CompilerId, showCompilerId, CompilerFlavor(..) )
+         ( CompilerId, CompilerFlavor(..) )
 import Distribution.Text
          ( display )
 
@@ -411,7 +411,7 @@ initialPathTemplateEnv pkgId compilerId =
   [(PkgNameVar,  packageName pkgId)
   ,(PkgVerVar,   display (packageVersion pkgId))
   ,(PkgIdVar,    display pkgId)
-  ,(CompilerVar, showCompilerId compilerId)]
+  ,(CompilerVar, display compilerId)]
 
 -- ---------------------------------------------------------------------------
 -- Parsing and showing path templates: