diff --git a/ci/broken-packages.sh b/ci/config.sh
similarity index 55%
rename from ci/broken-packages.sh
rename to ci/config.sh
index cc9c9d389a7b6cb862e13322d34ede7a1da1afa3..0b808cc097281910b6176c0e63ad7f7669149a46 100644
--- a/ci/broken-packages.sh
+++ b/ci/config.sh
@@ -13,7 +13,25 @@ function broken() {
   pkg_name="$1"
   ticket="$2"
   echo "Marking $pkg_name as broken due to #$ticket"
-  BROKEN_ARGS="$BROKEN_ARGS --expect-broken=$pkg_name"
+  EXTRA_OPTS="$EXTRA_OPTS --expect-broken=$pkg_name"
+}
+
+# Return the version number of the most recent release of the given package
+function latest_version() {
+  pkg=$1
+  curl -s -H "Accept: application/json" -L -X GET http://hackage.haskell.org/package/$pkg/preferred | jq '.["normal-version"] | .[0]' -r
+}
+
+# Add a package to the set of packages that lack patches but are nevertheless
+# tested.
+function extra_package() {
+  pkg_name="$1"
+  version="$2"
+  if [ -z "$version" ]; then
+    version=$(latest_version $pkg_name)
+  fi
+  echo "Adding $pkg_name-$version to extra package set"
+  EXTRA_OPTS="$EXTRA_OPTS --extra-package=$pkg_name==$version"
 }
 
 if [ -z "$GHC" ]; then GHC=ghc; fi
@@ -48,3 +66,13 @@ case $version in
     echo "No broken packages for GHC $version"
     ;;
 esac
+
+# Extra packages
+extra_package lens
+extra_package aeson
+extra_package criterion
+extra_package scotty
+extra_package generic-lens
+extra_package microstache
+extra_package singletons
+extra_package servant
diff --git a/ci/default.nix b/ci/default.nix
index 501c4cebc338ec0b9b1f636a0a026ca1f1bb10b6..2cd1e6876380266b5c11338d17d2c852dfa044c0 100644
--- a/ci/default.nix
+++ b/ci/default.nix
@@ -50,7 +50,7 @@ let
       deps = [
         bash curl gnutar findutils patch rsync openssl
         cabal-install ghc gcc binutils-unwrapped pwgen gnused
-        hackage-repo-tool overlay-tool python3
+        hackage-repo-tool overlay-tool python3 jq
         git # cabal-install wants this to fetch source-repository-packages
       ];
     in
@@ -68,7 +68,7 @@ let
         makeWrapper ${../run-ci} $out/bin/run-ci \
             --prefix PATH : ${stdenv.lib.makeBinPath deps}:$out/bin \
             --set USE_NIX 1 \
-            --set BROKEN_LIST ${./broken-packages.sh}
+            --set CI_CONFIG ${./config.sh}
 
         makeWrapper ${xz}/bin/xz $out/bin/xz
       '';
diff --git a/run-ci b/run-ci
index 71e6aba46ba92754b6def86439fb81288e2681d8..0a02add9dd3ba42beb12636591dfa30c1dbab255 100755
--- a/run-ci
+++ b/run-ci
@@ -9,15 +9,16 @@ if [ -z "$GHC" ]; then
   GHC="ghc"
 fi
 
-if [ -z "$BROKEN_LIST" ]; then
-  BROKEN_LIST=broken-packages.sh
+if [ -z "$CI_CONFIG" ]; then
+  CI_CONFIG=config.sh
 fi
 
-if [ -f "$BROKEN_LIST" ]; then
-  source $BROKEN_LIST
-  EXTRA_OPTS="$EXTRA_OPTS $BROKEN_ARGS"
+EXTRA_OPTS="$@"
+
+if [ -f "$CI_CONFIG" ]; then
+  source $CI_CONFIG
 else
-  echo "Couldn't find broken package list"
+  echo "Couldn't find CI configuration"
 fi
 
 EXTRA_OPTS="$EXTRA_OPTS --cabal-option=-j$CPUS" # Use cabal's build parallelism