diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+2.7.0.11
+--------
+* Linux: Try to load versioned GLUT library, too, because the unversioned one is often in *-dev packages only.
+
 2.7.0.10
 --------
 * Mac OS X: Search public frameworks first, then system frameworks.
diff --git a/GLUT.cabal b/GLUT.cabal
--- a/GLUT.cabal
+++ b/GLUT.cabal
@@ -1,5 +1,5 @@
 name: GLUT
-version: 2.7.0.10
+version: 2.7.0.11
 synopsis: A binding for the OpenGL Utility Toolkit
 description:
   A Haskell binding for the OpenGL Utility Toolkit, a window system independent
@@ -22,7 +22,7 @@
   GHC == 7.6.3
   GHC == 7.8.4
   GHC == 7.10.3
-  GHC == 8.0.1
+  GHC == 8.0.2
   GHC == 8.1
 cabal-version: >= 1.10
 extra-source-files:
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,1 +1,4 @@
-[![Hackage](https://img.shields.io/hackage/v/GLUT.svg)](https://hackage.haskell.org/package/GLUT) [![Build Status](https://travis-ci.org/haskell-opengl/GLUT.png)](https://travis-ci.org/haskell-opengl/GLUT)
+[![Hackage](https://img.shields.io/hackage/v/GLUT.svg)](https://hackage.haskell.org/package/GLUT)
+[![Stackage LTS](https://www.stackage.org/package/GLUT/badge/lts)](https://www.stackage.org/lts/package/GLUT)
+[![Stackage nightly](https://www.stackage.org/package/GLUT/badge/nightly)](https://www.stackage.org/nightly/package/GLUT)
+[![Build Status](https://img.shields.io/travis/haskell-opengl/GLUT/master.svg)](https://travis-ci.org/haskell-opengl/GLUT)
diff --git a/cbits/HsGLUT.c b/cbits/HsGLUT.c
--- a/cbits/HsGLUT.c
+++ b/cbits/HsGLUT.c
@@ -15,6 +15,16 @@
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 
+static LPCTSTR libNames[] = {
+  /* Try to load freeglut first, it has a few extra features compared to classic
+     GLUT. */
+  TEXT("freeglut"),
+  /* The MinGW-w64 version of freeglut prefixes "lib" onto the DLL name. */
+  TEXT("libfreeglut"),
+  /* If no freeglut version is found, try plain old glut32 instead. */
+  TEXT("glut32")
+};
+
 void*
 hs_GLUT_getProcAddress(const char *name)
 {
@@ -22,20 +32,10 @@
   static HMODULE handle = NULL;
 
   if (firstTime) {
+    int i, numNames = (int)(sizeof(libNames) / sizeof(libNames[0]));
     firstTime = 0;
-
-    /* Try to load freeglut first, it has a few extra features compared to
-       classic GLUT. */
-    handle = LoadLibrary(TEXT("freeglut"));
-
-    /* The MinGW-w64 version of freeglut prefixes "lib" onto the DLL name. */
-    if (!handle) {
-      handle = LoadLibrary(TEXT("libfreeglut"));
-    }
-
-    /* If no freeglut version is found, try plain old glut32 instead. */
-    if (!handle) {
-      handle = LoadLibrary(TEXT("glut32"));
+    for (i = 0;   (!handle) && (i < numNames);   ++i) {
+      handle = LoadLibrary(libNames[i]);
     }
   }
 
@@ -48,6 +48,17 @@
 #include <stdlib.h>
 #include <dlfcn.h>
 
+static const char* libNames[] = {
+#ifdef __APPLE__
+  /* Try public framework path first. */
+  "/Library/Frameworks/GLUT.framework/GLUT",
+  /* If the public path failed, try the system framework path. */
+  "/System/Library/Frameworks/GLUT.framework/GLUT"
+#else
+  "libglut.so", "libglut.so.3"
+#endif
+};
+
 void*
 hs_GLUT_getProcAddress(const char *name)
 {
@@ -55,19 +66,11 @@
   static void *handle = NULL;
 
   if (firstTime) {
+    int i, numNames = (int)(sizeof(libNames) / sizeof(libNames[0]));
     firstTime = 0;
-
-#ifdef __APPLE__
-    /* Try public framework path first. */
-    handle = dlopen("/Library/Frameworks/GLUT.framework/GLUT", RTLD_LAZY | RTLD_GLOBAL);
-
-    /* If the public path failed, try the system framework path. */
-    if (!handle) {
-      handle = dlopen("/System/Library/Frameworks/GLUT.framework/GLUT", RTLD_LAZY | RTLD_GLOBAL);
+    for (i = 0;   (!handle) && (i < numNames);   ++i) {
+      handle = dlopen(libNames[i], RTLD_LAZY | RTLD_GLOBAL);
     }
-#else
-    handle = dlopen("libglut.so", RTLD_LAZY | RTLD_GLOBAL);
-#endif
   }
 
   return handle ? dlsym(handle, name) : NULL;
