diff --git a/.travis.yml b/.travis.yml
index f75bbfa82d0dc9a23bce691ad8b99da4fffab186..95f89ee003f10fb23f7a3606d2d1c4fc17d597b4 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,9 +2,9 @@ language: c                             # make the validator happy
 sudo: false
 matrix:
   include:
-  # CABALVER=1.16 is the earliest available in the PPA
-  - env: STACK="stack --resolver lts-5"
+  - env: STACK_RESOLVER=lts-5.18
     os: osx
+  # CABALVER=1.16 is the earliest available in the PPA
   - env: GHCVER=7.4.2 CABALVER=1.16
       PREBUILD="sed -i.bak /utimensat/d configure.ac"
     addons:
diff --git a/appveyor.yml b/appveyor.yml
index 4fe35170f50f14f9cf0d0fcfdf968dd80b353895..c4bdd2385cf27185c6b90712c434d4c776c3447b 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -7,18 +7,20 @@ environment:
     # use a short path prefix to avoid running into path-length limitations
     STACK_ROOT: C:\sr
   matrix:
-  - DEPS: Win32-2.6.0.0
-    STACK: stack --skip-msys --resolver lts-9
-  - DEPS: Win32-2.4.0.0
-    STACK: stack --skip-msys --resolver lts-7
-  - DEPS: # Win32-2.3.1.0
-    STACK: stack --skip-msys --resolver lts-5
-  - DEPS: Win32-2.3.0.1
-    STACK: stack --skip-msys --resolver lts-2
+  - STACK_FLAGS: --skip-msys
+    STACK_RESOLVER: lts-9.6
+    STACK_EXTRA_DEPS: Win32-2.6.0.0
+  - STACK_FLAGS: --skip-msys
+    STACK_RESOLVER: lts-7.24
+    STACK_EXTRA_DEPS: Win32-2.4.0.0
+  - STACK_FLAGS: --skip-msys
+    STACK_RESOLVER: lts-5.18
+    # STACK_EXTRA_DEPS: Win32-2.3.1.0
+  - STACK_FLAGS: --skip-msys
+    STACK_RESOLVER: lts-2.22
+    STACK_EXTRA_DEPS: Win32-2.3.0.1
     PREBUILD: sed -i.bak -e /CreateSymbolicLinkW/d
                          -e /GetFinalPathNameByHandleW/d configure.ac
-cache:
-- "%STACK_ROOT%"
 install:
 - set PATH=%CD%\_stack;C:\msys64\usr\bin;%PATH%
 - sh tools/testscript prepare
diff --git a/tools/testscript b/tools/testscript
index 5161bbdbc83ea27cfd9cfdb9a20ab6ca04f32d6f..ea2c8399c2d009eff8c0868a8b0f9c19e1848f74 100755
--- a/tools/testscript
+++ b/tools/testscript
@@ -4,29 +4,32 @@ set -eu
 ghcflags="-rtsopts -threaded -Werror"
 testflags="CreateDirectoryIfMissing001.num-repeats=100000 +RTS -N2"
 
-before_build() {
-    # workaround for https://github.com/haskell/cabal/issues/2375
-    if grep "^resolver: lts-2" stack.yaml >/dev/null 2>&1; then
-        sed -i.bak 's/WithHooks autoconfUserHooks//' Setup.hs
-        stack exec sh ./configure
-    fi
-}
-
 prepare() {
     eval "${PREBUILD-}"
-    if [ "${STACK+x}" ]; then
-
-        stack="$STACK --no-terminal"
-        mkdir -p _stack
+    if [ -f configure.ac ]; then
+        autoreconf -i
+    fi
+    if [ "${STACK_RESOLVER+x}" ]; then
 
         # workaround for commercialhaskell/stack#3213:
         # use official GHC tarball instead of stack's patched tarball
-        if [ "${LOCALAPPDATA-}" ] && printf "%s\n" "$STACK" | grep '\<lts-2\>'; then
-            dir=`cygpath -u "$LOCALAPPDATA"`/Programs/stack/x86_64-windows
-            mkdir -p "$dir"
-            curl -L "https://downloads.haskell.org/~ghc/7.8.4/ghc-7.8.4-x86_64-unknown-mingw32.tar.xz" | tar -C "$dir" -xJ
-            echo installed >"$dir/ghc-7.8.4.installed"
-        fi
+        case $STACK_RESOLVER in
+            lts-2*)
+                if [ "${LOCALAPPDATA-}" ]; then
+                    dir=`cygpath -u "$LOCALAPPDATA"`/Programs/stack/x86_64-windows
+                    mkdir -p "$dir"
+                    curl -L "https://downloads.haskell.org/~ghc/7.8.4/ghc-7.8.4-x86_64-unknown-mingw32.tar.xz" | tar -C "$dir" -xJ
+                    echo installed >"$dir/ghc-7.8.4.installed"
+                fi;;
+        esac
+
+        cat >stack.yaml <<EOF
+resolver: $STACK_RESOLVER
+packages: [.]
+extra-deps: [${STACK_EXTRA_DEPS-}]
+EOF
+        stack="stack --no-terminal ${STACK_FLAGS-}"
+        mkdir -p _stack
 
         (
             cd _stack
@@ -56,12 +59,6 @@ prepare() {
         tools/retry $stack setup >/dev/null
         $stack ghc -- --version
         $stack --version
-        for dep in ${DEPS-}; do
-            url=https://hackage.haskell.org/package/${dep}/${dep}.tar.gz
-            curl --retry 3 -fsLS "$url" | tar xzf -
-        done
-        $stack init && :
-        $stack test --install-ghc --only-dependencies
         $stack list-dependencies
 
     else
@@ -72,16 +69,21 @@ prepare() {
         cabal install --enable-tests --only-dependencies
 
     fi
-    if [ -f configure.ac ]; then
-        autoreconf -i
-    fi
 }
 
 build() {
-    before_build
-    if [ "${STACK+x}" ]; then
-
-        stack="$STACK --no-terminal"
+    if [ "${STACK_RESOLVER+x}" ]; then
+
+        # workaround for https://github.com/haskell/cabal/issues/2375
+        case $STACK_RESOLVER in
+            lts-2*)
+                if [ -f configure ]; then
+                    sed -i.bak 's/WithHooks autoconfUserHooks//' Setup.hs
+                    stack exec sh ./configure
+                fi;;
+        esac
+
+        stack="stack --no-terminal ${STACK_FLAGS-}"
         $stack test --haddock --no-haddock-deps \
             --ghc-options "$ghcflags" \
             --test-arguments "$testflags"