diff --git a/.travis.yml b/.travis.yml
--- a/.travis.yml
+++ b/.travis.yml
@@ -12,15 +12,18 @@
 
 matrix:
   include:
-    - env: CABALVER=1.16 GHCVER=7.6.3
-      compiler: ": #GHC 7.6.3"
-      addons: {apt: {packages: [cabal-install-1.16,ghc-7.6.3,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}
-    - env: CABALVER=1.18 GHCVER=7.8.3 COVERAGE=1
-      compiler: ": #GHC 7.8.3"
-      addons: {apt: {packages: [cabal-install-1.18,ghc-7.8.3,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}
-    - env: CABALVER=1.22 GHCVER=7.10.2
-      compiler: ": #GHC 7.10.2"
-      addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.2,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}
+    - env: CABALVER=1.18 GHCVER=7.8.4 COVERAGE=1
+      compiler: ": #GHC 7.8.4"
+      addons: {apt: {packages: [cabal-install-1.18,ghc-7.8.4,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}
+    - env: CABALVER=1.22 GHCVER=7.10.3
+      compiler: ": #GHC 7.10.3"
+      addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.3,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}
+    - env: CABALVER=1.24 GHCVER=8.0.2
+      compiler: ": #GHC 8.0.2"
+      addons: {apt: {packages: [cabal-install-1.24,ghc-8.0.2,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}
+    - env: CABALVER=2.0 GHCVER=8.2.2
+      compiler: ": #GHC 8.2.2"
+      addons: {apt: {packages: [cabal-install-2.0,ghc-8.2.2,alex-3.1.7,happy-1.19.5], sources: [hvr-ghc]}}
 
 before_install:
  - unset CC
@@ -77,3 +80,19 @@
 # `cabal install --force-reinstalls dist/*-*.tar.gz`
  - SRC_TGZ=$(cabal info . | awk '{print $2;exit}').tar.gz &&
    (cd dist && cabal install --force-reinstalls "$SRC_TGZ")
+
+before_deploy:
+ - cp dist/build/cpl/cpl ./
+ - cabal install turtle
+ - runghc misc/build_zip.hs
+
+deploy:
+  provider: releases
+  api_key:
+    secure: "hBzyr9MKoa7xYcxjiiEEa+EgOmD/Fi314ojXB0zz6urcxTXzljLQt705r6Ev+2xlRpXlcpxPbpIAz/Quyzrt7grvuHv1K43ZGEh1QrzUQ7X+ke6gjfgwUAOe37BHUtYR5Dd+THJ2HfAJ5nndFbzfnK5tkkxFk+BuDlUVQlIGw00="
+  file_glob: true
+  file: '*.zip'
+  skip_cleanup: true
+  on:
+    tags: true
+    condition: "$GHCVER = 8.2.2"
diff --git a/CPL.cabal b/CPL.cabal
--- a/CPL.cabal
+++ b/CPL.cabal
@@ -1,13 +1,24 @@
 Name:		CPL
-Version:	0.0.8
+Version:	0.0.9
 License:	BSD3
 License-File:	COPYING
 Author:		Masahiro Sakai (masahiro.sakai@gmail.com)
 Maintainer:	masahiro.sakai@gmail.com
 Category:	Compilers/Interpreters
 Cabal-Version:	>=1.10
+Homepage:       https://github.com/msakai/cpl
 Synopsis:	An interpreter of Hagino's Categorical Programming Language (CPL).
-Description:	An interpreter of Hagino's Categorical Programming Language (CPL).
+Description:
+   CPL is a functional programming language based on category
+   theory. Data types are declared in a categorical manner by
+   adjunctions. Data types that can be handled include the terminal
+   object, the initial object, the binary product functor, the binary
+   coproduct functor, the exponential functor, the natural number object,
+   the functor for finite lists, and the functor for infinite lists.
+   Each data type is declared with its basic operations or
+   morphisms. Programs consist of these morphisms, and execution of
+   programs is the reduction of elements (i.e. special morphisms) to
+   their canonical form.
 Extra-Source-Files:
    README.markdown,
    CHANGELOG.markdown,
@@ -29,6 +40,7 @@
    windows/CPL.wxs,
    windows/build_msi.hs,
    windows/build_zip.hs,
+   misc/build_zip.hs,
    build_bdist_linux.sh
 Build-Type: Simple
 
diff --git a/README.markdown b/README.markdown
--- a/README.markdown
+++ b/README.markdown
@@ -1,7 +1,7 @@
 An implementation of "A Categorical Programing Language"
 ========================================================
 
-[![Build Status](https://secure.travis-ci.org/msakai/cpl.png?branch=master)](http://travis-ci.org/msakai/cpl) [![Build status](https://ci.appveyor.com/api/projects/status/dl935ws9jouy06br/branch/master?svg=true)](https://ci.appveyor.com/project/msakai/cpl/branch/master) [![Hackage](https://budueba.com/hackage/CPL)](https://hackage.haskell.org/package/CPL)
+[![Build Status](https://secure.travis-ci.org/msakai/cpl.png?branch=master)](http://travis-ci.org/msakai/cpl) [![Build status](https://ci.appveyor.com/api/projects/status/dl935ws9jouy06br/branch/master?svg=true)](https://ci.appveyor.com/project/msakai/cpl/branch/master) [![Hackage](https://img.shields.io/hackage/v/CPL.svg)](https://hackage.haskell.org/package/CPL)
 
 This package is an implementation of "A Categorical Programing Language"
 (CPL for short)[1][2] written in Haskell.
@@ -53,7 +53,7 @@
 
 (1) Tatsuya Hagino, “A Categorical Programming Languge”.
     Ph.D. Thesis, University of Edinburgh, 1987
-    available at <http://www.tom.sfc.keio.ac.jp/~hagino/index.html.en>
+    available at <http://web.sfc.keio.ac.jp/~hagino/index.html.en>
 
 (2) Tatsuya Hagino, “Categorical Functional Programming Language”.
     Computer Software, Vol 7, No.1.
diff --git a/appveyor.yml b/appveyor.yml
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,56 +1,53 @@
+cache:
+- "c:\\sr" # stack root, short paths == less problems
+
+# to disable automatic builds
+#build: off
+
 platform:
 - x86
 - x64
 
+environment:
+  global:
+    STACK_ROOT: "c:\\sr"
+
 install:
+- if %PLATFORM%==x86 (curl -ostack.zip -L --insecure http://www.stackage.org/stack/windows-i386) else (curl -ostack.zip -L --insecure http://www.stackage.org/stack/windows-x86_64)
+- 7z x stack.zip stack.exe
+- stack --resolver=lts-9.21 setup > nul
 - ps: |
-    # This is necessary because AppVeyor uses 64 bit environemnt even if "platform: x86" is specified.
-    # see also <http://help.appveyor.com/discussions/questions/213-platform-x86-is-not-32-bit>
-    if ("x86".Equals(${env:PLATFORM})) {
-      $env:HPChocoOptions = "--x86"
-      $env:HPPath = "${env:ProgramFiles(x86)}\Haskell Platform\7.10.3"
-      Invoke-WebRequest -Uri https://haskell.org/platform/download/7.10.3/HaskellPlatform-7.10.3-i386-setup.exe -OutFile HaskellPlatform-7.10.3-i386-setup.exe
-      .\HaskellPlatform-7.10.3-i386-setup.exe /S
-    } else {
-      $env:HPChocoOptions = ""
-      $env:HPPath = "${env:ProgramFiles}\Haskell Platform\7.10.3"
-      Invoke-WebRequest -Uri https://haskell.org/platform/download/7.10.3/HaskellPlatform-7.10.3-x86_64-setup.exe -OutFile HaskellPlatform-7.10.3-x86_64-setup.exe
-      .\HaskellPlatform-7.10.3-x86_64-setup.exe /S
-    }
-    # choco install ${env:HPChocoOptions} haskellplatform -version 2014.2.0.0 -y
-    # Haskell Platfrom package doesn't update PATH for the current shell instance
-    $env:Path += ";${env:HPPath}\bin"
-    $env:Path += ";${env:HPPath}\lib\extralibs\bin"
-    $env:Path += ";${env:HPPath}\mingw\bin"
-    $env:Path += ";.\.cabal-sandbox\bin"
-    choco install wixtoolset -version 3.10.1.2213 -y
-    $env:Path += ";${env:ProgramFiles}\WiX Toolset v3.10\bin"
-    $env:Path += ";${env:ProgramFiles(x86)}\WiX Toolset v3.10\bin"
-- cabal sandbox init
-- cabal update
-- cabal install --only-dependencies --enable-tests --enable-benchmarks -fHaskeline -f-Readline
+    choco --no-progress install wixtoolset -version 3.11.1 -y
+    $env:Path += ";${env:ProgramFiles}\WiX Toolset v3.11\bin"
+    $env:Path += ";${env:ProgramFiles(x86)}\WiX Toolset v3.11\bin"
 
 build_script:
-- cabal configure --enable-tests --enable-benchmarks -fHaskeline -f-Readline -v2 # -v2 provides useful information for debugging
-- cabal build
+# The ugly echo "" hack is to avoid complaints about 0 being an invalid file
+# descriptor
+- echo "" | stack --resolver=lts-9.21 --no-terminal test --bench --no-run-benchmarks --flag CPL:Haskeline --flag CPL:-Readline
 
-after_build:
+after_test:
+- ps: cp "$(./stack --resolver=lts-9.21 path --local-install-root)/bin/cpl.exe" cpl.exe
 - cmd: |
    cd windows
    echo Creating msi...
-   runhaskell build_msi.hs
+   ..\stack --resolver=lts-9.21 runhaskell --package turtle build_msi.hs
    echo Creating zip...
-   cabal install turtle
-   runhaskell build_zip.hs
+   ..\stack --resolver=lts-9.21 runhaskell --package turtle build_zip.hs
    cd ..
 
-test_script:
-- cabal test
-- cabal check
-- cabal sdist
-
 artifacts:
 - path: windows\*.msi
   name: Windows Installer
 - path: windows\*.zip
   name: Portable Binary Package
+
+deploy:
+- provider: GitHub
+  auth_token:
+    secure: F8cldz47mQ0lW3O9uCEneU5LRklWcKw8JbPuh5BDYA2TfyeqC//GO8vl8/wmBy3Z
+  artifact: Windows Installer, Portable Binary Package
+  force_update: true
+  release: $(appveyor_repo_tag_name)
+  on:
+    appveyor_repo_tag: true
diff --git a/build_bdist_linux.sh b/build_bdist_linux.sh
--- a/build_bdist_linux.sh
+++ b/build_bdist_linux.sh
@@ -12,7 +12,7 @@
 
 cabal sandbox init
 cabal update
-cabal install -p --only-dependencies -f-Haskeline -f-Readline
+cabal install --only-dependencies -f-Haskeline -f-Readline
 cabal configure -fLinuxStatic -f-Haskeline -f-Readline
 cabal build
 
diff --git a/misc/build_zip.hs b/misc/build_zip.hs
new file mode 100644
--- /dev/null
+++ b/misc/build_zip.hs
@@ -0,0 +1,53 @@
+{-# OPTIONS_GHC -Wall #-}
+{-# LANGUAGE ScopedTypeVariables, OverloadedStrings #-}
+import Control.Exception
+import Control.Monad
+import Data.String
+import Distribution.Package
+import Distribution.PackageDescription
+import Distribution.PackageDescription.Parse
+import Distribution.Verbosity
+import Distribution.Version
+import qualified System.Info as SysInfo
+import System.Process
+import Turtle hiding (FilePath)
+
+getGitHash :: IO (Maybe String)
+getGitHash =
+  liftM (Just . takeWhile (/='\n')) (readProcess "git" ["rev-parse", "--short", "HEAD"] "")
+  `catch` \(_::SomeException) -> return Nothing
+
+getVersion :: FilePath -> IO Version
+getVersion cabalFile = do
+  pkg <- readPackageDescription silent cabalFile
+  return $ pkgVersion $ package $ packageDescription $ pkg
+
+main :: IO ()
+main = do
+  gitHashMaybe <- getGitHash
+  version <- getVersion "CPL.cabal"
+  let suffix_githash =
+        case gitHashMaybe of
+          Nothing -> ""
+          Just gitHash -> "_" ++ gitHash
+      dir :: IsString a => a
+      dir = fromString $ "CPL-" ++ showVersion version ++ suffix_githash ++ "-" ++ SysInfo.os ++ "-" ++ SysInfo.arch
+
+  let binDir = dir </> "bin"
+      samplesDir = dir </> "samples"
+      zipFile :: IsString a => a
+      zipFile = fromString (dir ++ ".zip")
+  testfile zipFile >>= \b -> when b (rm zipFile)
+  testfile dir >>= \b -> when b (rmtree dir)
+  mktree dir
+  mktree binDir
+  mktree samplesDir
+  cp ("cpl") (binDir </> "cpl")
+  sh $ do
+    fpath <- ls "samples"
+    cp fpath (samplesDir </> filename fpath)
+  cp "COPYING" (dir </> "COPYING")
+  cp "README.markdown" (dir </> "README.markdown")
+  cp "CHANGELOG.markdown" (dir </> "CHANGELOG.markdown")
+  procs "zip" ["-r", zipFile, dir] empty
+  return ()
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -30,7 +30,7 @@
 import System.Environment
 import System.Exit
 import System.IO
-import Control.Monad.Error
+import Control.Monad.Except
 import Control.Monad.State.Strict -- haskeline's MonadException requries strict version
 import System.Console.GetOpt
 #if defined(USE_READLINE_PACKAGE)
@@ -85,7 +85,7 @@
 
 ----------------------------------------------------------------------------
 
-type UI a = ErrorT String (StateT UIState Console) a
+type UI a = ExceptT String (StateT UIState Console) a
 
 readLine :: String -> UI String
 readLine prompt = lift $ lift $ readLine' prompt
@@ -388,7 +388,7 @@
            | ShowVersion `elem` opts -> putStrLn $ showVersion version
          (opts,files,[]) ->
            runConsole $ flip evalStateT initialState $ do
-             ret <- runErrorT $ do
+             ret <- runExceptT $ do
                printLines banner
                mapM_ processOpt opts
                mapM_ cmdLoad files
diff --git a/src/Subst.hs b/src/Subst.hs
--- a/src/Subst.hs
+++ b/src/Subst.hs
@@ -28,7 +28,7 @@
 import FE
 import {-# SOURCE #-} CDT (_eqCDT)
 
-import Control.Monad.Error
+import Control.Monad.Except
 import Data.List (nub, intersect)
 import Data.Maybe (fromMaybe)
 
diff --git a/src/Typing.hs b/src/Typing.hs
--- a/src/Typing.hs
+++ b/src/Typing.hs
@@ -25,7 +25,7 @@
 
 import Data.List (nub)
 import Control.Applicative
-import Control.Monad.Error
+import Control.Monad.Except
 import Control.Monad.RWS
 import qualified Data.Map as Map
 
diff --git a/windows/CPL.wxs b/windows/CPL.wxs
--- a/windows/CPL.wxs
+++ b/windows/CPL.wxs
@@ -17,7 +17,7 @@
                 <Directory Id="INSTALLDIR" Name="CPL">
                     <Directory Id="BINDIR" Name="bin">
                         <Component Id="MainExecutable" Guid="6E979ACB-D17F-4C9D-8BA0-041FD0D5E987">
-                            <File Id="cplEXE" Name="cpl.exe" Source="..\dist\build\cpl\cpl.exe" />
+                            <File Id="cplEXE" Name="cpl.exe" Source="..\cpl.exe" />
                         </Component>
                     </Directory>
                     <Directory Id="SAMPLES" Name="samples">
diff --git a/windows/build_zip.hs b/windows/build_zip.hs
--- a/windows/build_zip.hs
+++ b/windows/build_zip.hs
@@ -42,7 +42,7 @@
   mktree dir
   mktree binDir
   mktree samplesDir
-  cp "../dist/build/cpl/cpl.exe" (binDir </> "cpl.exe")
+  cp ("../cpl.exe") (binDir </> "cpl.exe")
   sh $ do
     fpath <- ls "../samples"
     cp fpath (samplesDir </> filename fpath)
