diff --git a/Setup.hs b/Setup.hs
--- a/Setup.hs
+++ b/Setup.hs
@@ -1,6 +1,6 @@
 -- This file is part of Hoppy.
 --
--- Copyright 2015-2018 Bryan Gardiner <bog@khumba.net>
+-- Copyright 2015-2019 Bryan Gardiner <bog@khumba.net>
 --
 -- Licensed under the Apache License, Version 2.0 (the "License");
 -- you may not use this file except in compliance with the License.
diff --git a/hoppy-runtime.cabal b/hoppy-runtime.cabal
--- a/hoppy-runtime.cabal
+++ b/hoppy-runtime.cabal
@@ -1,12 +1,12 @@
 name: hoppy-runtime
-version: 0.5.1
+version: 0.6.0
 synopsis: C++ FFI generator - Runtime support
 homepage: http://khumba.net/projects/hoppy
 license: Apache-2.0
 license-file: LICENSE
 author: Bryan Gardiner <bog@khumba.net>
 maintainer: Bryan Gardiner <bog@khumba.net>
-copyright: Copyright 2015-2018 Bryan Gardiner
+copyright: Copyright 2015-2019 Bryan Gardiner
 category: Foreign
 build-type: Simple
 cabal-version: >=1.10
@@ -26,12 +26,13 @@
     , FlexibleInstances
     , FunctionalDependencies
     , GeneralizedNewtypeDeriving
+    , LambdaCase
     , MultiParamTypeClasses
     , ScopedTypeVariables
   build-depends:
       base >=4.7 && <5
-    , Cabal >=1.20 && <2.3
-    , containers >=0.5 && <0.6
+    , Cabal >=1.20 && <2.5
+    , containers >=0.5 && <0.7
     , directory >=1.2 && <1.4
     , filepath >=1.3 && <1.5
   hs-source-dirs: src
diff --git a/src/Foreign/Hoppy/Runtime.hs b/src/Foreign/Hoppy/Runtime.hs
--- a/src/Foreign/Hoppy/Runtime.hs
+++ b/src/Foreign/Hoppy/Runtime.hs
@@ -1,6 +1,6 @@
 -- This file is part of Hoppy.
 --
--- Copyright 2015-2018 Bryan Gardiner <bog@khumba.net>
+-- Copyright 2015-2019 Bryan Gardiner <bog@khumba.net>
 --
 -- Licensed under the Apache License, Version 2.0 (the "License");
 -- you may not use this file except in compliance with the License.
@@ -17,11 +17,9 @@
 -- | Runtime support for generated Haskell bindings.
 module Foreign.Hoppy.Runtime (
   -- * Primitive types
-  CBool (..),
-  -- CBool is a newtype for CUChar, so GHC 7.10 (at least) requires reexporting
-  -- the CUChar data constructor for CBool to be marshalled in foreign imports.
-  CUChar (CUChar),
   coerceIntegral,
+  -- * Enumerations
+  CppEnum (..),
   -- * Objects
   CppPtr (..),
   Deletable (..),
@@ -73,6 +71,7 @@
   touchForeignPtr,
   )
 import Foreign.C (
+  CBool,
   CChar,
   CDouble,
   CFloat,
@@ -82,12 +81,13 @@
   CPtrdiff,
   CShort,
   CSize,
-  CUChar (CUChar),
+  CUChar,
   CUInt,
   CULLong,
   CULong,
   CUShort,
   )
+import GHC.Stack (HasCallStack)
 import System.IO.Unsafe (unsafePerformIO)
 import System.Posix.Types (CSsize)
 import Unsafe.Coerce (unsafeCoerce)
@@ -96,22 +96,6 @@
   :: (FunPtr (IO ()) -> IO ())
   -> IO (FunPtr (FunPtr (IO ()) -> IO ()))
 
--- | A numeric type representing a C++ boolean.
-newtype CBool = CBool CUChar
-  deriving (Eq, Integral, Num, Ord, Real, Show, Storable)
-
-instance Bounded CBool where
-  minBound = 0
-  maxBound = 1
-
-instance Enum CBool where
-  fromEnum (CBool n) = fromIntegral n
-
-  toEnum n =
-    if n == 0 || n == 1
-    then CBool $ fromIntegral n
-    else error $ concat ["CBool.toEnum: Invalid value ", show n, "."]
-
 -- | Converts between integral types by going from @a@ to @b@, and also
 -- round-tripping the @b@ value back to an @a@ value.  If the two @a@ values
 -- don't match, then an error is signalled.
@@ -124,6 +108,19 @@
      else error $ "Conversion from " ++ show (typeOf a) ++ " to " ++
           show (typeOf b) ++ " does not preserve the value " ++ show a ++ "."
 
+-- | An instance @e@ of this class represents a value belonging to a C++
+-- enumeration with numeric type @n@.
+class CppEnum n e | e -> n where
+  -- | Converts a number into an enum value.
+  --
+  -- If the Hoppy binding didn't request that the enum support arbitrary unknown
+  -- values, then given an entry not explicitly supported by the enum, this
+  -- throws an exception.
+  toCppEnum :: HasCallStack => n -> e
+
+  -- | Extracts the number that an enum value represents.
+  fromCppEnum :: e -> n
+
 -- | An instance of this class represents a handle (a pointer) to a C++ object.
 -- All C++ classes bound by Hoppy have instances of @CppPtr@.  The lifetime of
 -- such an object can optionally be managed by the Haskell garbage collector.
@@ -463,7 +460,7 @@
   -- Indicate no exception unless we catch something.
   poke excIdPtr 0
 
-  catch doCall $ \caughtEx -> case caughtEx of
+  catch doCall $ \case
     SomeCppException classInfo caughtFPtr caughtPtr -> do
       let ExceptionId excId = exceptionClassId classInfo
       poke excIdPtr excId
diff --git a/src/Foreign/Hoppy/Setup.hs b/src/Foreign/Hoppy/Setup.hs
--- a/src/Foreign/Hoppy/Setup.hs
+++ b/src/Foreign/Hoppy/Setup.hs
@@ -1,6 +1,6 @@
 -- This file is part of Hoppy.
 --
--- Copyright 2015-2018 Bryan Gardiner <bog@khumba.net>
+-- Copyright 2015-2019 Bryan Gardiner <bog@khumba.net>
 --
 -- Licensed under the Apache License, Version 2.0 (the "License");
 -- you may not use this file except in compliance with the License.
@@ -156,11 +156,20 @@
   , hsSourcesDir :: FilePath
     -- ^ The directory into which to generate Haskell sources, under the Haskell
     -- gateway package root.
+  , interfaceName :: Maybe String
+    -- ^ If the generator contains multiple interfaces, then this can be used to
+    -- select one.  If present, it is passed as an argument to @--interface@
+    -- when invoking the generator.  If absent, the default interface is used.
   }
 
 getGeneratorProgram :: ProjectConfig -> Program
 getGeneratorProgram project = simpleProgram $ generatorExecutableName project
 
+getInterfaceArg :: ProjectConfig -> [String]
+getInterfaceArg project = case interfaceName project of
+  Just name -> ["--interface", name]
+  Nothing -> []
+
 -- | A @main@ implementation to be used in the @Setup.hs@ of a C++ gateway
 -- package.
 --
@@ -234,7 +243,8 @@
   let programDb = withPrograms localBuildInfo
       sourcesDir = cppSourcesDir project
   createDirectoryIfMissing True sourcesDir
-  runDbProgram verbosity generatorProgram programDb ["--gen-cpp", sourcesDir]
+  runDbProgram verbosity generatorProgram programDb $
+    getInterfaceArg project ++ ["--gen-cpp", sourcesDir]
 
   -- When there is a configure script, then run it.
   maybeConfigureProgram <- findConfigure
@@ -305,8 +315,8 @@
     die
 #endif
     "No Makefile found."
-  makeProgram <- findSystemProgram verbosity "make"
-  runProgram verbosity makeProgram ["clean"]
+  make <- findSystemProgram verbosity "make"
+  runProgram verbosity make ["clean"]
 
 findSystemProgram :: Verbosity -> FilePath -> IO ConfiguredProgram
 findSystemProgram verbosity basename = do
@@ -421,7 +431,8 @@
           let programDb = withPrograms localBuildInfo
               sourcesDir = hsSourcesDir project
           createDirectoryIfMissing True sourcesDir
-          runDbProgram verbosity generatorProgram programDb ["--gen-hs", sourcesDir]
+          runDbProgram verbosity generatorProgram programDb $
+            getInterfaceArg project ++ ["--gen-hs", sourcesDir]
 
 addLibDir :: IO HookedBuildInfo
 addLibDir = do
@@ -438,7 +449,10 @@
         Cpp -> ("--list-cpp-files", cppSourcesDir)
         Haskell -> ("--list-hs-files", hsSourcesDir)
   generatorProgram <- findSystemProgram verbosity $ generatorExecutableName project
-  generatedFiles <- fmap lines $ getProgramOutput verbosity generatorProgram [listArg]
+  generatedFiles <-
+    lines <$> getProgramOutput verbosity
+                               generatorProgram
+                               (getInterfaceArg project ++ [listArg])
   forM_ generatedFiles $ \file -> do
     let path = sourcesDir project </> file
     exists <- doesFileExist path
