diff --git a/nixos/modules/hardware/video/nvidia.nix b/nixos/modules/hardware/video/nvidia.nix
index 325aa5f093f8..2b20dc7395af 100644
--- a/nixos/modules/hardware/video/nvidia.nix
+++ b/nixos/modules/hardware/video/nvidia.nix
@@ -11,20 +11,21 @@ let
   # FIXME: should introduce an option like
   # ‘hardware.video.nvidia.package’ for overriding the default NVIDIA
   # driver.
-  enabled = elem "nvidia" drivers || elem "nvidiaLegacy173" drivers
-    || elem "nvidiaLegacy304" drivers || elem "nvidiaLegacy340" drivers;
-
-  nvidia_x11 =
+  nvidiaForKernel = kernelPackages:
     if elem "nvidia" drivers then
-      config.boot.kernelPackages.nvidia_x11
+      kernelPackages.nvidia_x11
     else if elem "nvidiaLegacy173" drivers then
-      config.boot.kernelPackages.nvidia_x11_legacy173
+      kernelPackages.nvidia_x11_legacy173
     else if elem "nvidiaLegacy304" drivers then
-      config.boot.kernelPackages.nvidia_x11_legacy304
+      kernelPackages.nvidia_x11_legacy304
     else if elem "nvidiaLegacy340" drivers then
-      config.boot.kernelPackages.nvidia_x11_legacy340
-    else throw "impossible";
+      kernelPackages.nvidia_x11_legacy340
+    else null;
 
+  nvidia_x11 = nvidiaForKernel config.boot.kernelPackages;
+  nvidia_libs32 = (nvidiaForKernel pkgs_i686.linuxPackages).override { libsOnly = true; kernel = null; };
+
+  enabled = nvidia_x11 != null;
 in
 
 {
@@ -40,7 +41,7 @@ in
       '';
 
     hardware.opengl.package = nvidia_x11;
-    hardware.opengl.package32 = pkgs_i686.linuxPackages.nvidia_x11.override { libsOnly = true; kernel = null; };
+    hardware.opengl.package32 = nvidia_libs32;
 
     environment.systemPackages = [ nvidia_x11 ];