diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunction.java
index c157533..b6b91f5 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunction.java
@@ -182,7 +182,7 @@
         }
 
         // Metadata field must be present. It can only be absent when stripped by tests.
-        String metadata = Integer.toHexString(f.getMetadata().get().hashCode());
+        String metadata = Integer.toHexString(f.getMetadata().hashCode());
         maybeStoreSymlink(linkName, targetName, metadata, t.getDestPath(), outputSymlinks);
       }
     }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalValue.java
index 269b554..9664fe7 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalValue.java
@@ -243,34 +243,33 @@
   }
 
   private static final class RegularFile implements ResolvedFile {
-    private final FileType type;
-    private final Optional<RootedPath> path;
-    private final Optional<FileStateValue> metadata;
+    private final RootedPath path;
+    @Nullable private final FileStateValue metadata;
 
+    /** C'tor for {@link #stripMetadataForTesting()}. */
     private RegularFile(RootedPath path) {
-      this.type = FileType.FILE;
-      this.path = Optional.of(path);
-      this.metadata = Optional.<FileStateValue>absent();
+      this.path = Preconditions.checkNotNull(path);
+      this.metadata = null;
     }
 
     RegularFile(RootedPath path, FileStateValue metadata) {
-      this.type = FileType.FILE;
-      this.path = Optional.of(path);
-      this.metadata = Optional.of(metadata);
+      this.path = Preconditions.checkNotNull(path);
+      this.metadata = Preconditions.checkNotNull(metadata);
     }
 
     @Override
     public FileType getType() {
-      return type;
+      return FileType.FILE;
     }
 
     @Override
-    public Optional<RootedPath> getPath() {
+    public RootedPath getPath() {
       return path;
     }
 
     @Override
-    public Optional<FileStateValue> getMetadata() {
+    @Nullable
+    public FileStateValue getMetadata() {
       return metadata;
     }
 
@@ -282,14 +281,13 @@
       if (!(obj instanceof RegularFile)) {
         return false;
       }
-      return this.type.equals(((RegularFile) obj).type)
-          && this.path.equals(((RegularFile) obj).path)
-          && this.metadata.equals(((RegularFile) obj).metadata);
+      return this.path.equals(((RegularFile) obj).path)
+          && Objects.equal(this.metadata, ((RegularFile) obj).metadata);
     }
 
     @Override
     public int hashCode() {
-      return Objects.hashCode(type, path, metadata);
+      return Objects.hashCode(path, metadata);
     }
 
     @Override
@@ -299,42 +297,40 @@
 
     @Override
     public ResolvedFile stripMetadataForTesting() {
-      return new RegularFile(path.get());
+      return new RegularFile(path);
     }
 
     @Override
     public PathFragment getNameInSymlinkTree() {
-      return path.get().getRelativePath();
+      return path.getRelativePath();
     }
 
     @Override
     public PathFragment getTargetInSymlinkTree(boolean followSymlinks) {
-      return path.get().asPath().asFragment();
+      return path.asPath().asFragment();
     }
   }
 
   private static final class Directory implements ResolvedFile {
-    private final FileType type;
-    private final Optional<RootedPath> path;
+    private final RootedPath path;
 
     Directory(RootedPath path) {
-      this.type = FileType.DIRECTORY;
-      this.path = Optional.of(path);
+      this.path = Preconditions.checkNotNull(path);
     }
 
     @Override
     public FileType getType() {
-      return type;
+      return FileType.DIRECTORY;
     }
 
     @Override
-    public Optional<RootedPath> getPath() {
+    public RootedPath getPath() {
       return path;
     }
 
     @Override
-    public Optional<FileStateValue> getMetadata() {
-      return Optional.<FileStateValue>of(FileStateValue.DIRECTORY_FILE_STATE_NODE);
+    public FileStateValue getMetadata() {
+      return FileStateValue.DIRECTORY_FILE_STATE_NODE;
     }
 
     @Override
@@ -345,13 +341,12 @@
       if (!(obj instanceof Directory)) {
         return false;
       }
-      return this.type.equals(((Directory) obj).type)
-          && this.path.equals(((Directory) obj).path);
+      return this.path.equals(((Directory) obj).path);
     }
 
     @Override
     public int hashCode() {
-      return Objects.hashCode(type, path);
+      return path.hashCode();
     }
 
     @Override
@@ -366,45 +361,45 @@
 
     @Override
     public PathFragment getNameInSymlinkTree() {
-      return path.get().getRelativePath();
+      return path.getRelativePath();
     }
 
     @Override
     public PathFragment getTargetInSymlinkTree(boolean followSymlinks) {
-      return path.get().asPath().asFragment();
+      return path.asPath().asFragment();
     }
   }
 
   private static final class DanglingSymlink implements ResolvedFile {
-    private final FileType type;
     private final Symlink symlink;
-    private final Optional<FileStateValue> metadata;
+    @Nullable private final FileStateValue metadata;
 
+    /** C'tor for {@link #stripMetadataForTesting()}. */
     private DanglingSymlink(Symlink symlink) {
-      this.type = FileType.DANGLING_SYMLINK;
       this.symlink = symlink;
-      this.metadata = Optional.absent();
+      this.metadata = null;
     }
 
     DanglingSymlink(RootedPath linkNamePath, PathFragment linkTargetPath,
         FileStateValue metadata) {
-      this.type = FileType.DANGLING_SYMLINK;
       this.symlink = new Symlink(linkNamePath, linkTargetPath);
-      this.metadata = Optional.of(metadata);
+      this.metadata = Preconditions.checkNotNull(metadata);
     }
 
     @Override
     public FileType getType() {
-      return type;
+      return FileType.DANGLING_SYMLINK;
     }
 
     @Override
-    public Optional<RootedPath> getPath() {
-      return Optional.absent();
+    @Nullable
+    public RootedPath getPath() {
+      return null;
     }
 
     @Override
-    public Optional<FileStateValue> getMetadata() {
+    @Nullable
+    public FileStateValue getMetadata() {
       return metadata;
     }
 
@@ -416,14 +411,13 @@
       if (!(obj instanceof DanglingSymlink)) {
         return false;
       }
-      return this.type.equals(((DanglingSymlink) obj).type)
-          && this.metadata.equals(((DanglingSymlink) obj).metadata)
+      return Objects.equal(this.metadata, ((DanglingSymlink) obj).metadata)
           && this.symlink.equals(((DanglingSymlink) obj).symlink);
     }
 
     @Override
     public int hashCode() {
-      return Objects.hashCode(type, metadata, symlink);
+      return Objects.hashCode(metadata, symlink);
     }
 
     @Override
@@ -454,39 +448,37 @@
   }
 
   private static final class SymlinkToFile implements ResolvedFile {
-    private final FileType type;
-    private final Optional<RootedPath> path;
-    private final Optional<FileStateValue> metadata;
-
+    private final RootedPath path;
+    @Nullable private final FileStateValue metadata;
     private final Symlink symlink;
 
+    /** C'tor for {@link #stripMetadataForTesting()}. */
     private SymlinkToFile(RootedPath targetPath, Symlink symlink) {
-      this.type = FileType.SYMLINK_TO_FILE;
-      this.path = Optional.of(targetPath);
-      this.metadata = Optional.<FileStateValue>absent();
-      this.symlink = symlink;
+      this.path = Preconditions.checkNotNull(targetPath);
+      this.metadata = null;
+      this.symlink = Preconditions.checkNotNull(symlink);
     }
 
     SymlinkToFile(RootedPath targetPath, RootedPath linkNamePath,
         PathFragment linkTargetPath, FileStateValue metadata) {
-      this.type = FileType.SYMLINK_TO_FILE;
-      this.path = Optional.of(targetPath);
-      this.metadata = Optional.of(metadata);
+      this.path = Preconditions.checkNotNull(targetPath);
+      this.metadata = Preconditions.checkNotNull(metadata);
       this.symlink = new Symlink(linkNamePath, linkTargetPath);
     }
 
     @Override
     public FileType getType() {
-      return type;
+      return FileType.SYMLINK_TO_FILE;
     }
 
     @Override
-    public Optional<RootedPath> getPath() {
+    public RootedPath getPath() {
       return path;
     }
 
     @Override
-    public Optional<FileStateValue> getMetadata() {
+    @Nullable
+    public FileStateValue getMetadata() {
       return metadata;
     }
 
@@ -498,15 +490,14 @@
       if (!(obj instanceof SymlinkToFile)) {
         return false;
       }
-      return this.type.equals(((SymlinkToFile) obj).type)
-          && this.path.equals(((SymlinkToFile) obj).path)
-          && this.metadata.equals(((SymlinkToFile) obj).metadata)
+      return this.path.equals(((SymlinkToFile) obj).path)
+          && Objects.equal(this.metadata, ((SymlinkToFile) obj).metadata)
           && this.symlink.equals(((SymlinkToFile) obj).symlink);
     }
 
     @Override
     public int hashCode() {
-      return Objects.hashCode(type, path, metadata, symlink);
+      return Objects.hashCode(path, metadata, symlink);
     }
 
     @Override
@@ -516,7 +507,7 @@
 
     @Override
     public ResolvedFile stripMetadataForTesting() {
-      return new SymlinkToFile(path.get(), symlink);
+      return new SymlinkToFile(path, symlink);
     }
 
     @Override
@@ -526,43 +517,42 @@
 
     @Override
     public PathFragment getTargetInSymlinkTree(boolean followSymlinks) {
-      return followSymlinks ? path.get().asPath().asFragment() : symlink.unresolvedLinkTarget;
+      return followSymlinks ? path.asPath().asFragment() : symlink.unresolvedLinkTarget;
     }
   }
 
   private static final class SymlinkToDirectory implements ResolvedFile {
-    private final FileType type;
-    private final Optional<RootedPath> path;
-    private final Optional<FileStateValue> metadata;
+    private final RootedPath path;
+    @Nullable private final FileStateValue metadata;
     private final Symlink symlink;
 
+    /** C'tor for {@link #stripMetadataForTesting()}. */
     private SymlinkToDirectory(RootedPath targetPath, Symlink symlink) {
-      this.type = FileType.SYMLINK_TO_DIRECTORY;
-      this.path = Optional.of(targetPath);
-      this.metadata = Optional.<FileStateValue>absent();
+      this.path = Preconditions.checkNotNull(targetPath);
+      this.metadata = null;
       this.symlink = symlink;
     }
 
     SymlinkToDirectory(RootedPath targetPath, RootedPath linkNamePath,
         PathFragment linkValue, FileStateValue metadata) {
-      this.type = FileType.SYMLINK_TO_DIRECTORY;
-      this.path = Optional.of(targetPath);
-      this.metadata = Optional.of(metadata);
+      this.path = Preconditions.checkNotNull(targetPath);
+      this.metadata = Preconditions.checkNotNull(metadata);
       this.symlink = new Symlink(linkNamePath, linkValue);
     }
 
     @Override
     public FileType getType() {
-      return type;
+      return FileType.SYMLINK_TO_DIRECTORY;
     }
 
     @Override
-    public Optional<RootedPath> getPath() {
+    public RootedPath getPath() {
       return path;
     }
 
     @Override
-    public Optional<FileStateValue> getMetadata() {
+    @Nullable
+    public FileStateValue getMetadata() {
       return metadata;
     }
 
@@ -574,15 +564,14 @@
       if (!(obj instanceof SymlinkToDirectory)) {
         return false;
       }
-      return this.type.equals(((SymlinkToDirectory) obj).type)
-          && this.path.equals(((SymlinkToDirectory) obj).path)
-          && this.metadata.equals(((SymlinkToDirectory) obj).metadata)
+      return this.path.equals(((SymlinkToDirectory) obj).path)
+          && Objects.equal(this.metadata, ((SymlinkToDirectory) obj).metadata)
           && this.symlink.equals(((SymlinkToDirectory) obj).symlink);
     }
 
     @Override
     public int hashCode() {
-      return Objects.hashCode(type, path, metadata, symlink);
+      return Objects.hashCode(path, metadata, symlink);
     }
 
     @Override
@@ -592,7 +581,7 @@
 
     @Override
     public ResolvedFile stripMetadataForTesting() {
-      return new SymlinkToDirectory(path.get(), symlink);
+      return new SymlinkToDirectory(path, symlink);
     }
 
     @Override
@@ -602,7 +591,7 @@
 
     @Override
     public PathFragment getTargetInSymlinkTree(boolean followSymlinks) {
-      return followSymlinks ? path.get().asPath().asFragment() : symlink.unresolvedLinkTarget;
+      return followSymlinks ? path.asPath().asFragment() : symlink.unresolvedLinkTarget;
     }
   }
 
@@ -646,9 +635,10 @@
     /**
      * Path of the file, directory or resolved target of the symlink.
      *
-     * <p>May only be absent for dangling symlinks.
+     * <p>May only return null for dangling symlinks.
      */
-    Optional<RootedPath> getPath();
+    @Nullable
+    RootedPath getPath();
 
     /**
      * Associated metadata.
@@ -657,9 +647,10 @@
      * stat() of the file, but otherwise it is likely not something the consumer of the
      * {@link ResolvedFile} is directly interested in.
      *
-     * <p>May only be absent if stripped for tests.
+     * <p>May only return null if metadata is stripped for tests.
      */
-    Optional<FileStateValue> getMetadata();
+    @Nullable
+    FileStateValue getMetadata();
 
     /**
      * Returns the path of the Fileset-output symlink relative to the output directory.
