diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
index 210c68b..76f0bc0 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
@@ -42,7 +42,7 @@
 import com.google.devtools.build.lib.syntax.FuncallExpression;
 import com.google.devtools.build.lib.syntax.FunctionSignature;
 import com.google.devtools.build.lib.syntax.GlobList;
-import com.google.devtools.build.lib.syntax.Ident;
+import com.google.devtools.build.lib.syntax.Identifier;
 import com.google.devtools.build.lib.syntax.Label;
 import com.google.devtools.build.lib.syntax.ParserInputSource;
 import com.google.devtools.build.lib.syntax.SkylarkEnvironment;
@@ -1340,10 +1340,10 @@
     for (Statement stmt : ast.getStatements()) {
       if (stmt instanceof AssignmentStatement) {
         Expression lvalue = ((AssignmentStatement) stmt).getLValue().getExpression();
-        if (!(lvalue instanceof Ident)) {
+        if (!(lvalue instanceof Identifier)) {
           continue;
         }
-        String target = ((Ident) lvalue).getName();
+        String target = ((Identifier) lvalue).getName();
         if (pkgEnv.lookup(target, null) != null) {
           eventHandler.handle(Event.error(stmt.getLocation(), "Reassignment of builtin build "
               + "function '" + target + "' not permitted"));
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java
index e5b06a9..bb0e8ed 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java
@@ -27,9 +27,9 @@
 
   private final Expression obj;
 
-  private final Ident field;
+  private final Identifier field;
 
-  public DotExpression(Expression obj, Ident field) {
+  public DotExpression(Expression obj, Identifier field) {
     this.obj = obj;
     this.field = field;
   }
@@ -38,7 +38,7 @@
     return obj;
   }
 
-  public Ident getField() {
+  public Identifier getField() {
     return field;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
index 21df356..a448325 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
@@ -169,7 +169,7 @@
 
   private final Expression obj;
 
-  private final Ident func;
+  private final Identifier func;
 
   private final List<Argument.Passed> args;
 
@@ -182,7 +182,7 @@
    * arbitrary expressions. In any case, the "func" expression is always
    * evaluated, so functions and variables share a common namespace.
    */
-  public FuncallExpression(Expression obj, Ident func,
+  public FuncallExpression(Expression obj, Identifier func,
                            List<Argument.Passed> args) {
     this.obj = obj;
     this.func = func;
@@ -197,7 +197,7 @@
    * arbitrary expressions. In any case, the "func" expression is always
    * evaluated, so functions and variables share a common namespace.
    */
-  public FuncallExpression(Ident func, List<Argument.Passed> args) {
+  public FuncallExpression(Identifier func, List<Argument.Passed> args) {
     this(null, func, args);
   }
 
@@ -217,7 +217,7 @@
   /**
    * Returns the function expression.
    */
-  public Ident getFunction() {
+  public Identifier getFunction() {
     return func;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java
index dce9e9c..f9e26ed 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java
@@ -24,11 +24,11 @@
  */
 public class FunctionDefStatement extends Statement {
 
-  private final Ident ident;
+  private final Identifier ident;
   private final FunctionSignature.WithValues<Expression, Expression> args;
   private final ImmutableList<Statement> statements;
 
-  public FunctionDefStatement(Ident ident,
+  public FunctionDefStatement(Identifier ident,
       FunctionSignature.WithValues<Expression, Expression> args,
       Collection<Statement> statements) {
     this.ident = ident;
@@ -59,7 +59,7 @@
     return "def " + ident + "(" + args + "):\n";
   }
 
-  public Ident getIdent() {
+  public Identifier getIdent() {
     return ident;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Ident.java b/src/main/java/com/google/devtools/build/lib/syntax/Identifier.java
similarity index 61%
rename from src/main/java/com/google/devtools/build/lib/syntax/Ident.java
rename to src/main/java/com/google/devtools/build/lib/syntax/Identifier.java
index 9bc58b1..26c5f15 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Ident.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Identifier.java
@@ -14,30 +14,36 @@
 
 package com.google.devtools.build.lib.syntax;
 
+import javax.annotation.Nullable;
+
 // TODO(bazel-team): for extra performance:
 // (1) intern the strings, so we can use == to compare, and have .equals use the assumption.
-// Then have Argument and Parameter use Ident again instead of String as keys.
-// (2) Use Ident, not String, as keys in the Environment, which will be cleaner.
+// Then have Argument and Parameter use Identifier again instead of String as keys.
+// (2) Use Identifier, not String, as keys in the Environment, which will be cleaner.
 // (3) For performance, avoid doing HashMap lookups at runtime, and compile local variable access
 // into array reference with a constant index. Variable lookups are currently a speed bottleneck,
 // as previously measured in an experiment.
 /**
  *  Syntax node for an identifier.
  */
-public final class Ident extends Expression {
+public final class Identifier extends Expression {
 
   private final String name;
 
-  public Ident(String name) {
+  public Identifier(String name) {
     this.name = name;
   }
 
   /**
-   *  Returns the name of the Ident.
+   *  Returns the name of the Identifier.
    */
   public String getName() {
     return name;
   }
+  
+  public boolean isPrivate() {
+    return name.startsWith("_");
+  }
 
   @Override
   public String toString() {
@@ -49,15 +55,25 @@
     try {
       return env.lookup(name);
     } catch (Environment.NoSuchVariableException e) {
-      if (name.equals("$error$")) {
-        throw new EvalException(getLocation(), "contains syntax error(s)", true);
-      } else {
-        throw new EvalException(getLocation(), "name '" + name + "' is not defined");
-      }
+      throw createInvalidIdentifierException();
     }
   }
 
   @Override
+  public boolean equals(@Nullable Object object) {
+    if (object instanceof Identifier) {
+      Identifier that = (Identifier) object;
+      return this.name.equals(that.name);
+    }
+    return false;
+  }
+  
+  @Override
+  public int hashCode() {
+    return name.hashCode();
+  }
+
+  @Override
   public void accept(SyntaxTreeVisitor visitor) {
     visitor.visit(this);
   }
@@ -65,11 +81,13 @@
   @Override
   void validate(ValidationEnvironment env) throws EvalException {
     if (!env.hasSymbolInEnvironment(name)) {
-      if (name.equals("$error$")) {
-        throw new EvalException(getLocation(), "contains syntax error(s)", true);
-      } else {
-        throw new EvalException(getLocation(), "name '" + name + "' is not defined");
-      }
+      throw createInvalidIdentifierException();
     }
   }
+
+  private EvalException createInvalidIdentifierException() {
+    return name.equals("$error$")
+        ? new EvalException(getLocation(), "contains syntax error(s)", true)
+        : new EvalException(getLocation(), "name '" + name + "' is not defined");
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/LValue.java b/src/main/java/com/google/devtools/build/lib/syntax/LValue.java
index 2e9bf26..095a803 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/LValue.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/LValue.java
@@ -49,8 +49,8 @@
 
   private static void assign(Environment env, Location loc, Expression lvalue, Object result)
       throws EvalException, InterruptedException {
-    if (lvalue instanceof Ident) {
-      assign(env, loc, (Ident) lvalue, result);
+    if (lvalue instanceof Identifier) {
+      assign(env, loc, (Identifier) lvalue, result);
       return;
     }
 
@@ -77,7 +77,7 @@
   /**
    * Assign value to a single variable.
    */
-  private static void assign(Environment env, Location loc, Ident ident, Object result)
+  private static void assign(Environment env, Location loc, Identifier ident, Object result)
       throws EvalException, InterruptedException {
     Preconditions.checkNotNull(result, "trying to assign null to %s", ident);
 
@@ -103,8 +103,8 @@
 
   private static void validate(ValidationEnvironment env, Location loc, Expression expr)
       throws EvalException {
-    if (expr instanceof Ident) {
-      Ident ident = (Ident) expr;
+    if (expr instanceof Identifier) {
+      Identifier ident = (Identifier) expr;
       env.declare(ident.getName(), loc);
       return;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java
index 106b348..0eae19b 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java
@@ -26,20 +26,20 @@
 
   public static final String PATH_ERROR_MSG = "Path '%s' is not valid. "
       + "It should either start with a slash or refer to a file in the current directory.";
-  private final ImmutableList<Ident> symbols;
+  private final ImmutableList<Identifier> symbols;
   private final PathFragment importPath;
   private final String pathString;
 
   /**
    * Constructs an import statement.
    */
-  LoadStatement(String path, List<Ident> symbols) {
+  LoadStatement(String path, List<Identifier> symbols) {
     this.symbols = ImmutableList.copyOf(symbols);
     this.importPath = new PathFragment(path + ".bzl");
     this.pathString = path;
   }
 
-  public ImmutableList<Ident> getSymbols() {
+  public ImmutableList<Identifier> getSymbols() {
     return symbols;
   }
 
@@ -54,9 +54,9 @@
 
   @Override
   void exec(Environment env) throws EvalException, InterruptedException {
-    for (Ident i : symbols) {
+    for (Identifier i : symbols) {
       try {
-        if (i.getName().startsWith("_")) {
+        if (i.isPrivate()) {
           throw new EvalException(getLocation(), "symbol '" + i + "' is private and cannot "
               + "be imported");
         }
@@ -79,7 +79,7 @@
     if (!importPath.isAbsolute() && importPath.segmentCount() > 1) {
       throw new EvalException(getLocation(), String.format(PATH_ERROR_MSG, importPath));
     }
-    for (Ident symbol : symbols) {
+    for (Identifier symbol : symbols) {
       env.declare(symbol.getName(), getLocation());
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
index efd40b4..46e7ca7 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
@@ -388,8 +388,8 @@
   }
 
   // create an error expression
-  private Ident makeErrorExpression(int start, int end) {
-    return setLocation(new Ident("$error$"), start, end);
+  private Identifier makeErrorExpression(int start, int end) {
+    return setLocation(new Identifier("$error$"), start, end);
   }
 
   // Convenience wrapper around ASTNode.setLocation that returns the node.
@@ -410,7 +410,7 @@
   }
 
   // create a funcall expression
-  private Expression makeFuncallExpression(Expression receiver, Ident function,
+  private Expression makeFuncallExpression(Expression receiver, Identifier function,
                                            List<Argument.Passed> args,
                                            int start, int end) {
     if (function.getLocation() == null) {
@@ -474,21 +474,21 @@
     int start = token.left;
     if (token.kind == TokenKind.STAR_STAR) { // kwarg
       nextToken();
-      Ident ident = parseIdent();
+      Identifier ident = parseIdent();
       return setLocation(new Parameter.StarStar<Expression, Expression>(
           ident.getName()), start, ident);
     } else if (token.kind == TokenKind.STAR) { // stararg
       int end = token.right;
       nextToken();
       if (token.kind == TokenKind.IDENTIFIER) {
-        Ident ident = parseIdent();
+        Identifier ident = parseIdent();
         return setLocation(new Parameter.Star<Expression, Expression>(ident.getName()),
             start, ident);
       } else {
         return setLocation(new Parameter.Star<Expression, Expression>(null), start, end);
       }
     } else {
-      Ident ident = parseIdent();
+      Identifier ident = parseIdent();
       if (token.kind == TokenKind.EQUALS) { // there's a default value
         nextToken();
         Expression expr = parseNonTupleExpression();
@@ -502,7 +502,7 @@
   }
 
   // funcall_suffix ::= '(' arg_list? ')'
-  private Expression parseFuncallSuffix(int start, Expression receiver, Ident function) {
+  private Expression parseFuncallSuffix(int start, Expression receiver, Identifier function) {
     List<Argument.Passed> args = Collections.emptyList();
     expect(TokenKind.LPAREN);
     int end;
@@ -522,7 +522,7 @@
   private Expression parseSelectorSuffix(int start, Expression receiver) {
     expect(TokenKind.DOT);
     if (token.kind == TokenKind.IDENTIFIER) {
-      Ident ident = parseIdent();
+      Identifier ident = parseIdent();
       if (token.kind == TokenKind.LPAREN) {
         return parseFuncallSuffix(start, receiver, ident);
       } else {
@@ -599,7 +599,7 @@
         new StringLiteral(labelName, '"')), location));
     args.add(setLocation(new Argument.Positional(
         new StringLiteral(file, '"')), location));
-    Ident mockIdent = setLocation(new Ident("mocksubinclude"), location);
+    Identifier mockIdent = setLocation(new Identifier("mocksubinclude"), location);
     Expression funCall = new FuncallExpression(null, mockIdent, args);
     return setLocation(new ExpressionStatement(funCall), location);
   }
@@ -680,7 +680,7 @@
         return literal;
       }
       case IDENTIFIER: {
-        Ident ident = parseIdent();
+        Identifier ident = parseIdent();
         if (token.kind == TokenKind.LPAREN) { // it's a function application
           return parseFuncallSuffix(start, null, ident);
         } else {
@@ -720,7 +720,7 @@
         List<Argument.Passed> args = new ArrayList<>();
         Expression expr = parsePrimaryWithSuffix();
         args.add(setLocation(new Argument.Positional(expr), start, expr));
-        return makeFuncallExpression(null, new Ident("-"), args,
+        return makeFuncallExpression(null, new Identifier("-"), args,
                                      start, token.right);
       }
       default: {
@@ -765,7 +765,7 @@
     // This is a dictionary access
     if (token.kind == TokenKind.RBRACKET) {
       expect(TokenKind.RBRACKET);
-      return makeFuncallExpression(receiver, new Ident("$index"), args,
+      return makeFuncallExpression(receiver, new Identifier("$index"), args,
                                    start, token.right);
     }
     // This is a slice (or substring)
@@ -779,7 +779,7 @@
     expect(TokenKind.RBRACKET);
 
     args.add(setLocation(new Argument.Positional(endExpr), loc2, endExpr));
-    return makeFuncallExpression(receiver, new Ident("$slice"), args,
+    return makeFuncallExpression(receiver, new Identifier("$slice"), args,
                                  start, token.right);
   }
 
@@ -933,12 +933,12 @@
     return makeErrorExpression(start, end);
   }
 
-  private Ident parseIdent() {
+  private Identifier parseIdent() {
     if (token.kind != TokenKind.IDENTIFIER) {
       expect(TokenKind.IDENTIFIER);
       return makeErrorExpression(token.left, token.right);
     }
-    Ident ident = new Ident(((String) token.value));
+    Identifier ident = new Identifier(((String) token.value));
     setLocation(ident, token.left, token.right);
     nextToken();
     return ident;
@@ -1083,9 +1083,9 @@
     nextToken();
     expect(TokenKind.COMMA);
 
-    List<Ident> symbols = new ArrayList<>();
+    List<Identifier> symbols = new ArrayList<>();
     if (token.kind == TokenKind.STRING) {
-      symbols.add(new Ident((String) token.value));
+      symbols.add(new Identifier((String) token.value));
     }
     expect(TokenKind.STRING);
     while (token.kind != TokenKind.RPAREN && token.kind != TokenKind.EOF) {
@@ -1094,7 +1094,7 @@
         break;
       }
       if (token.kind == TokenKind.STRING) {
-        symbols.add(new Ident((String) token.value));
+        symbols.add(new Identifier((String) token.value));
       }
       expect(TokenKind.STRING);
     }
@@ -1122,7 +1122,7 @@
     // Check if there is an include
     if (token.kind == TokenKind.IDENTIFIER) {
       Token identToken = token;
-      Ident ident = parseIdent();
+      Identifier ident = parseIdent();
 
       if (ident.getName().equals("include")
           && token.kind == TokenKind.LPAREN
@@ -1200,7 +1200,8 @@
       Expression rvalue = parseExpression();
       if (expression instanceof FuncallExpression) {
         FuncallExpression func = (FuncallExpression) expression;
-        if (func.getFunction().getName().equals("$index") && func.getObject() instanceof Ident) {
+        if (func.getFunction().getName().equals("$index")
+            && func.getObject() instanceof Identifier) {
           // Special casing to translate 'ident[key] = value' to 'ident = ident + {key: value}'
           // Note that the locations of these extra expressions are fake.
           Preconditions.checkArgument(func.getArguments().size() == 1);
@@ -1274,7 +1275,7 @@
   private void parseFunctionDefStatement(List<Statement> list) {
     int start = token.left;
     expect(TokenKind.DEF);
-    Ident ident = parseIdent();
+    Identifier ident = parseIdent();
     expect(TokenKind.LPAREN);
     FunctionSignature.WithValues<Expression, Expression> args = parseFunctionSignature();
     expect(TokenKind.RPAREN);
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SyntaxTreeVisitor.java b/src/main/java/com/google/devtools/build/lib/syntax/SyntaxTreeVisitor.java
index 3d699ff..6769061 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SyntaxTreeVisitor.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SyntaxTreeVisitor.java
@@ -55,7 +55,7 @@
     visitAll(node.getArguments());
   }
 
-  public void visit(Ident node) {
+  public void visit(Identifier node) {
   }
 
   public void visit(ListComprehension node) {
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/UserDefinedFunction.java b/src/main/java/com/google/devtools/build/lib/syntax/UserDefinedFunction.java
index 5bb9019..4a5968c 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/UserDefinedFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/UserDefinedFunction.java
@@ -25,7 +25,7 @@
   private final ImmutableList<Statement> statements;
   private final SkylarkEnvironment definitionEnv;
 
-  protected UserDefinedFunction(Ident function,
+  protected UserDefinedFunction(Identifier function,
       FunctionSignature.WithValues<Object, SkylarkType> signature,
       ImmutableList<Statement> statements, SkylarkEnvironment definitionEnv) {
     super(function.getName(), signature, function.getLocation());
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
index de59d2a..dad2d46 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
@@ -145,7 +145,7 @@
   public void testFuncallExpr() throws Exception {
     FuncallExpression e = (FuncallExpression) parseExpression("foo(1, 2, bar=wiz)");
 
-    Ident ident = e.getFunction();
+    Identifier ident = e.getFunction();
     assertEquals("foo", ident.getName());
 
     assertThat(e.getArguments()).hasSize(3);
@@ -159,7 +159,7 @@
 
     Argument.Passed arg2 = e.getArguments().get(2);
     assertEquals("bar", arg2.getName());
-    Ident arg2val = (Ident) arg2.getValue();
+    Identifier arg2val = (Identifier) arg2.getValue();
     assertEquals("wiz", arg2val.getName());
   }
 
@@ -168,7 +168,7 @@
     FuncallExpression e =
       (FuncallExpression) parseExpression("foo.foo(1, 2, bar=wiz)");
 
-    Ident ident = e.getFunction();
+    Identifier ident = e.getFunction();
     assertEquals("foo", ident.getName());
 
     assertThat(e.getArguments()).hasSize(3);
@@ -182,7 +182,7 @@
 
     Argument.Passed arg2 = e.getArguments().get(2);
     assertEquals("bar", arg2.getName());
-    Ident arg2val = (Ident) arg2.getValue();
+    Identifier arg2val = (Identifier) arg2.getValue();
     assertEquals("wiz", arg2val.getName());
   }
 
@@ -191,7 +191,7 @@
     FuncallExpression e =
       (FuncallExpression) parseExpression("foo.replace().split(1)");
 
-    Ident ident = e.getFunction();
+    Identifier ident = e.getFunction();
     assertEquals("split", ident.getName());
 
     assertThat(e.getArguments()).hasSize(1);
@@ -205,7 +205,7 @@
   public void testPropRefExpr() throws Exception {
     DotExpression e = (DotExpression) parseExpression("foo.foo");
 
-    Ident ident = e.getField();
+    Identifier ident = e.getField();
     assertEquals("foo", ident.getName());
   }
 
@@ -213,7 +213,7 @@
   public void testStringMethExpr() throws Exception {
     FuncallExpression e = (FuncallExpression) parseExpression("'foo'.foo()");
 
-    Ident ident = e.getFunction();
+    Identifier ident = e.getFunction();
     assertEquals("foo", ident.getName());
 
     assertThat(e.getArguments()).isEmpty();
@@ -280,7 +280,7 @@
 
     // Test that the actual parameters are: (1, $error$, 3):
 
-    Ident ident = e.getFunction();
+    Identifier ident = e.getFunction();
     assertEquals("f", ident.getName());
 
     assertThat(e.getArguments()).hasSize(3);
@@ -290,7 +290,7 @@
     assertEquals(1, (int) arg0.getValue());
 
     Argument.Passed arg1 = e.getArguments().get(1);
-    Ident arg1val = ((Ident) arg1.getValue());
+    Identifier arg1val = ((Identifier) arg1.getValue());
     assertEquals("$error$", arg1val.getName());
 
     assertLocation(5, 29, arg1val.getLocation());
@@ -658,7 +658,7 @@
     assertThat(clauses.get(0).getLValue().getExpression().toString()).isEqualTo("x");
     assertThat(clauses.get(0).getExpression()).isInstanceOf(ListLiteral.class);
     assertThat(clauses.get(1).getLValue().getExpression().toString()).isEqualTo("y");
-    assertThat(clauses.get(1).getExpression()).isInstanceOf(Ident.class);
+    assertThat(clauses.get(1).getExpression()).isInstanceOf(Identifier.class);
   }
 
   @Test
