diff --git a/hpack.cabal b/hpack.cabal
--- a/hpack.cabal
+++ b/hpack.cabal
@@ -1,9 +1,9 @@
--- This file has been generated from package.yaml by hpack version 0.14.0.
+-- This file has been generated from package.yaml by hpack version 0.14.1.
 --
 -- see: https://github.com/sol/hpack
 
 name:           hpack
-version:        0.14.1
+version:        0.15.0
 synopsis:       An alternative format for Haskell packages
 category:       Development
 homepage:       https://github.com/sol/hpack#readme
@@ -33,7 +33,7 @@
     , containers
     , unordered-containers
     , yaml
-    , aeson >= 0.8
+    , aeson >= 0.11
   exposed-modules:
       Hpack
       Hpack.Config
@@ -64,8 +64,8 @@
     , containers
     , unordered-containers
     , yaml
+    , aeson >= 0.11
     , hpack
-    , aeson >= 0.8
   default-language: Haskell2010
 
 test-suite spec
@@ -87,13 +87,13 @@
     , containers
     , unordered-containers
     , yaml
+    , aeson >= 0.11
     , hspec == 2.*
     , QuickCheck
     , temporary
     , mockery >= 0.3
     , interpolate
     , aeson-qq
-    , aeson >= 0.10
   other-modules:
       Helper
       Hpack.ConfigSpec
diff --git a/src/Hpack/Config.hs b/src/Hpack/Config.hs
--- a/src/Hpack/Config.hs
+++ b/src/Hpack/Config.hs
@@ -5,6 +5,7 @@
 {-# LANGUAGE DeriveTraversable #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE ScopedTypeVariables #-}
@@ -36,6 +37,7 @@
 , Empty(..)
 , getModules
 , determineModules
+, BuildType(..)
 #endif
 ) where
 
@@ -63,7 +65,7 @@
 import           Hpack.Yaml
 
 package :: String -> String -> Package
-package name version = Package name version Nothing Nothing Nothing Nothing Nothing Nothing [] [] [] Nothing Nothing Nothing [] [] [] Nothing Nothing [] [] []
+package name version = Package name version Nothing Nothing Nothing Nothing Nothing Nothing [] [] [] Simple Nothing Nothing Nothing [] [] [] Nothing Nothing [] [] []
 
 renamePackage :: String -> Package -> Package
 renamePackage name p@Package{..} = p {
@@ -91,7 +93,7 @@
   ++ maybe [] sectionDependencies packageLibrary
 
 section :: a -> Section a
-section a = Section a [] [] [] [] [] [] [] [] [] [] [] [] [] Nothing [] []
+section a = Section a [] [] [] [] [] [] [] [] [] [] [] [] [] [] Nothing [] []
 
 packageConfig :: FilePath
 packageConfig = "package.yaml"
@@ -99,7 +101,11 @@
 githubBaseUrl :: String
 githubBaseUrl = "https://github.com/"
 
+#if MIN_VERSION_aeson(1,0,0)
+genericParseJSON_ :: forall a. (Generic a, GFromJSON Zero (Rep a), HasTypeName a) => Value -> Parser a
+#else
 genericParseJSON_ :: forall a. (Generic a, GFromJSON (Rep a), HasTypeName a) => Value -> Parser a
+#endif
 genericParseJSON_ = genericParseJSON defaultOptions {fieldLabelModifier = hyphenize name}
   where
     name :: String
@@ -181,6 +187,7 @@
 , commonOptionsGhcOptions :: Maybe (List GhcOption)
 , commonOptionsGhcProfOptions :: Maybe (List GhcProfOption)
 , commonOptionsCppOptions :: Maybe (List CppOption)
+, commonOptionsCcOptions :: Maybe (List CcOption)
 , commonOptionsCSources :: Maybe (List FilePath)
 , commonOptionsExtraLibDirs :: Maybe (List FilePath)
 , commonOptionsExtraLibraries :: Maybe (List FilePath)
@@ -241,6 +248,22 @@
 instance HasFieldNames Empty where
   fieldNames _ = []
 
+-- From Cabal the library, copied here to avoid a dependency on Cabal.
+data BuildType
+  = Simple
+  | Configure
+  | Make
+  | Custom
+  deriving (Eq, Show, Generic)
+
+instance FromJSON BuildType where
+  parseJSON = withText "String" $ \case
+    "Simple"    -> return Simple
+    "Configure" -> return Configure
+    "Make"      -> return Make
+    "Custom"    -> return Custom
+    _           -> fail "build-type must be one of: Simple, Configure, Make, Custom"
+
 data PackageConfig = PackageConfig {
   packageConfigName :: Maybe String
 , packageConfigVersion :: Maybe String
@@ -253,6 +276,7 @@
 , packageConfigAuthor :: Maybe (List String)
 , packageConfigMaintainer :: Maybe (List String)
 , packageConfigCopyright :: Maybe (List String)
+, packageConfigBuildType :: Maybe BuildType
 , packageConfigLicense :: Maybe String
 , packageConfigLicenseFile :: Maybe String
 , packageConfigTestedWith :: Maybe String
@@ -353,6 +377,7 @@
 , packageAuthor :: [String]
 , packageMaintainer :: [String]
 , packageCopyright :: [String]
+, packageBuildType :: BuildType
 , packageLicense :: Maybe String
 , packageLicenseFile :: Maybe FilePath
 , packageTestedWith :: Maybe String
@@ -388,6 +413,7 @@
 , sectionGhcOptions :: [GhcOption]
 , sectionGhcProfOptions :: [GhcProfOption]
 , sectionCppOptions :: [CppOption]
+, sectionCcOptions :: [CcOption]
 , sectionCSources :: [FilePath]
 , sectionExtraLibDirs :: [FilePath]
 , sectionExtraLibraries :: [FilePath]
@@ -470,6 +496,7 @@
       , packageAuthor = fromMaybeList packageConfigAuthor
       , packageMaintainer = fromMaybeList packageConfigMaintainer
       , packageCopyright = fromMaybeList packageConfigCopyright
+      , packageBuildType = fromMaybe Simple packageConfigBuildType
       , packageLicense = packageConfigLicense
       , packageLicenseFile = packageConfigLicenseFile <|> (guard licenseFileExists >> Just "LICENSE")
       , packageTestedWith = packageConfigTestedWith
@@ -607,6 +634,7 @@
   , sectionGhcOptions = sectionGhcOptions globalOptions ++ sectionGhcOptions options
   , sectionGhcProfOptions = sectionGhcProfOptions globalOptions ++ sectionGhcProfOptions options
   , sectionCppOptions = sectionCppOptions globalOptions ++ sectionCppOptions options
+  , sectionCcOptions = sectionCcOptions globalOptions ++ sectionCcOptions options
   , sectionCSources = sectionCSources globalOptions ++ sectionCSources options
   , sectionExtraLibDirs = sectionExtraLibDirs globalOptions ++ sectionExtraLibDirs options
   , sectionExtraLibraries = sectionExtraLibraries globalOptions ++ sectionExtraLibraries options
@@ -621,7 +649,7 @@
 
 toSection :: a -> CommonOptions -> ([FieldName], Section a)
 toSection a CommonOptions{..}
-  = ( concat unknownFields 
+  = ( concat unknownFields
     , Section {
         sectionData = a
       , sectionSourceDirs = fromMaybeList commonOptionsSourceDirs
@@ -630,6 +658,7 @@
       , sectionGhcOptions = fromMaybeList commonOptionsGhcOptions
       , sectionGhcProfOptions = fromMaybeList commonOptionsGhcProfOptions
       , sectionCppOptions = fromMaybeList commonOptionsCppOptions
+      , sectionCcOptions = fromMaybeList commonOptionsCcOptions
       , sectionCSources = fromMaybeList commonOptionsCSources
       , sectionExtraLibDirs = fromMaybeList commonOptionsExtraLibDirs
       , sectionExtraLibraries = fromMaybeList commonOptionsExtraLibraries
diff --git a/src/Hpack/Run.hs b/src/Hpack/Run.hs
--- a/src/Hpack/Run.hs
+++ b/src/Hpack/Run.hs
@@ -100,7 +100,7 @@
       , ("license", packageLicense)
       , ("license-file", packageLicenseFile)
       , ("tested-with", packageTestedWith)
-      , ("build-type", Just "Simple")
+      , ("build-type", Just (show packageBuildType))
       , ("cabal-version", cabalVersion)
       ]
 
@@ -209,6 +209,7 @@
   , renderGhcOptions sectionGhcOptions
   , renderGhcProfOptions sectionGhcProfOptions
   , renderCppOptions sectionCppOptions
+  , renderCcOptions sectionCcOptions
   , Field "include-dirs" (LineSeparatedList sectionIncludeDirs)
   , Field "install-includes" (LineSeparatedList sectionInstallIncludes)
   , Field "c-sources" (LineSeparatedList sectionCSources)
@@ -254,6 +255,9 @@
 
 renderCppOptions :: [CppOption] -> Element
 renderCppOptions = Field "cpp-options" . WordList
+
+renderCcOptions :: [CcOption] -> Element
+renderCcOptions = Field "cc-options" . WordList
 
 renderLdOptions :: [LdOption] -> Element
 renderLdOptions = Field "ld-options" . WordList
diff --git a/src/Hpack/Util.hs b/src/Hpack/Util.hs
--- a/src/Hpack/Util.hs
+++ b/src/Hpack/Util.hs
@@ -4,6 +4,7 @@
 , GhcOption
 , GhcProfOption
 , CppOption
+, CcOption
 , LdOption
 , parseMain
 , toModule
@@ -50,6 +51,7 @@
 type GhcOption = String
 type GhcProfOption = String
 type CppOption = String
+type CcOption = String
 type LdOption = String
 
 parseMain :: String -> (FilePath, [GhcOption])
@@ -71,7 +73,7 @@
 toModule path = case reverse path of
   [] -> Nothing
   x : xs -> do
-    m <- stripSuffix ".hs" x <|> stripSuffix ".lhs" x
+    m <- stripSuffix ".hs" x <|> stripSuffix ".lhs" x <|> stripSuffix ".hsc" x
     let name = reverse (m : xs)
     guard (isModule name) >> return (intercalate "." name)
   where
diff --git a/test/Hpack/ConfigSpec.hs b/test/Hpack/ConfigSpec.hs
--- a/test/Hpack/ConfigSpec.hs
+++ b/test/Hpack/ConfigSpec.hs
@@ -457,6 +457,33 @@
         |]
         (packageLicenseFile >>> (`shouldBe` Just "FOO"))
 
+    it "accepts build-type: Simple" $ do
+      withPackageConfig_ [i|
+        build-type: Simple
+        |]
+        (`shouldBe` package {packageBuildType = Simple})
+
+    it "accepts build-type: Configure" $ do
+      withPackageConfig_ [i|
+        build-type: Configure
+        |]
+        (`shouldBe` package {packageBuildType = Configure})
+
+    it "accepts build-type: Make" $ do
+      withPackageConfig_ [i|
+        build-type: Make
+        |]
+        (`shouldBe` package {packageBuildType = Make})
+
+    it "accepts build-type: Custom" $ do
+      withPackageConfig_ [i|
+        build-type: Custom
+        |]
+        (`shouldBe` package {packageBuildType = Custom})
+
+    it "rejects unknown build-type" $ do
+      parseEither parseJSON (String "foobar") `shouldBe` (Left "Error in $: build-type must be one of: Simple, Configure, Make, Custom" :: Either String BuildType)
+
     it "accepts flags" $ do
       withPackageConfig_ [i|
         flags:
@@ -546,6 +573,30 @@
         }
         )
 
+    it "accepts cc-options" $ do
+      withPackageConfig_ [i|
+        cc-options: -Wall
+        library:
+          cc-options: -fLIB
+
+        executables:
+          foo:
+            main: Main.hs
+            cc-options: -O2
+
+
+        tests:
+          spec:
+            main: Spec.hs
+            cc-options: -O0
+        |]
+        (`shouldBe` package {
+          packageLibrary = Just (section library) {sectionCcOptions = ["-Wall", "-fLIB"]}
+        , packageExecutables = [(section $ executable "foo" "Main.hs") {sectionCcOptions = ["-Wall", "-O2"]}]
+        , packageTests = [(section $ executable "spec" "Spec.hs") {sectionCcOptions = ["-Wall", "-O0"]}]
+        }
+        )
+
     it "accepts ld-options" $ do
       withPackageConfig_ [i|
         library:
@@ -789,10 +840,8 @@
           (do
           touch "src/Main.hs"
           touch "src/Foo.hs"
-          touch "src/Bar.hs"
-          touch "src/Baz.lhs"
           )
-          (map (executableOtherModules . sectionData) . packageExecutables >>> (`shouldBe` [["Bar", "Baz", "Foo"]]))
+          (map (executableOtherModules . sectionData) . packageExecutables >>> (`shouldBe` [["Foo"]]))
 
       it "allows to specify other-modules" $ do
         withPackageConfig [i|
@@ -969,7 +1018,7 @@
               foo:
                 ain: driver/Main.hs
             |]
-          readPackageConfig file `shouldReturn` Left (file ++ ": Error in $.executables.foo: failed to parse field executables: The key \"main\" was not found")
+          readPackageConfig file >>= (`shouldSatisfy` isLeft)
 
       context "when package.yaml does not exist" $ do
         it "returns an error" $ \dir -> do
diff --git a/test/Hpack/UtilSpec.hs b/test/Hpack/UtilSpec.hs
--- a/test/Hpack/UtilSpec.hs
+++ b/test/Hpack/UtilSpec.hs
@@ -37,8 +37,14 @@
       parseMain "Foo.bar" `shouldBe` ("Foo.hs", ["-main-is Foo.bar"])
 
   describe "toModule" $ do
-    it "maps paths to module names" $ do
-      toModule ["Foo", "Bar", "Baz.hs"] `shouldBe` Just "Foo.Bar.Baz"
+    it "maps .hs paths to module names" $ do
+      toModule ["Foo", "Bar", "Baz.hs"]  `shouldBe` Just "Foo.Bar.Baz"
+
+    it "maps .lhs paths to module names" $ do
+      toModule ["Foo", "Bar", "Baz.lhs"] `shouldBe` Just "Foo.Bar.Baz"
+
+    it "maps .hsc paths to module names" $ do
+      toModule ["Foo", "Bar", "Baz.hsc"] `shouldBe` Just "Foo.Bar.Baz"
 
     it "rejects invalid module names" $ do
       toModule ["resources", "hello.hs"] `shouldBe` Nothing
