diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ValidationTests.java b/src/test/java/com/google/devtools/build/lib/syntax/ValidationTests.java
index 6085ba5..d235100 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ValidationTests.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ValidationTests.java
@@ -13,10 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.syntax;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.base.Joiner;
 import com.google.devtools.build.lib.actions.Artifact;
@@ -668,71 +665,83 @@
 
   @Test
   public void testParentWithSkylarkModule() throws Exception {
-    assertTrue(SkylarkList.class.isAnnotationPresent(SkylarkModule.class));
-    assertEquals(SkylarkList.class,
-        EvalUtils.getParentWithSkylarkModule(SkylarkList.class));
-    assertEquals(SkylarkList.class,
-        EvalUtils.getParentWithSkylarkModule(SkylarkList.EMPTY_LIST.getClass()));
-    assertEquals(SkylarkList.class,
-        EvalUtils.getParentWithSkylarkModule(
-            SkylarkList.tuple(Arrays.<Object>asList(1, 2, 3)).getClass()));
-    // TODO(bazel-team): fix that!
-    assertFalse(ClassObject.class.isAnnotationPresent(SkylarkModule.class));
-    assertTrue(ClassObject.SkylarkClassObject.class
-        .isAnnotationPresent(SkylarkModule.class));
-    assertEquals(ClassObject.SkylarkClassObject.class,
-        EvalUtils.getParentWithSkylarkModule(ClassObject.SkylarkClassObject.class));
-    assertNull(EvalUtils.getParentWithSkylarkModule(ClassObject.class));
+    Class<?> emptyListClass = SkylarkList.EMPTY_LIST.getClass();
+    Class<?> simpleListClass = SkylarkList.list(Arrays.<Integer>asList(1, 2, 3), SkylarkType.INT)
+        .getClass();
+    Class<?> tupleClass = SkylarkList.tuple(Arrays.<Object>asList(1, "a", "b")).getClass();
+
+    assertThat(SkylarkList.class.isAnnotationPresent(SkylarkModule.class)).isTrue();
+    assertThat(EvalUtils.getParentWithSkylarkModule(SkylarkList.class))
+        .isEqualTo(SkylarkList.class);
+    assertThat(EvalUtils.getParentWithSkylarkModule(emptyListClass)).isEqualTo(SkylarkList.class);
+    assertThat(EvalUtils.getParentWithSkylarkModule(simpleListClass)).isEqualTo(SkylarkList.class);
+    // TODO(bazel-team): make a tuple not a list anymore.
+    assertThat(EvalUtils.getParentWithSkylarkModule(tupleClass)).isEqualTo(SkylarkList.class);
+
+    // TODO(bazel-team): fix that?
+    assertThat(ClassObject.class.isAnnotationPresent(SkylarkModule.class))
+        .isFalse();
+    assertThat(ClassObject.SkylarkClassObject.class.isAnnotationPresent(SkylarkModule.class))
+        .isTrue();
+    assertThat(EvalUtils.getParentWithSkylarkModule(ClassObject.SkylarkClassObject.class)
+        == ClassObject.SkylarkClassObject.class).isTrue();
+    assertThat(EvalUtils.getParentWithSkylarkModule(ClassObject.class))
+        .isNull();
   }
 
   @Test
   public void testSkylarkTypeEquivalence() throws Exception {
     // All subclasses of SkylarkList are made equivalent
-    assertEquals(SkylarkType.LIST, SkylarkType.of(SkylarkList.class));
-    assertEquals(SkylarkType.LIST, SkylarkType.of(SkylarkList.EMPTY_LIST.getClass()));
-    assertEquals(SkylarkType.LIST, SkylarkType.of(
-        SkylarkList.list(Arrays.<Object>asList(1, 2, 3), SkylarkType.INT).getClass()));
+    Class<?> emptyListClass = SkylarkList.EMPTY_LIST.getClass();
+    Class<?> simpleListClass = SkylarkList.list(Arrays.<Integer>asList(1, 2, 3), SkylarkType.INT)
+        .getClass();
+    Class<?> tupleClass = SkylarkList.tuple(Arrays.<Object>asList(1, "a", "b")).getClass();
+
+    assertThat(SkylarkType.of(SkylarkList.class)).isEqualTo(SkylarkType.LIST);
+    assertThat(SkylarkType.of(emptyListClass)).isEqualTo(SkylarkType.LIST);
+    assertThat(SkylarkType.of(simpleListClass)).isEqualTo(SkylarkType.LIST);
     // TODO(bazel-team): make a tuple not a list anymore.
-    assertEquals(SkylarkType.LIST, SkylarkType.of(
-        SkylarkList.tuple(Arrays.<Object>asList(1, "a", "b")).getClass()));
+    assertThat(SkylarkType.of(tupleClass)).isEqualTo(SkylarkType.LIST);
+
 
     // Also for ClassObject
-    assertEquals(SkylarkType.of(ClassObject.SkylarkClassObject.class),
-        SkylarkType.of(ClassObject.SkylarkClassObject.class));
-    assertFalse(SkylarkType.of(ClassObject.class).equals(
-        SkylarkType.of(ClassObject.SkylarkClassObject.class)));
+    assertThat(SkylarkType.of(ClassObject.SkylarkClassObject.class))
+        .isEqualTo(SkylarkType.STRUCT);
+    // TODO(bazel-team): fix that?
+    assertThat(SkylarkType.of(ClassObject.class))
+        .isNotEqualTo(SkylarkType.STRUCT);
 
-    // Also for these bazel classes, to avoid some regression.
+    // Also test for these bazel classes, to avoid some regression.
     // TODO(bazel-team): move to some other place to remove dependency of syntax tests on Artifact?
-    assertEquals(SkylarkType.of(Artifact.class), SkylarkType.of(Artifact.SpecialArtifact.class));
-    assertFalse(SkylarkType.of(RuleConfiguredTarget.class).equals(
-        SkylarkType.STRUCT));
+    assertThat(SkylarkType.of(Artifact.SpecialArtifact.class))
+        .isEqualTo(SkylarkType.of(Artifact.class));
+    assertThat(SkylarkType.of(RuleConfiguredTarget.class))
+        .isNotEqualTo(SkylarkType.STRUCT);
   }
 
   @Test
   public void testSkylarkTypeInclusion() throws Exception {
-    assertTrue(SkylarkType.INT.includes(SkylarkType.BOTTOM));
-    assertFalse(SkylarkType.BOTTOM.includes(SkylarkType.INT));
-    assertTrue(SkylarkType.TOP.includes(SkylarkType.INT));
+    assertThat(SkylarkType.INT.includes(SkylarkType.BOTTOM)).isTrue();
+    assertThat(SkylarkType.BOTTOM.includes(SkylarkType.INT)).isFalse();
+    assertThat(SkylarkType.TOP.includes(SkylarkType.INT)).isTrue();
 
     SkylarkType combo1 = SkylarkType.Combination.of(SkylarkType.LIST, SkylarkType.INT);
-    assertTrue(SkylarkType.LIST.includes(combo1));
+    assertThat(SkylarkType.LIST.includes(combo1)).isTrue();
 
     SkylarkType union1 = SkylarkType.Union.of(
         SkylarkType.MAP, SkylarkType.LIST, SkylarkType.STRUCT);
-    assertTrue(union1.includes(SkylarkType.MAP));
-    assertTrue(union1.includes(SkylarkType.LIST));
-    assertTrue(union1.includes(SkylarkType.STRUCT));
-    assertTrue(union1.includes(combo1));
-    assertFalse(union1.includes(SkylarkType.STRING));
+    assertThat(union1.includes(SkylarkType.MAP)).isTrue();
+    assertThat(union1.includes(SkylarkType.STRUCT)).isTrue();
+    assertThat(union1.includes(combo1)).isTrue();
+    assertThat(union1.includes(SkylarkType.STRING)).isFalse();
 
     SkylarkType union2 = SkylarkType.Union.of(
         SkylarkType.LIST, SkylarkType.MAP, SkylarkType.STRING, SkylarkType.INT);
     SkylarkType inter1 = SkylarkType.intersection(union1, union2);
-    assertTrue(inter1.includes(SkylarkType.MAP));
-    assertTrue(inter1.includes(SkylarkType.LIST));
-    assertTrue(inter1.includes(combo1));
-    assertFalse(inter1.includes(SkylarkType.INT));
+    assertThat(inter1.includes(SkylarkType.MAP)).isTrue();
+    assertThat(inter1.includes(SkylarkType.LIST)).isTrue();
+    assertThat(inter1.includes(combo1)).isTrue();
+    assertThat(inter1.includes(SkylarkType.INT)).isFalse();
   }
 
   private void parse(String... lines) {
