diff --git a/var/spack/repos/builtin/packages/r/package.py b/var/spack/repos/builtin/packages/r/package.py
index 3fed62d1fa7c3259a5afaea4402e9581b148d318..590c5b2feba84d1834872b2a57a11172b5997b23 100644
--- a/var/spack/repos/builtin/packages/r/package.py
+++ b/var/spack/repos/builtin/packages/r/package.py
@@ -63,7 +63,7 @@ class R(Package):
     depends_on('ncurses')
     depends_on('icu4c')
     depends_on('glib')
-    depends_on('zlib@:1.2.8')
+    depends_on('zlib@1.2.5:')
     depends_on('bzip2')
     depends_on('libtiff')
     depends_on('jpeg')
@@ -82,6 +82,8 @@ class R(Package):
     depends_on('pcre')
     depends_on('jdk')
 
+    patch('zlib.patch', when='@:3.3.1')
+
     @property
     def etcdir(self):
         return join_path(prefix, 'rlib', 'R', 'etc')
diff --git a/var/spack/repos/builtin/packages/r/zlib.patch b/var/spack/repos/builtin/packages/r/zlib.patch
new file mode 100644
index 0000000000000000000000000000000000000000..673d5352fac5fbf2616a6d7016feb1950f0b0128
--- /dev/null
+++ b/var/spack/repos/builtin/packages/r/zlib.patch
@@ -0,0 +1,29 @@
+*** a/configure	2017-01-21 21:48:35.077000000 +0000
+--- b/configure	2017-01-21 21:50:50.700000000 +0000
+***************
+*** 35496,35505 ****
+  #include <string.h>
+  #include <zlib.h>
+  int main() {
+! #ifdef ZLIB_VERSION
+! /* Work around Debian bug: it uses 1.2.3.4 even though there was no such
+!    version on the master site zlib.net */
+!   exit(strncmp(ZLIB_VERSION, "1.2.5", 5) < 0);
+  #else
+    exit(1);
+  #endif
+--- 35496,35509 ----
+  #include <string.h>
+  #include <zlib.h>
+  int main() {
+! /* Checking ZLIB_VERNUM trick learned here:
+!  * https://github.com/TransitApp/protobuf/blob/master/configure.ac#L95
+!  */
+! #ifdef ZLIB_VERNUM
+!   if (ZLIB_VERNUM < 0x1250) {
+!     exit(1);
+!   }
+!   exit(0);
+  #else
+    exit(1);
+  #endif