diff --git a/shell.nix b/shell.nix
index ce1add060d9a466a6c5fb93d137dd7c1db2cdf14..fe76c1e7878628cff2a5a1fcdd8d027b2c817a7a 100644
--- a/shell.nix
+++ b/shell.nix
@@ -3,8 +3,17 @@ let
 in
 { pkgs ? release2105 }:
 pkgs.mkShell {
+  # When a path (such as `pkgs.path`) is interpolated into a string then nix
+  # first adds that path to the store, and then interpolates the store path
+  # into the string.  We use `builtins.toString` to convert the path to a
+  # string without copying it to the store before interpolating. Either the
+  # path is already in the store (e.g. when `pkgs` is `release2105`) so we
+  # avoid making a second copy with a longer name, or the user passed in local
+  # path (e.g. a checkout of nixpkgs) and we point at it directly, rather than
+  # a snapshot of it.
+  # See https://github.com/NixOS/nix/issues/200 and https://github.com/NixOS/nix/issues/1728
   shellHook = ''
-    export NIX_PATH="nixpkgs=${pkgs.path}";
+    export NIX_PATH="nixpkgs=${builtins.toString pkgs.path}";
   '';
   buildInputs = [
     pkgs.morph