diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,10 @@
 # Changelog for elm-syntax
 
-## Unreleased changes
+## 0.3.1.0
+
+- Simplify record projections on known records
+- Write explicit export lists
+- Fix build with GHC 9.0. (see [#2](https://github.com/folq/elm-syntax/pull/2))
 
 ## 0.3.0.0
 
diff --git a/elm-syntax.cabal b/elm-syntax.cabal
--- a/elm-syntax.cabal
+++ b/elm-syntax.cabal
@@ -7,7 +7,7 @@
 -- hash: 7a5a97356a0303c135c29af83618eccb2a2d5844234020ab4cd4f38ee561609d
 
 name:           elm-syntax
-version:        0.3.0.0
+version:        0.3.1.0
 synopsis:       Elm syntax and pretty-printing
 description:    Please see the README on GitHub at <https://github.com/folq/elm-syntax#readme>
 category:       Elm, Compiler, Language
diff --git a/src/Language/Elm/Expression.hs b/src/Language/Elm/Expression.hs
--- a/src/Language/Elm/Expression.hs
+++ b/src/Language/Elm/Expression.hs
@@ -94,13 +94,13 @@
       bind (fmap F . global) (unvar (pure . B) (fmap F . var)) .
       fromScope
 
-deriving instance Eq v => Eq (Expression v)
-deriving instance Ord v => Ord (Expression v)
-deriving instance Show v => Show (Expression v)
-
 deriveEq1 ''Expression
 deriveOrd1 ''Expression
 deriveShow1 ''Expression
+
+deriving instance Eq v => Eq (Expression v)
+deriving instance Ord v => Ord (Expression v)
+deriving instance Show v => Show (Expression v)
 
 instance IsString (Expression v) where
   fromString = Global . fromString
diff --git a/src/Language/Elm/Pretty.hs b/src/Language/Elm/Pretty.hs
--- a/src/Language/Elm/Pretty.hs
+++ b/src/Language/Elm/Pretty.hs
@@ -1,3 +1,4 @@
+{-# language LambdaCase #-}
 {-# language OverloadedStrings #-}
 {-# language ViewPatterns #-}
 module Language.Elm.Pretty
@@ -92,8 +93,21 @@
       HashSet.map (\(Name.Qualified m _) -> m) $
       HashSet.filter (isNothing . defaultImport) $
       foldMap (Definition.foldMapGlobals HashSet.singleton) defs
+
+    exports =
+      indent 4 $
+      (<> line <> ")") $
+      vsep $
+      zipWith (<>) ("( " : repeat ", ") $
+      map export defs
+
+    export = \case
+      Definition.Constant (Name.Qualified _ name) _ _ _ -> pretty name
+      Definition.Type (Name.Qualified _ name) _ _ -> pretty name <> "(..)"
+      Definition.Alias (Name.Qualified _ name) _ _ -> pretty name
+
   in
-  "module" <+> moduleName mname <+> "exposing (..)" <> line <> line <>
+  "module" <+> moduleName mname <+> "exposing" <> line <> exports <> line <> line <>
   mconcat ["import" <+> moduleName import_ <> line | import_ <- imports] <> line <> line <>
   mconcat (intersperse (line <> line <> line) [definition env def | def <- defs])
 
diff --git a/src/Language/Elm/Simplification.hs b/src/Language/Elm/Simplification.hs
--- a/src/Language/Elm/Simplification.hs
+++ b/src/Language/Elm/Simplification.hs
@@ -69,6 +69,7 @@
 --   is simplified to @let xs = es in branch@ provided that @e@ matches none of
 --   @prefixBranches@ and that it matches @pat@.
 -- * case-of-case
+-- * { n = e, ... }.n = e
 --
 simplifyExpression
   :: Expression v
@@ -129,6 +130,10 @@
 
     (Expression.Global _, _) ->
       Expression.apps expr args
+
+    (Expression.Proj field, Expression.Record record:args')
+      | Just e <- lookup field record ->
+        simplifyApplication e args'
 
     (Expression.App e1 e2, _) ->
       simplifyApplication e1 (simplifyExpression e2 : args)
