diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,9 @@
+## 0.9.0.1 (2017-10-16)
+
+Fixes:
+  - Better Nix packaging.
+  - Add a few missing files to extra-source-files.
+
 ## 0.9.0.0 (2017-10-02)
 
 Changes:
diff --git a/default.nix b/default.nix
deleted file mode 100644
--- a/default.nix
+++ /dev/null
@@ -1,29 +0,0 @@
-{ mkDerivation, async, base, bytestring, containers, directory
-, doctest, exceptions, filepath, hlint, hspec, monad-control
-, monad-logger, mtl, optparse-applicative, protolude, QuickCheck
-, stdenv, text, transformers, transformers-base, unix
-, unix-bytestring
-}:
-mkDerivation {
-  pname = "hpio";
-  version = "0.9.0.0";
-  src = ./.;
-  isLibrary = true;
-  isExecutable = true;
-  libraryHaskellDepends = [
-    base bytestring containers directory exceptions filepath
-    monad-control monad-logger mtl protolude QuickCheck text
-    transformers transformers-base unix unix-bytestring
-  ];
-  executableHaskellDepends = [
-    async base exceptions mtl optparse-applicative protolude text
-    transformers
-  ];
-  testHaskellDepends = [
-    base containers directory doctest exceptions filepath hlint hspec
-    protolude QuickCheck
-  ];
-  homepage = "https://github.com/quixoftic/hpio#readme";
-  description = "Monads for GPIO in Haskell";
-  license = stdenv.lib.licenses.bsd3;
-}
diff --git a/hpio.cabal b/hpio.cabal
--- a/hpio.cabal
+++ b/hpio.cabal
@@ -1,9 +1,9 @@
--- This file has been generated from package.yaml by hpack version 0.18.1.
+-- This file has been generated from package.yaml by hpack version 0.19.2.
 --
 -- see: https://github.com/sol/hpack
 
 name:                   hpio
-version:                0.9.0.0
+version:                0.9.0.1
 synopsis:               Monads for GPIO in Haskell
 description:            This package provides an embedded DSL for writing cross-platform
                         GPIO programs in Haskell. Currently only Linux is supported (via the
@@ -33,11 +33,16 @@
 extra-source-files:
     .travis.yml
     changelog.md
-    default.nix
     Hlint.hs
+    nix/hpio.nix
+    package.yaml
     README.md
+    release.nix
     shell.nix
     stack-lts-2.yaml
+    stack-lts-3.yaml
+    stack-lts-6.yaml
+    stack-lts-7.yaml
     stack.yaml
 
 source-repository head
@@ -74,22 +79,22 @@
   c-sources:
       src/System/GPIO/Linux/Sysfs/pollSysfs.c
   build-depends:
-      QuickCheck          >=2.7.6  && <2.11
-    , base                >=4.7.0  && <5
-    , bytestring          >=0.10.4 && <0.11
-    , containers          >=0.5.5  && <0.6
-    , directory           >=1.2.1  && <1.4
-    , exceptions          >=0.8.0  && <1
-    , filepath            >=1.3.0  && <1.5
-    , monad-control       == 1.*
-    , monad-logger        == 0.3.*
-    , mtl                 >=2.1.3  && <2.3
-    , protolude           == 0.2.*
-    , text                >=1.2.0  && <1.3
-    , transformers        >=0.3.0  && <0.6
-    , transformers-base   == 0.4.*
-    , unix                >=2.7.0  && <2.8
-    , unix-bytestring     >=0.3.7  && <0.4
+      QuickCheck >=2.7.6 && <2.11
+    , base >=4.7.0 && <5
+    , bytestring >=0.10.4 && <0.11
+    , containers >=0.5.5 && <0.6
+    , directory >=1.2.1 && <1.4
+    , exceptions >=0.8.0 && <1
+    , filepath >=1.3.0 && <1.5
+    , monad-control ==1.*
+    , monad-logger ==0.3.*
+    , mtl >=2.1.3 && <2.3
+    , protolude ==0.2.*
+    , text >=1.2.0 && <1.3
+    , transformers >=0.3.0 && <0.6
+    , transformers-base ==0.4.*
+    , unix >=2.7.0 && <2.8
+    , unix-bytestring >=0.3.7 && <0.4
   if impl(ghc >= 8.0)
     ghc-options: -Wall -Wincomplete-uni-patterns -Wincomplete-record-updates
   else
@@ -98,8 +103,8 @@
     ghc-options: -Wcompat -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances
   else
     build-depends:
-        fail       == 4.9.*
-      , semigroups == 0.18.*
+        fail ==4.9.*
+      , semigroups ==0.18.*
   exposed-modules:
       System.GPIO
       System.GPIO.Linux
@@ -132,8 +137,8 @@
     buildable: False
   else
     build-depends:
-        base
-      , async >=2.0.2 && <2.2
+        async >=2.0.2 && <2.2
+      , base
       , exceptions
       , hpio
       , mtl
@@ -160,8 +165,8 @@
     buildable: False
   else
     build-depends:
-        base
-      , async >=2.0.2 && <2.2
+        async >=2.0.2 && <2.2
+      , base
       , exceptions
       , hpio
       , mtl
@@ -188,8 +193,8 @@
     buildable: False
   else
     build-depends:
-        base
-      , async >=2.0.2 && <2.2
+        async >=2.0.2 && <2.2
+      , base
       , exceptions
       , hpio
       , mtl
@@ -250,15 +255,15 @@
   default-extensions: NoImplicitPrelude
   ghc-options: -threaded
   build-depends:
-      base
+      QuickCheck
+    , base
     , containers
     , directory
     , exceptions
     , filepath
     , hpio
-    , hspec                >=2.1.7
+    , hspec >=2.1.7
     , protolude
-    , QuickCheck
   if impl(ghc >= 8.0)
     ghc-options: -Wall -Wincomplete-uni-patterns -Wincomplete-record-updates
   else
@@ -271,4 +276,5 @@
       Test.System.GPIO.Linux.Sysfs.MockSpec
       Test.System.GPIO.Linux.Sysfs.SysfsGpioMockSpec
       Test.System.GPIO.TypesSpec
+      Paths_hpio
   default-language: Haskell2010
diff --git a/nix/hpio.nix b/nix/hpio.nix
new file mode 100644
--- /dev/null
+++ b/nix/hpio.nix
@@ -0,0 +1,29 @@
+{ mkDerivation, async, base, bytestring, containers, directory
+, doctest, exceptions, filepath, hlint, hspec, monad-control
+, monad-logger, mtl, optparse-applicative, protolude, QuickCheck
+, stdenv, text, transformers, transformers-base, unix
+, unix-bytestring
+}:
+mkDerivation {
+  pname = "hpio";
+  version = "0.9.0.1";
+  src = ./.;
+  isLibrary = true;
+  isExecutable = true;
+  libraryHaskellDepends = [
+    base bytestring containers directory exceptions filepath
+    monad-control monad-logger mtl protolude QuickCheck text
+    transformers transformers-base unix unix-bytestring
+  ];
+  executableHaskellDepends = [
+    async base exceptions mtl optparse-applicative protolude text
+    transformers
+  ];
+  testHaskellDepends = [
+    base containers directory doctest exceptions filepath hlint hspec
+    protolude QuickCheck
+  ];
+  homepage = "https://github.com/quixoftic/hpio#readme";
+  description = "Monads for GPIO in Haskell";
+  license = stdenv.lib.licenses.bsd3;
+}
diff --git a/package.yaml b/package.yaml
new file mode 100644
--- /dev/null
+++ b/package.yaml
@@ -0,0 +1,251 @@
+name:        hpio
+version:     0.9.0.1
+synopsis:    Monads for GPIO in Haskell
+category:    System
+stability:   experimental
+author:      Drew Hess <dhess-src@quixoftic.com>
+maintainer:  Drew Hess <dhess-src@quixoftic.com>
+copyright:   Copyright (c) 2017, Quixoftic, LLC
+license:     BSD3
+github:      quixoftic/hpio
+
+description: ! 'This package provides an embedded DSL for writing cross-platform
+
+  GPIO programs in Haskell. Currently only Linux is supported (via the
+
+  @sysfs@ filesystem), but other Unix GPIO platforms will be supported
+
+  in the future.
+
+
+  Monads and low-level actions are also provided for each supported
+
+  platform''s native GPIO API, if you want to program directly to
+
+  the platform API.
+
+
+  Example programs are provided in the ''examples'' directory of the
+
+  source code distribution. There is also a "System.GPIO.Tutorial"
+
+  module, which explains how to use the cross-platform DSL.'
+
+tested-with: GHC==7.8.4 GHC==7.10.2 GHC==7.10.3 GHC==8.0.1 GHC==8.0.2 GHC==8.2.1
+
+flags:
+  test-hlint:
+    description: Build hlint test
+    manual: true
+    default: true
+  test-doctests:
+    description: Build doctests
+    manual: true
+    default: true
+  linux-bbone-tests:
+    description: >
+      Enable Linux BeagleBone-specific tests. Disabled by default. See
+      test/System/GPIO/Linux/Sysfs/BeagleBoneSpec.hs for requirements.
+      Run with "cabal test -flinux-bbone-tests".
+    manual: true
+    default: false
+  examples:
+    description: Build the example programs
+    manual: true
+    default: true
+
+when:
+  - condition: impl(ghc >= 8.0)
+    then:
+      ghc-options:
+        - -Wall
+        - -Wincomplete-uni-patterns
+        - -Wincomplete-record-updates
+    else:
+      ghc-options:
+        - -Wall
+        - -fwarn-incomplete-uni-patterns
+        - -fwarn-incomplete-record-updates
+
+default-extensions:
+  - NoImplicitPrelude
+
+library:
+  when:
+    - condition: impl(ghc >= 8.0)
+      then:
+        ghc-options:
+          - -Wcompat
+          - -Wnoncanonical-monad-instances
+          - -Wnoncanonical-monadfail-instances
+      else:
+        # provide/emulate `Control.Monad.Fail` and `Data.Semigroups` API for pre-GHC8
+        dependencies:
+          - fail       == 4.9.*
+          - semigroups == 0.18.*
+  source-dirs: src
+  c-sources:
+    - src/System/GPIO/Linux/Sysfs/pollSysfs.c
+  cc-options:
+    - -Wall
+  other-extensions:
+    - ConstraintKinds
+    - CPP
+    - DefaultSignatures
+    - DeriveDataTypeable
+    - DeriveGeneric
+    - ExistentialQuantification
+    - FlexibleContexts
+    - FlexibleInstances
+    - FunctionalDependencies
+    - GADTs
+    - GeneralizedNewtypeDeriving
+    - InterruptibleFFI
+    - KindSignatures
+    - LambdaCase
+    - MultiParamTypeClasses
+    - OverloadedStrings
+    - PackageImports
+    - QuasiQuotes
+    - Safe
+    - TemplateHaskell
+    - Trustworthy
+    - TypeSynonymInstances
+    - UndecidableInstances
+  dependencies:
+    - QuickCheck          >=2.7.6  && <2.11
+    - base                >=4.7.0  && <5
+    - bytestring          >=0.10.4 && <0.11
+    - containers          >=0.5.5  && <0.6
+    - directory           >=1.2.1  && <1.4
+    - exceptions          >=0.8.0  && <1
+    - filepath            >=1.3.0  && <1.5
+    - monad-control       == 1.*
+    - monad-logger        == 0.3.*
+    - mtl                 >=2.1.3  && <2.3
+    - protolude           == 0.2.*
+    - text                >=1.2.0  && <1.3
+    - transformers        >=0.3.0  && <0.6
+    - transformers-base   == 0.4.*
+    - unix                >=2.7.0  && <2.8
+    - unix-bytestring     >=0.3.7  && <0.4
+
+executables:
+  hpio-reader-example: &executable
+    main: GpioReader.hs
+    source-dirs: examples
+    other-modules: []
+    other-extensions:
+      - ConstraintKinds
+      - FlexibleContexts
+      - LambdaCase
+      - OverloadedStrings
+    ghc-options:
+      - -threaded
+    when:
+      - condition: "!(flag(examples))"
+        then:
+          buildable: false
+        else:
+          dependencies:
+          - base
+          - async >=2.0.2 && <2.2
+          - exceptions
+          - hpio
+          - mtl
+          - optparse-applicative >=0.11.0 && <0.15
+          - protolude
+          - text
+          - transformers
+      - condition: impl(ghc >= 8.0)
+        ghc-options:
+          - -Wcompat
+          - -Wnoncanonical-monad-instances
+          - -Wnoncanonical-monadfail-instances
+          - -fno-warn-redundant-constraints
+          - -fno-warn-redundant-constraints
+  hpio-sysfs-example:
+    <<: *executable
+    main: Sysfs.hs
+    other-extensions:
+      - FlexibleContexts
+      - LambdaCase
+      - OverloadedStrings
+  hpio-example:
+    <<: *executable
+    main: Gpio.hs
+    other-extensions:
+      - ConstraintKinds
+      - LambdaCase
+      - OverloadedStrings
+
+tests:
+  hlint:
+    main: hlint.hs
+    source-dirs: test
+    other-modules: []
+    ghc-options:
+      - -w
+      - -threaded
+    when:
+    - condition: "!(flag(test-hlint))"
+      then:
+        buildable: false
+      else:
+        dependencies:
+          - base
+          - hlint
+          - protolude
+  doctest:
+    main: doctest.hs
+    source-dirs: test
+    other-modules: []
+    ghc-options:
+      - -threaded
+    when:
+    - condition: (!(flag(test-doctests))) || (impl(ghc <7.10))
+      then:
+        buildable: false
+      else:
+        dependencies:
+          - base
+          - doctest
+          - filepath
+          - protolude
+  spec:
+    main: Spec.hs
+    source-dirs:
+      - test
+    ghc-options:
+      - -threaded
+    dependencies:
+      - base
+      - containers
+      - directory
+      - exceptions
+      - filepath
+      - hpio
+      - hspec                >=2.1.7
+      - protolude
+      - QuickCheck
+    ghc-options:
+      - -threaded
+    when:
+      - condition: flag(linux-bbone-tests)
+        cpp-options:
+          -DRUN_LINUX_BBONE_TESTS=1
+
+extra-source-files:
+  - .travis.yml
+  - Hlint.hs
+  - README.md
+  - changelog.md
+  - nix/*
+  - package.yaml
+  - release.nix
+  - shell.nix
+  - stack.yaml
+  - stack-lts-2.yaml
+  - stack-lts-3.yaml
+  - stack-lts-6.yaml
+  - stack-lts-7.yaml
diff --git a/release.nix b/release.nix
new file mode 100644
--- /dev/null
+++ b/release.nix
@@ -0,0 +1,67 @@
+{ compiler ? "ghc821" }:
+
+let
+  # Disable tests for these packages
+  dontCheckPackages = [
+  ];
+
+  # Jailbreak these packages
+  doJailbreakPackages = [
+  ];
+
+  # Disable haddocks for these packages
+  dontHaddockPackages = [
+  ];
+
+  config = {
+    packageOverrides = pkgs: rec {
+      haskellPackages =
+        let
+          generatedOverrides = haskellPackagesNew: haskellPackagesOld:
+            let
+              toPackage = file: _: {
+                name  = builtins.replaceStrings [ ".nix" ] [ "" ] file;
+
+                value = haskellPackagesNew.callPackage (./. + "/nix/${file}") { };
+              };
+
+            in
+              pkgs.lib.mapAttrs' toPackage (builtins.readDir ./nix);
+
+          makeOverrides =
+            function: names: haskellPackagesNew: haskellPackagesOld:
+              let
+                toPackage = name: {
+                  inherit name;
+
+                  value = function haskellPackagesOld.${name};
+                };
+
+            in
+              builtins.listToAttrs (map toPackage names);
+
+          composeExtensionsList =
+            pkgs.lib.fold pkgs.lib.composeExtensions (_: _: {});
+
+          # More exotic overrides go here
+          manualOverrides = haskellPackagesNew: haskellPackagesOld: {
+            protolude = pkgs.haskell.packages.${compiler}.protolude_0_2;
+          };
+        in
+          pkgs.haskell.packages.${compiler}.override {
+            overrides = composeExtensionsList [
+              generatedOverrides
+              (makeOverrides pkgs.haskell.lib.dontCheck   dontCheckPackages  )
+              (makeOverrides pkgs.haskell.lib.doJailbreak doJailbreakPackages)
+              (makeOverrides pkgs.haskell.lib.dontHaddock dontHaddockPackages)
+              manualOverrides
+            ];
+          };
+    };
+  };
+
+  pkgs = import <nixpkgs> { inherit config; };
+
+in
+  { hpio = pkgs.haskellPackages.hpio;
+  }
diff --git a/shell.nix b/shell.nix
--- a/shell.nix
+++ b/shell.nix
@@ -1,47 +1,3 @@
-{ nixpkgs ? import <nixpkgs> {}, compiler ? "default", doBenchmark ? false }:
-
-let
-
-  inherit (nixpkgs) pkgs;
-
-  f = { mkDerivation, async, base, bytestring, containers
-      , directory, doctest, exceptions, filepath, hlint, hspec
-      , monad-control, monad-logger, mtl, optparse-applicative, protolude
-      , QuickCheck, stdenv, text, transformers, transformers-base, unix
-      , unix-bytestring
-      }:
-      mkDerivation {
-        pname = "hpio";
-        version = "0.9.0.0";
-        src = ./.;
-        isLibrary = true;
-        isExecutable = true;
-        libraryHaskellDepends = [
-          base bytestring containers directory exceptions filepath
-          monad-control monad-logger mtl protolude QuickCheck text
-          transformers transformers-base unix unix-bytestring
-        ];
-        executableHaskellDepends = [
-          async base exceptions mtl optparse-applicative protolude text
-          transformers
-        ];
-        testHaskellDepends = [
-          base containers directory doctest exceptions filepath hlint hspec
-          protolude QuickCheck
-        ];
-        homepage = "https://github.com/quixoftic/hpio#readme";
-        description = "Monads for GPIO in Haskell";
-        license = stdenv.lib.licenses.bsd3;
-      };
-
-  haskellPackages = if compiler == "default"
-                       then pkgs.haskellPackages
-                       else pkgs.haskell.packages.${compiler};
-
-  variant = if doBenchmark then pkgs.haskell.lib.doBenchmark else pkgs.lib.id;
-
-  drv = variant (haskellPackages.callPackage f {});
-
-in
+{ compiler ? "ghc821" }:
 
-  if pkgs.lib.inNixShell then drv.env else drv
+(import ./release.nix { inherit compiler; }).hpio.env
diff --git a/stack-lts-3.yaml b/stack-lts-3.yaml
new file mode 100644
--- /dev/null
+++ b/stack-lts-3.yaml
@@ -0,0 +1,15 @@
+require-stack-version: ">= 1.1.0"
+pvp-bounds: both
+resolver: lts-3.22
+packages:
+- .
+extra-deps:
+- protolude-0.2
+- fail-4.9.0.0
+- semigroups-0.18.2
+- unix-bytestring-0.3.7.3
+flags:
+  hpio:
+    test-hlint: false
+  semigroups:
+    bytestring-builder: false
diff --git a/stack-lts-6.yaml b/stack-lts-6.yaml
new file mode 100644
--- /dev/null
+++ b/stack-lts-6.yaml
@@ -0,0 +1,10 @@
+require-stack-version: ">= 1.1.0"
+pvp-bounds: both
+resolver: lts-6.35
+extra-deps:
+- protolude-0.2
+packages:
+- .
+flags:
+  hpio:
+    test-hlint: false
diff --git a/stack-lts-7.yaml b/stack-lts-7.yaml
new file mode 100644
--- /dev/null
+++ b/stack-lts-7.yaml
@@ -0,0 +1,10 @@
+require-stack-version: ">= 1.1.0"
+pvp-bounds: both
+resolver: lts-7.24
+extra-deps:
+- protolude-0.2
+packages:
+- .
+flags:
+  hpio:
+    test-hlint: false
