Move scalar types over to type/ folder.

This CL moves Bool, F16, F32, I32, U32, and Void over to the type folder
and updates namespaces as needed.

Bug: tint:1718
Change-Id: If3056521e5283ac2d9e1fd09c6daf0f647dd3846
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/113342
Reviewed-by: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Dan Sinclair <dsinclair@chromium.org>
diff --git a/src/tint/BUILD.gn b/src/tint/BUILD.gn
index 98d0c84..77e65d1 100644
--- a/src/tint/BUILD.gn
+++ b/src/tint/BUILD.gn
@@ -420,7 +420,6 @@
     "sem/atomic.h",
     "sem/behavior.h",
     "sem/binding_point.h",
-    "sem/bool.h",
     "sem/break_if_statement.h",
     "sem/builtin.h",
     "sem/builtin_type.h",
@@ -429,10 +428,7 @@
     "sem/constant.h",
     "sem/evaluation_stage.h",
     "sem/expression.h",
-    "sem/f16.h",
-    "sem/f32.h",
     "sem/for_loop_statement.h",
-    "sem/i32.h",
     "sem/if_statement.h",
     "sem/index_accessor_expression.h",
     "sem/info.h",
@@ -451,9 +447,7 @@
     "sem/type_conversion.h",
     "sem/type_initializer.h",
     "sem/type_mappings.h",
-    "sem/u32.h",
     "sem/vector.h",
-    "sem/void.h",
     "sem/while_statement.h",
     "source.cc",
     "source.h",
@@ -569,9 +563,13 @@
     "type/abstract_int.h",
     "type/abstract_numeric.h",
     "type/array_count.h",
+    "type/bool.h",
     "type/depth_multisampled_texture.h",
     "type/depth_texture.h",
     "type/external_texture.h",
+    "type/f16.h",
+    "type/f32.h",
+    "type/i32.h",
     "type/multisampled_texture.h",
     "type/node.h",
     "type/sampled_texture.h",
@@ -580,6 +578,8 @@
     "type/texture.h",
     "type/type.h",
     "type/type_manager.h",
+    "type/u32.h",
+    "type/void.h",
     "utils/bitcast.h",
     "utils/bitset.h",
     "utils/block_allocator.h",
@@ -643,8 +643,6 @@
     "sem/behavior.h",
     "sem/binding_point.h",
     "sem/block_statement.cc",
-    "sem/bool.cc",
-    "sem/bool.h",
     "sem/break_if_statement.cc",
     "sem/break_if_statement.h",
     "sem/builtin.cc",
@@ -660,15 +658,9 @@
     "sem/evaluation_stage.h",
     "sem/expression.cc",
     "sem/expression.h",
-    "sem/f16.cc",
-    "sem/f16.h",
-    "sem/f32.cc",
-    "sem/f32.h",
     "sem/for_loop_statement.cc",
     "sem/for_loop_statement.h",
     "sem/function.cc",
-    "sem/i32.cc",
-    "sem/i32.h",
     "sem/if_statement.cc",
     "sem/if_statement.h",
     "sem/index_accessor_expression.cc",
@@ -703,13 +695,9 @@
     "sem/type_initializer.cc",
     "sem/type_initializer.h",
     "sem/type_mappings.h",
-    "sem/u32.cc",
-    "sem/u32.h",
     "sem/variable.cc",
     "sem/vector.cc",
     "sem/vector.h",
-    "sem/void.cc",
-    "sem/void.h",
     "sem/while_statement.cc",
     "sem/while_statement.h",
   ]
@@ -727,12 +715,20 @@
     "type/abstract_numeric.h",
     "type/array_count.cc",
     "type/array_count.h",
+    "type/bool.cc",
+    "type/bool.h",
     "type/depth_multisampled_texture.cc",
     "type/depth_multisampled_texture.h",
     "type/depth_texture.cc",
     "type/depth_texture.h",
     "type/external_texture.cc",
     "type/external_texture.h",
+    "type/f16.cc",
+    "type/f16.h",
+    "type/f32.cc",
+    "type/f32.h",
+    "type/i32.cc",
+    "type/i32.h",
     "type/multisampled_texture.cc",
     "type/multisampled_texture.h",
     "type/node.cc",
@@ -749,6 +745,10 @@
     "type/type.h",
     "type/type_manager.cc",
     "type/type_manager.h",
+    "type/u32.cc",
+    "type/u32.h",
+    "type/void.cc",
+    "type/void.h",
   ]
 
   public_deps = [ ":libtint_core_all_src" ]
@@ -1204,26 +1204,25 @@
     sources = [
       "sem/array_test.cc",
       "sem/atomic_test.cc",
-      "sem/bool_test.cc",
       "sem/builtin_test.cc",
       "sem/expression_test.cc",
-      "sem/f16_test.cc",
-      "sem/f32_test.cc",
-      "sem/i32_test.cc",
       "sem/matrix_test.cc",
       "sem/pointer_test.cc",
       "sem/reference_test.cc",
       "sem/struct_test.cc",
-      "sem/u32_test.cc",
       "sem/vector_test.cc",
     ]
   }
 
   tint_unittests_source_set("tint_unittests_type_src") {
     sources = [
+      "type/bool_test.cc",
       "type/depth_multisampled_texture_test.cc",
       "type/depth_texture_test.cc",
       "type/external_texture_test.cc",
+      "type/f16_test.cc",
+      "type/f32_test.cc",
+      "type/i32_test.cc",
       "type/multisampled_texture_test.cc",
       "type/sampled_texture_test.cc",
       "type/sampler_test.cc",
@@ -1231,6 +1230,7 @@
       "type/texture_test.cc",
       "type/type_manager_test.cc",
       "type/type_test.cc",
+      "type/u32_test.cc",
     ]
   }
 
diff --git a/src/tint/CMakeLists.txt b/src/tint/CMakeLists.txt
index 9decb99..bb6ff5f 100644
--- a/src/tint/CMakeLists.txt
+++ b/src/tint/CMakeLists.txt
@@ -302,8 +302,6 @@
   sem/binding_point.h
   sem/block_statement.cc
   sem/block_statement.h
-  sem/bool.cc
-  sem/bool.h
   sem/break_if_statement.cc
   sem/break_if_statement.h
   sem/builtin.cc
@@ -317,15 +315,9 @@
   sem/evaluation_stage.h
   sem/expression.cc
   sem/expression.h
-  sem/f16.cc
-  sem/f16.h
-  sem/f32.cc
-  sem/f32.h
   sem/for_loop_statement.cc
   sem/for_loop_statement.h
   sem/function.cc
-  sem/i32.cc
-  sem/i32.h
   sem/if_statement.cc
   sem/if_statement.h
   sem/index_accessor_expression.cc
@@ -358,13 +350,9 @@
   sem/type_conversion.cc
   sem/type_conversion.h
   sem/type_mappings.h
-  sem/u32.cc
-  sem/u32.h
   sem/variable.cc
   sem/vector.cc
   sem/vector.h
-  sem/void.cc
-  sem/void.h
   sem/while_statement.cc
   sem/while_statement.h
   symbol_table.cc
@@ -483,12 +471,20 @@
   type/abstract_numeric.h
   type/array_count.cc
   type/array_count.h
+  type/bool.cc
+  type/bool.h
   type/depth_multisampled_texture.cc
   type/depth_multisampled_texture.h
   type/depth_texture.cc
   type/depth_texture.h
   type/external_texture.cc
   type/external_texture.h
+  type/f16.cc
+  type/f16.h
+  type/f32.cc
+  type/f32.h
+  type/i32.cc
+  type/i32.h
   type/multisampled_texture.cc
   type/multisampled_texture.h
   type/node.cc
@@ -505,6 +501,10 @@
   type/type.h
   type/type_manager.cc
   type/type_manager.h
+  type/u32.cc
+  type/u32.h
+  type/void.cc
+  type/void.h
   utils/bitcast.h
   utils/bitset.h
   utils/block_allocator.h
@@ -922,17 +922,12 @@
     scope_stack_test.cc
     sem/array_test.cc
     sem/atomic.cc
-    sem/bool_test.cc
     sem/builtin_test.cc
     sem/expression_test.cc
-    sem/f16_test.cc
-    sem/f32_test.cc
-    sem/i32_test.cc
     sem/matrix_test.cc
     sem/pointer_test.cc
     sem/reference_test.cc
     sem/struct_test.cc
-    sem/u32_test.cc
     sem/vector_test.cc
     source_test.cc
     symbol_table_test.cc
@@ -941,9 +936,13 @@
     text/unicode_test.cc
     traits_test.cc
     transform/transform_test.cc
+    type/bool_test.cc
     type/depth_multisampled_texture_test.cc
     type/depth_texture_test.cc
     type/external_texture_test.cc
+    type/f16_test.cc
+    type/f32_test.cc
+    type/i32_test.cc
     type/multisampled_texture_test.cc
     type/sampled_texture_test.cc
     type/sampler_test.cc
@@ -951,6 +950,7 @@
     type/texture_test.cc
     type/type_test.cc
     type/type_manager_test.cc
+    type/u32_test.cc
     utils/bitcast_test.cc
     utils/bitset_test.cc
     utils/block_allocator_test.cc
diff --git a/src/tint/fuzzers/tint_ast_fuzzer/mutations/change_binary_operator.cc b/src/tint/fuzzers/tint_ast_fuzzer/mutations/change_binary_operator.cc
index 15af58d..aa46ec3 100644
--- a/src/tint/fuzzers/tint_ast_fuzzer/mutations/change_binary_operator.cc
+++ b/src/tint/fuzzers/tint_ast_fuzzer/mutations/change_binary_operator.cc
@@ -17,8 +17,8 @@
 #include <utility>
 
 #include "src/tint/program_builder.h"
-#include "src/tint/sem/bool.h"
 #include "src/tint/sem/reference.h"
+#include "src/tint/type/bool.h"
 
 namespace tint::fuzzers::ast_fuzzer {
 
@@ -173,7 +173,7 @@
         case ast::BinaryOp::kLogicalOr:
             // '&' and '|' can be applied to booleans, and for boolean scalar
             // scalar contexts, their logical counterparts work.
-            return lhs_type->Is<sem::Bool>();
+            return lhs_type->Is<type::Bool>();
         case ast::BinaryOp::kEqual:
         case ast::BinaryOp::kNotEqual:
             // '&' and '|' can be applied to booleans, and in these contexts equality
@@ -249,7 +249,7 @@
         case ast::BinaryOp::kLogicalOr:
             // An equality comparison between boolean scalars can be turned into a
             // logical operation.
-            return lhs_type->Is<sem::Bool>();
+            return lhs_type->Is<type::Bool>();
         case ast::BinaryOp::kAnd:
         case ast::BinaryOp::kOr:
             // An equality comparison between boolean scalars or vectors can be turned
diff --git a/src/tint/inspector/inspector.cc b/src/tint/inspector/inspector.cc
index cbf5c03..8236a83 100644
--- a/src/tint/inspector/inspector.cc
+++ b/src/tint/inspector/inspector.cc
@@ -29,26 +29,26 @@
 #include "src/tint/ast/override.h"
 #include "src/tint/ast/var.h"
 #include "src/tint/sem/array.h"
-#include "src/tint/sem/bool.h"
 #include "src/tint/sem/call.h"
-#include "src/tint/sem/f16.h"
-#include "src/tint/sem/f32.h"
 #include "src/tint/sem/function.h"
-#include "src/tint/sem/i32.h"
 #include "src/tint/sem/matrix.h"
 #include "src/tint/sem/module.h"
 #include "src/tint/sem/statement.h"
 #include "src/tint/sem/struct.h"
-#include "src/tint/sem/u32.h"
 #include "src/tint/sem/variable.h"
 #include "src/tint/sem/vector.h"
-#include "src/tint/sem/void.h"
+#include "src/tint/type/bool.h"
 #include "src/tint/type/depth_multisampled_texture.h"
 #include "src/tint/type/depth_texture.h"
 #include "src/tint/type/external_texture.h"
+#include "src/tint/type/f16.h"
+#include "src/tint/type/f32.h"
+#include "src/tint/type/i32.h"
 #include "src/tint/type/multisampled_texture.h"
 #include "src/tint/type/sampled_texture.h"
 #include "src/tint/type/storage_texture.h"
+#include "src/tint/type/u32.h"
+#include "src/tint/type/void.h"
 #include "src/tint/utils/math.h"
 #include "src/tint/utils/string.h"
 #include "src/tint/utils/unique_vector.h"
@@ -75,10 +75,10 @@
 
     ComponentType componentType = Switch(
         type::Type::DeepestElementOf(type),  //
-        [&](const sem::F32*) { return ComponentType::kF32; },
-        [&](const sem::F16*) { return ComponentType::kF16; },
-        [&](const sem::I32*) { return ComponentType::kI32; },
-        [&](const sem::U32*) { return ComponentType::kU32; },
+        [&](const type::F32*) { return ComponentType::kF32; },
+        [&](const type::F16*) { return ComponentType::kF16; },
+        [&](const type::I32*) { return ComponentType::kI32; },
+        [&](const type::U32*) { return ComponentType::kU32; },
         [&](Default) {
             tint::diag::List diagnostics;
             TINT_UNREACHABLE(Inspector, diagnostics) << "unhandled component type";
@@ -226,7 +226,7 @@
             ast::BuiltinValue::kNumWorkgroups, param->Type(), param->Declaration()->attributes);
     }
 
-    if (!sem->ReturnType()->Is<sem::Void>()) {
+    if (!sem->ReturnType()->Is<type::Void>()) {
         AddEntryPointInOutVariables("<retval>", sem->ReturnType(), func->return_type_attributes,
                                     sem->ReturnLocation(), entry_point.output_variables);
 
@@ -314,10 +314,10 @@
             if (auto* value = global->Initializer()->ConstantValue()) {
                 result[override_id] = Switch(
                     value->Type(),  //
-                    [&](const sem::I32*) { return Scalar(value->As<i32>()); },
-                    [&](const sem::U32*) { return Scalar(value->As<u32>()); },
-                    [&](const sem::F32*) { return Scalar(value->As<f32>()); },
-                    [&](const sem::Bool*) { return Scalar(value->As<bool>()); });
+                    [&](const type::I32*) { return Scalar(value->As<i32>()); },
+                    [&](const type::U32*) { return Scalar(value->As<u32>()); },
+                    [&](const type::F32*) { return Scalar(value->As<f32>()); },
+                    [&](const type::Bool*) { return Scalar(value->As<bool>()); });
                 continue;
             }
         }
diff --git a/src/tint/inspector/resource_binding.cc b/src/tint/inspector/resource_binding.cc
index 225e739..6cbb4f1 100644
--- a/src/tint/inspector/resource_binding.cc
+++ b/src/tint/inspector/resource_binding.cc
@@ -15,12 +15,12 @@
 #include "src/tint/inspector/resource_binding.h"
 
 #include "src/tint/sem/array.h"
-#include "src/tint/sem/f32.h"
-#include "src/tint/sem/i32.h"
 #include "src/tint/sem/matrix.h"
-#include "src/tint/sem/u32.h"
 #include "src/tint/sem/vector.h"
+#include "src/tint/type/f32.h"
+#include "src/tint/type/i32.h"
 #include "src/tint/type/type.h"
+#include "src/tint/type/u32.h"
 
 namespace tint::inspector {
 
@@ -58,11 +58,11 @@
         base_type = vt->type();
     }
 
-    if (base_type->Is<sem::F32>()) {
+    if (base_type->Is<type::F32>()) {
         return ResourceBinding::SampledKind::kFloat;
-    } else if (base_type->Is<sem::U32>()) {
+    } else if (base_type->Is<type::U32>()) {
         return ResourceBinding::SampledKind::kUInt;
-    } else if (base_type->Is<sem::I32>()) {
+    } else if (base_type->Is<type::I32>()) {
         return ResourceBinding::SampledKind::kSInt;
     } else {
         return ResourceBinding::SampledKind::kUnknown;
diff --git a/src/tint/program_builder.h b/src/tint/program_builder.h
index 5f45e2c..4312528 100644
--- a/src/tint/program_builder.h
+++ b/src/tint/program_builder.h
@@ -92,22 +92,22 @@
 #include "src/tint/program_id.h"
 #include "src/tint/sem/array.h"
 #include "src/tint/sem/array_count.h"
-#include "src/tint/sem/bool.h"
 #include "src/tint/sem/constant.h"
-#include "src/tint/sem/f16.h"
-#include "src/tint/sem/f32.h"
-#include "src/tint/sem/i32.h"
 #include "src/tint/sem/matrix.h"
 #include "src/tint/sem/pointer.h"
 #include "src/tint/sem/struct.h"
-#include "src/tint/sem/u32.h"
 #include "src/tint/sem/vector.h"
-#include "src/tint/sem/void.h"
+#include "src/tint/type/bool.h"
 #include "src/tint/type/depth_texture.h"
 #include "src/tint/type/external_texture.h"
+#include "src/tint/type/f16.h"
+#include "src/tint/type/f32.h"
+#include "src/tint/type/i32.h"
 #include "src/tint/type/multisampled_texture.h"
 #include "src/tint/type/sampled_texture.h"
 #include "src/tint/type/storage_texture.h"
+#include "src/tint/type/u32.h"
+#include "src/tint/type/void.h"
 
 #ifdef CURRENTLY_IN_TINT_PUBLIC_HEADER
 #error "internal tint header being #included from tint.h"
diff --git a/src/tint/resolver/array_accessor_test.cc b/src/tint/resolver/array_accessor_test.cc
index d7327de..2a95c39 100644
--- a/src/tint/resolver/array_accessor_test.cc
+++ b/src/tint/resolver/array_accessor_test.cc
@@ -132,7 +132,7 @@
     ASSERT_TRUE(TypeOf(acc)->Is<sem::Reference>());
 
     auto* ref = TypeOf(acc)->As<sem::Reference>();
-    EXPECT_TRUE(ref->StoreType()->Is<sem::F32>());
+    EXPECT_TRUE(ref->StoreType()->Is<type::F32>());
 
     auto idx_sem = Sem().Get<sem::IndexAccessorExpression>(acc);
     ASSERT_NE(idx_sem, nullptr);
@@ -184,7 +184,7 @@
     ASSERT_TRUE(TypeOf(acc)->Is<sem::Reference>());
 
     auto* ref = TypeOf(acc)->As<sem::Reference>();
-    EXPECT_TRUE(ref->StoreType()->Is<sem::F32>());
+    EXPECT_TRUE(ref->StoreType()->Is<type::F32>());
 
     auto idx_sem = Sem().Get<sem::IndexAccessorExpression>(acc);
     ASSERT_NE(idx_sem, nullptr);
@@ -200,7 +200,7 @@
     ASSERT_NE(TypeOf(acc), nullptr);
     auto* ref = TypeOf(acc)->As<sem::Reference>();
     ASSERT_NE(ref, nullptr);
-    EXPECT_TRUE(ref->StoreType()->Is<sem::F32>());
+    EXPECT_TRUE(ref->StoreType()->Is<type::F32>());
 
     auto idx_sem = Sem().Get<sem::IndexAccessorExpression>(acc);
     ASSERT_NE(idx_sem, nullptr);
@@ -216,7 +216,7 @@
     ASSERT_NE(TypeOf(acc), nullptr);
     auto* ref = TypeOf(acc)->As<sem::Reference>();
     ASSERT_NE(ref, nullptr);
-    EXPECT_TRUE(ref->StoreType()->Is<sem::F32>());
+    EXPECT_TRUE(ref->StoreType()->Is<type::F32>());
 
     auto idx_sem = Sem().Get<sem::IndexAccessorExpression>(acc);
     ASSERT_NE(idx_sem, nullptr);
@@ -232,7 +232,7 @@
     ASSERT_NE(TypeOf(acc), nullptr);
     auto* ref = TypeOf(acc)->As<sem::Reference>();
     ASSERT_NE(ref, nullptr);
-    EXPECT_TRUE(ref->StoreType()->Is<sem::F32>());
+    EXPECT_TRUE(ref->StoreType()->Is<type::F32>());
 
     auto idx_sem = Sem().Get<sem::IndexAccessorExpression>(acc);
     ASSERT_NE(idx_sem, nullptr);
@@ -254,7 +254,7 @@
     ASSERT_TRUE(TypeOf(acc)->Is<sem::Reference>());
 
     auto* ref = TypeOf(acc)->As<sem::Reference>();
-    EXPECT_TRUE(ref->StoreType()->Is<sem::F32>());
+    EXPECT_TRUE(ref->StoreType()->Is<type::F32>());
 
     auto idx_sem = Sem().Get<sem::IndexAccessorExpression>(acc);
     ASSERT_NE(idx_sem, nullptr);
@@ -271,7 +271,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(acc), nullptr);
-    EXPECT_TRUE(TypeOf(acc)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(acc)->Is<type::F32>());
 }
 
 TEST_F(ResolverIndexAccessorTest, Array_Dynamic_I32) {
diff --git a/src/tint/resolver/atomics_test.cc b/src/tint/resolver/atomics_test.cc
index e3d0ca9..e4851bb 100644
--- a/src/tint/resolver/atomics_test.cc
+++ b/src/tint/resolver/atomics_test.cc
@@ -33,7 +33,7 @@
     ASSERT_TRUE(TypeOf(g)->Is<sem::Reference>());
     auto* atomic = TypeOf(g)->UnwrapRef()->As<sem::Atomic>();
     ASSERT_NE(atomic, nullptr);
-    EXPECT_TRUE(atomic->Type()->Is<sem::I32>());
+    EXPECT_TRUE(atomic->Type()->Is<type::I32>());
 }
 
 TEST_F(ResolverAtomicTest, GlobalWorkgroupU32) {
@@ -43,7 +43,7 @@
     ASSERT_TRUE(TypeOf(g)->Is<sem::Reference>());
     auto* atomic = TypeOf(g)->UnwrapRef()->As<sem::Atomic>();
     ASSERT_NE(atomic, nullptr);
-    EXPECT_TRUE(atomic->Type()->Is<sem::U32>());
+    EXPECT_TRUE(atomic->Type()->Is<type::U32>());
 }
 
 TEST_F(ResolverAtomicTest, GlobalStorageStruct) {
@@ -58,7 +58,7 @@
     ASSERT_EQ(str->Members().Length(), 1u);
     auto* atomic = str->Members()[0]->Type()->As<sem::Atomic>();
     ASSERT_NE(atomic, nullptr);
-    ASSERT_TRUE(atomic->Type()->Is<sem::I32>());
+    ASSERT_TRUE(atomic->Type()->Is<type::I32>());
 }
 
 }  // namespace
diff --git a/src/tint/resolver/builtin_test.cc b/src/tint/resolver/builtin_test.cc
index 72b428c..f8f2a68 100644
--- a/src/tint/resolver/builtin_test.cc
+++ b/src/tint/resolver/builtin_test.cc
@@ -87,7 +87,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    EXPECT_TRUE(TypeOf(expr)->Is<sem::Bool>());
+    EXPECT_TRUE(TypeOf(expr)->Is<type::Bool>());
 }
 TEST_P(ResolverBuiltinTest_BoolMethod, Vector) {
     auto name = GetParam();
@@ -100,7 +100,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    EXPECT_TRUE(TypeOf(expr)->Is<sem::Bool>());
+    EXPECT_TRUE(TypeOf(expr)->Is<type::Bool>());
 }
 INSTANTIATE_TEST_SUITE_P(ResolverTest,
                          ResolverBuiltinTest_BoolMethod,
@@ -119,7 +119,7 @@
     ASSERT_NE(TypeOf(expr), nullptr);
     EXPECT_TRUE(TypeOf(expr)->Is<sem::Vector>());
     EXPECT_EQ(TypeOf(expr)->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(TypeOf(expr)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(expr)->As<sem::Vector>()->type()->Is<type::F32>());
 }
 
 TEST_F(ResolverBuiltinTest, Select_Error_NoParams) {
@@ -222,7 +222,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<sem::U32>());
+    EXPECT_TRUE(TypeOf(call)->Is<type::U32>());
 }
 
 TEST_F(ResolverBuiltinArrayTest, ArrayLength_Error_ArraySized) {
@@ -290,7 +290,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<sem::F32>());
+        EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -317,7 +317,7 @@
         EXPECT_TRUE(TypeOf(call)->is_float_vector());
         EXPECT_EQ(TypeOf(call)->As<sem::Vector>()->Width(), 3u);
         ASSERT_NE(TypeOf(call)->As<sem::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::F32>());
+        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<type::F32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -338,7 +338,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<sem::F32>());
+        EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -362,7 +362,7 @@
         EXPECT_TRUE(TypeOf(call)->is_float_vector());
         EXPECT_EQ(TypeOf(call)->As<sem::Vector>()->Width(), 3u);
         ASSERT_NE(TypeOf(call)->As<sem::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::F32>());
+        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<type::F32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -383,7 +383,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<sem::F32>());
+        EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -408,7 +408,7 @@
         EXPECT_TRUE(TypeOf(call)->is_float_vector());
         EXPECT_EQ(TypeOf(call)->As<sem::Vector>()->Width(), 3u);
         ASSERT_NE(TypeOf(call)->As<sem::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::F32>());
+        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<type::F32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -430,7 +430,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<sem::F32>());
+        EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -455,7 +455,7 @@
         EXPECT_TRUE(TypeOf(call)->is_float_vector());
         EXPECT_EQ(TypeOf(call)->As<sem::Vector>()->Width(), 3u);
         ASSERT_NE(TypeOf(call)->As<sem::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::F32>());
+        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<type::F32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -484,7 +484,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<sem::F16>());
+        EXPECT_TRUE(TypeOf(call)->Is<type::F16>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -513,7 +513,7 @@
         EXPECT_TRUE(TypeOf(call)->is_float_vector());
         EXPECT_EQ(TypeOf(call)->As<sem::Vector>()->Width(), 3u);
         ASSERT_NE(TypeOf(call)->As<sem::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::F16>());
+        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<type::F16>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -536,7 +536,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<sem::F16>());
+        EXPECT_TRUE(TypeOf(call)->Is<type::F16>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -562,7 +562,7 @@
         EXPECT_TRUE(TypeOf(call)->is_float_vector());
         EXPECT_EQ(TypeOf(call)->As<sem::Vector>()->Width(), 3u);
         ASSERT_NE(TypeOf(call)->As<sem::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::F16>());
+        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<type::F16>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -585,7 +585,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<sem::F16>());
+        EXPECT_TRUE(TypeOf(call)->Is<type::F16>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -612,7 +612,7 @@
         EXPECT_TRUE(TypeOf(call)->is_float_vector());
         EXPECT_EQ(TypeOf(call)->As<sem::Vector>()->Width(), 3u);
         ASSERT_NE(TypeOf(call)->As<sem::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::F16>());
+        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<type::F16>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -636,7 +636,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<sem::F16>());
+        EXPECT_TRUE(TypeOf(call)->Is<type::F16>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -663,7 +663,7 @@
         EXPECT_TRUE(TypeOf(call)->is_float_vector());
         EXPECT_EQ(TypeOf(call)->As<sem::Vector>()->Width(), 3u);
         ASSERT_NE(TypeOf(call)->As<sem::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::F16>());
+        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<type::F16>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -739,7 +739,7 @@
     ASSERT_NE(TypeOf(call), nullptr);
     EXPECT_TRUE(TypeOf(call)->is_float_vector());
     EXPECT_EQ(TypeOf(call)->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<type::F32>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Cross_f16) {
@@ -753,7 +753,7 @@
     ASSERT_NE(TypeOf(call), nullptr);
     EXPECT_TRUE(TypeOf(call)->is_float_vector());
     EXPECT_EQ(TypeOf(call)->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<type::F16>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Cross_Error_NoArgs) {
@@ -835,7 +835,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Distance_Scalar_f16) {
@@ -847,7 +847,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(call)->Is<type::F16>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Distance_Vector_f32) {
@@ -857,7 +857,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Distance_Vector_f16) {
@@ -869,7 +869,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(call)->Is<type::F16>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Distance_TooManyParams) {
@@ -929,14 +929,14 @@
     ASSERT_EQ(ty->Members().Length(), 2u);
 
     auto* fract = ty->Members()[0];
-    EXPECT_TRUE(fract->Type()->Is<sem::F32>());
+    EXPECT_TRUE(fract->Type()->Is<type::F32>());
     EXPECT_EQ(fract->Offset(), 0u);
     EXPECT_EQ(fract->Size(), 4u);
     EXPECT_EQ(fract->Align(), 4u);
     EXPECT_EQ(fract->Name(), Sym("fract"));
 
     auto* exp = ty->Members()[1];
-    EXPECT_TRUE(exp->Type()->Is<sem::I32>());
+    EXPECT_TRUE(exp->Type()->Is<type::I32>());
     EXPECT_EQ(exp->Offset(), 4u);
     EXPECT_EQ(exp->Size(), 4u);
     EXPECT_EQ(exp->Align(), 4u);
@@ -960,14 +960,14 @@
     ASSERT_EQ(ty->Members().Length(), 2u);
 
     auto* fract = ty->Members()[0];
-    EXPECT_TRUE(fract->Type()->Is<sem::F16>());
+    EXPECT_TRUE(fract->Type()->Is<type::F16>());
     EXPECT_EQ(fract->Offset(), 0u);
     EXPECT_EQ(fract->Size(), 2u);
     EXPECT_EQ(fract->Align(), 2u);
     EXPECT_EQ(fract->Name(), Sym("fract"));
 
     auto* exp = ty->Members()[1];
-    EXPECT_TRUE(exp->Type()->Is<sem::I32>());
+    EXPECT_TRUE(exp->Type()->Is<type::I32>());
     EXPECT_EQ(exp->Offset(), 4u);
     EXPECT_EQ(exp->Size(), 4u);
     EXPECT_EQ(exp->Align(), 4u);
@@ -991,7 +991,7 @@
     auto* fract = ty->Members()[0];
     ASSERT_TRUE(fract->Type()->Is<sem::Vector>());
     EXPECT_EQ(fract->Type()->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(fract->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(fract->Type()->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(fract->Offset(), 0u);
     EXPECT_EQ(fract->Size(), 12u);
     EXPECT_EQ(fract->Align(), 16u);
@@ -1000,7 +1000,7 @@
     auto* exp = ty->Members()[1];
     ASSERT_TRUE(exp->Type()->Is<sem::Vector>());
     EXPECT_EQ(exp->Type()->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(exp->Type()->As<sem::Vector>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(exp->Type()->As<sem::Vector>()->type()->Is<type::I32>());
     EXPECT_EQ(exp->Offset(), 16u);
     EXPECT_EQ(exp->Size(), 12u);
     EXPECT_EQ(exp->Align(), 16u);
@@ -1026,7 +1026,7 @@
     auto* fract = ty->Members()[0];
     ASSERT_TRUE(fract->Type()->Is<sem::Vector>());
     EXPECT_EQ(fract->Type()->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(fract->Type()->As<sem::Vector>()->type()->Is<sem::F16>());
+    EXPECT_TRUE(fract->Type()->As<sem::Vector>()->type()->Is<type::F16>());
     EXPECT_EQ(fract->Offset(), 0u);
     EXPECT_EQ(fract->Size(), 6u);
     EXPECT_EQ(fract->Align(), 8u);
@@ -1035,7 +1035,7 @@
     auto* exp = ty->Members()[1];
     ASSERT_TRUE(exp->Type()->Is<sem::Vector>());
     EXPECT_EQ(exp->Type()->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(exp->Type()->As<sem::Vector>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(exp->Type()->As<sem::Vector>()->type()->Is<type::I32>());
     EXPECT_EQ(exp->Offset(), 16u);
     EXPECT_EQ(exp->Size(), 12u);
     EXPECT_EQ(exp->Align(), 16u);
@@ -1092,7 +1092,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Length_Scalar_f16) {
@@ -1104,7 +1104,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(call)->Is<type::F16>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Length_FloatVector_f32) {
@@ -1114,7 +1114,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Length_FloatVector_f16) {
@@ -1126,7 +1126,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(call)->Is<type::F16>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Length_NoParams) {
@@ -1169,7 +1169,7 @@
     EXPECT_TRUE(TypeOf(call)->is_float_vector());
     EXPECT_EQ(TypeOf(call)->As<sem::Vector>()->Width(), 3u);
     ASSERT_NE(TypeOf(call)->As<sem::Vector>()->type(), nullptr);
-    EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<type::F32>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Mix_VectorScalar_f16) {
@@ -1184,7 +1184,7 @@
     EXPECT_TRUE(TypeOf(call)->is_float_vector());
     EXPECT_EQ(TypeOf(call)->As<sem::Vector>()->Width(), 3u);
     ASSERT_NE(TypeOf(call)->As<sem::Vector>()->type(), nullptr);
-    EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<type::F16>());
 }
 
 // modf: (f32) -> __modf_result, (vecN<f32>) -> __modf_result_vecN, (f16) -> __modf_result_f16,
@@ -1201,14 +1201,14 @@
     ASSERT_EQ(ty->Members().Length(), 2u);
 
     auto* fract = ty->Members()[0];
-    EXPECT_TRUE(fract->Type()->Is<sem::F32>());
+    EXPECT_TRUE(fract->Type()->Is<type::F32>());
     EXPECT_EQ(fract->Offset(), 0u);
     EXPECT_EQ(fract->Size(), 4u);
     EXPECT_EQ(fract->Align(), 4u);
     EXPECT_EQ(fract->Name(), Sym("fract"));
 
     auto* whole = ty->Members()[1];
-    EXPECT_TRUE(whole->Type()->Is<sem::F32>());
+    EXPECT_TRUE(whole->Type()->Is<type::F32>());
     EXPECT_EQ(whole->Offset(), 4u);
     EXPECT_EQ(whole->Size(), 4u);
     EXPECT_EQ(whole->Align(), 4u);
@@ -1232,14 +1232,14 @@
     ASSERT_EQ(ty->Members().Length(), 2u);
 
     auto* fract = ty->Members()[0];
-    EXPECT_TRUE(fract->Type()->Is<sem::F16>());
+    EXPECT_TRUE(fract->Type()->Is<type::F16>());
     EXPECT_EQ(fract->Offset(), 0u);
     EXPECT_EQ(fract->Size(), 2u);
     EXPECT_EQ(fract->Align(), 2u);
     EXPECT_EQ(fract->Name(), Sym("fract"));
 
     auto* whole = ty->Members()[1];
-    EXPECT_TRUE(whole->Type()->Is<sem::F16>());
+    EXPECT_TRUE(whole->Type()->Is<type::F16>());
     EXPECT_EQ(whole->Offset(), 2u);
     EXPECT_EQ(whole->Size(), 2u);
     EXPECT_EQ(whole->Align(), 2u);
@@ -1263,7 +1263,7 @@
     auto* fract = ty->Members()[0];
     ASSERT_TRUE(fract->Type()->Is<sem::Vector>());
     EXPECT_EQ(fract->Type()->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(fract->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(fract->Type()->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(fract->Offset(), 0u);
     EXPECT_EQ(fract->Size(), 12u);
     EXPECT_EQ(fract->Align(), 16u);
@@ -1272,7 +1272,7 @@
     auto* whole = ty->Members()[1];
     ASSERT_TRUE(whole->Type()->Is<sem::Vector>());
     EXPECT_EQ(whole->Type()->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(whole->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(whole->Type()->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(whole->Offset(), 16u);
     EXPECT_EQ(whole->Size(), 12u);
     EXPECT_EQ(whole->Align(), 16u);
@@ -1298,7 +1298,7 @@
     auto* fract = ty->Members()[0];
     ASSERT_TRUE(fract->Type()->Is<sem::Vector>());
     EXPECT_EQ(fract->Type()->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(fract->Type()->As<sem::Vector>()->type()->Is<sem::F16>());
+    EXPECT_TRUE(fract->Type()->As<sem::Vector>()->type()->Is<type::F16>());
     EXPECT_EQ(fract->Offset(), 0u);
     EXPECT_EQ(fract->Size(), 6u);
     EXPECT_EQ(fract->Align(), 8u);
@@ -1307,7 +1307,7 @@
     auto* whole = ty->Members()[1];
     ASSERT_TRUE(whole->Type()->Is<sem::Vector>());
     EXPECT_EQ(whole->Type()->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(whole->Type()->As<sem::Vector>()->type()->Is<sem::F16>());
+    EXPECT_TRUE(whole->Type()->As<sem::Vector>()->type()->Is<type::F16>());
     EXPECT_EQ(whole->Offset(), 8u);
     EXPECT_EQ(whole->Size(), 6u);
     EXPECT_EQ(whole->Align(), 8u);
@@ -1389,7 +1389,7 @@
     ASSERT_NE(TypeOf(call), nullptr);
     EXPECT_TRUE(TypeOf(call)->is_float_vector());
     EXPECT_EQ(TypeOf(call)->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<type::F32>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Normalize_Vector_f16) {
@@ -1403,7 +1403,7 @@
     ASSERT_NE(TypeOf(call), nullptr);
     EXPECT_TRUE(TypeOf(call)->is_float_vector());
     EXPECT_EQ(TypeOf(call)->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<type::F16>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Normalize_Error_NoParams) {
@@ -1464,7 +1464,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<sem::I32>());
+        EXPECT_TRUE(TypeOf(call)->Is<type::I32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1488,7 +1488,7 @@
         EXPECT_TRUE(TypeOf(call)->is_signed_integer_vector());
         EXPECT_EQ(TypeOf(call)->As<sem::Vector>()->Width(), 3u);
         ASSERT_NE(TypeOf(call)->As<sem::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::I32>());
+        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<type::I32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1509,7 +1509,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<sem::U32>());
+        EXPECT_TRUE(TypeOf(call)->Is<type::U32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1533,7 +1533,7 @@
         EXPECT_TRUE(TypeOf(call)->is_unsigned_integer_vector());
         EXPECT_EQ(TypeOf(call)->As<sem::Vector>()->Width(), 3u);
         ASSERT_NE(TypeOf(call)->As<sem::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::U32>());
+        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<type::U32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1554,7 +1554,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<sem::I32>());
+        EXPECT_TRUE(TypeOf(call)->Is<type::I32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1578,7 +1578,7 @@
         EXPECT_TRUE(TypeOf(call)->is_signed_integer_vector());
         EXPECT_EQ(TypeOf(call)->As<sem::Vector>()->Width(), 3u);
         ASSERT_NE(TypeOf(call)->As<sem::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::I32>());
+        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<type::I32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1599,7 +1599,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<sem::U32>());
+        EXPECT_TRUE(TypeOf(call)->Is<type::U32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1623,7 +1623,7 @@
         EXPECT_TRUE(TypeOf(call)->is_unsigned_integer_vector());
         EXPECT_EQ(TypeOf(call)->As<sem::Vector>()->Width(), 3u);
         ASSERT_NE(TypeOf(call)->As<sem::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::U32>());
+        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<type::U32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1644,7 +1644,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<sem::I32>());
+        EXPECT_TRUE(TypeOf(call)->Is<type::I32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1669,7 +1669,7 @@
         EXPECT_TRUE(TypeOf(call)->is_signed_integer_vector());
         EXPECT_EQ(TypeOf(call)->As<sem::Vector>()->Width(), 3u);
         ASSERT_NE(TypeOf(call)->As<sem::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::I32>());
+        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<type::I32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1691,7 +1691,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<sem::U32>());
+        EXPECT_TRUE(TypeOf(call)->Is<type::U32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1716,7 +1716,7 @@
         EXPECT_TRUE(TypeOf(call)->is_unsigned_integer_vector());
         EXPECT_EQ(TypeOf(call)->As<sem::Vector>()->Width(), 3u);
         ASSERT_NE(TypeOf(call)->As<sem::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::U32>());
+        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<type::U32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1738,7 +1738,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<sem::I32>());
+        EXPECT_TRUE(TypeOf(call)->Is<type::I32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1763,7 +1763,7 @@
         EXPECT_TRUE(TypeOf(call)->is_signed_integer_vector());
         EXPECT_EQ(TypeOf(call)->As<sem::Vector>()->Width(), 3u);
         ASSERT_NE(TypeOf(call)->As<sem::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::I32>());
+        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<type::I32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1785,7 +1785,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<sem::U32>());
+        EXPECT_TRUE(TypeOf(call)->Is<type::U32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1810,7 +1810,7 @@
         EXPECT_TRUE(TypeOf(call)->is_unsigned_integer_vector());
         EXPECT_EQ(TypeOf(call)->As<sem::Vector>()->Width(), 3u);
         ASSERT_NE(TypeOf(call)->As<sem::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::U32>());
+        EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<type::U32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1852,7 +1852,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
 }
 
 TEST_F(ResolverBuiltinTest, Determinant_2x2_f16) {
@@ -1866,7 +1866,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(call)->Is<type::F16>());
 }
 
 TEST_F(ResolverBuiltinTest, Determinant_3x3_f32) {
@@ -1878,7 +1878,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
 }
 
 TEST_F(ResolverBuiltinTest, Determinant_3x3_f16) {
@@ -1892,7 +1892,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(call)->Is<type::F16>());
 }
 
 TEST_F(ResolverBuiltinTest, Determinant_4x4_f32) {
@@ -1904,7 +1904,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
 }
 
 TEST_F(ResolverBuiltinTest, Determinant_4x4_f16) {
@@ -1918,7 +1918,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(call)->Is<type::F16>());
 }
 
 TEST_F(ResolverBuiltinTest, Determinant_NotSquare) {
@@ -1965,7 +1965,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    EXPECT_TRUE(TypeOf(expr)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(expr)->Is<type::F32>());
 }
 
 TEST_F(ResolverBuiltinTest, Dot_Vec2_f16) {
@@ -1979,7 +1979,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    EXPECT_TRUE(TypeOf(expr)->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(expr)->Is<type::F16>());
 }
 
 TEST_F(ResolverBuiltinTest, Dot_Vec3_i32) {
@@ -1991,7 +1991,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    EXPECT_TRUE(TypeOf(expr)->Is<sem::I32>());
+    EXPECT_TRUE(TypeOf(expr)->Is<type::I32>());
 }
 
 TEST_F(ResolverBuiltinTest, Dot_Vec4_u32) {
@@ -2003,7 +2003,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    EXPECT_TRUE(TypeOf(expr)->Is<sem::U32>());
+    EXPECT_TRUE(TypeOf(expr)->Is<type::U32>());
 }
 
 TEST_F(ResolverBuiltinTest, Dot_Error_Scalar) {
@@ -2039,7 +2039,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    ASSERT_TRUE(TypeOf(expr)->Is<sem::F32>());
+    ASSERT_TRUE(TypeOf(expr)->Is<type::F32>());
 }
 
 TEST_P(ResolverBuiltinDerivativeTest, Vector) {
@@ -2054,7 +2054,7 @@
 
     ASSERT_NE(TypeOf(expr), nullptr);
     ASSERT_TRUE(TypeOf(expr)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(expr)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(expr)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(expr)->As<sem::Vector>()->Width(), 4u);
 }
 
@@ -2182,11 +2182,11 @@
     ASSERT_NE(TypeOf(expr), nullptr);
     ASSERT_TRUE(TypeOf(expr)->Is<sem::Vector>());
     if (type == Texture::kF32) {
-        EXPECT_TRUE(TypeOf(expr)->As<sem::Vector>()->type()->Is<sem::F32>());
+        EXPECT_TRUE(TypeOf(expr)->As<sem::Vector>()->type()->Is<type::F32>());
     } else if (type == Texture::kI32) {
-        EXPECT_TRUE(TypeOf(expr)->As<sem::Vector>()->type()->Is<sem::I32>());
+        EXPECT_TRUE(TypeOf(expr)->As<sem::Vector>()->type()->Is<type::I32>());
     } else {
-        EXPECT_TRUE(TypeOf(expr)->As<sem::Vector>()->type()->Is<sem::U32>());
+        EXPECT_TRUE(TypeOf(expr)->As<sem::Vector>()->type()->Is<type::U32>());
     }
     EXPECT_EQ(TypeOf(expr)->As<sem::Vector>()->Width(), 4u);
 }
@@ -2470,7 +2470,7 @@
             default:
                 FAIL() << "invalid texture dimensions: " << param.texture_dimension;
             case ast::TextureDimension::k1d:
-                EXPECT_TRUE(TypeOf(call)->Is<sem::U32>());
+                EXPECT_TRUE(TypeOf(call)->Is<type::U32>());
                 break;
             case ast::TextureDimension::k2d:
             case ast::TextureDimension::k2dArray:
@@ -2479,45 +2479,45 @@
                 auto* vec = As<sem::Vector>(TypeOf(call));
                 ASSERT_NE(vec, nullptr);
                 EXPECT_EQ(vec->Width(), 2u);
-                EXPECT_TRUE(vec->type()->Is<sem::U32>());
+                EXPECT_TRUE(vec->type()->Is<type::U32>());
                 break;
             }
             case ast::TextureDimension::k3d: {
                 auto* vec = As<sem::Vector>(TypeOf(call));
                 ASSERT_NE(vec, nullptr);
                 EXPECT_EQ(vec->Width(), 3u);
-                EXPECT_TRUE(vec->type()->Is<sem::U32>());
+                EXPECT_TRUE(vec->type()->Is<type::U32>());
                 break;
             }
         }
     } else if (std::string(param.function) == "textureNumLayers") {
-        EXPECT_TRUE(TypeOf(call)->Is<sem::U32>());
+        EXPECT_TRUE(TypeOf(call)->Is<type::U32>());
     } else if (std::string(param.function) == "textureNumLevels") {
-        EXPECT_TRUE(TypeOf(call)->Is<sem::U32>());
+        EXPECT_TRUE(TypeOf(call)->Is<type::U32>());
     } else if (std::string(param.function) == "textureNumSamples") {
-        EXPECT_TRUE(TypeOf(call)->Is<sem::U32>());
+        EXPECT_TRUE(TypeOf(call)->Is<type::U32>());
     } else if (std::string(param.function) == "textureStore") {
-        EXPECT_TRUE(TypeOf(call)->Is<sem::Void>());
+        EXPECT_TRUE(TypeOf(call)->Is<type::Void>());
     } else if (std::string(param.function) == "textureGather") {
         auto* vec = As<sem::Vector>(TypeOf(call));
         ASSERT_NE(vec, nullptr);
         EXPECT_EQ(vec->Width(), 4u);
         switch (param.texture_data_type) {
             case ast::builtin::test::TextureDataType::kF32:
-                EXPECT_TRUE(vec->type()->Is<sem::F32>());
+                EXPECT_TRUE(vec->type()->Is<type::F32>());
                 break;
             case ast::builtin::test::TextureDataType::kU32:
-                EXPECT_TRUE(vec->type()->Is<sem::U32>());
+                EXPECT_TRUE(vec->type()->Is<type::U32>());
                 break;
             case ast::builtin::test::TextureDataType::kI32:
-                EXPECT_TRUE(vec->type()->Is<sem::I32>());
+                EXPECT_TRUE(vec->type()->Is<type::I32>());
                 break;
         }
     } else if (std::string(param.function) == "textureGatherCompare") {
         auto* vec = As<sem::Vector>(TypeOf(call));
         ASSERT_NE(vec, nullptr);
         EXPECT_EQ(vec->Width(), 4u);
-        EXPECT_TRUE(vec->type()->Is<sem::F32>());
+        EXPECT_TRUE(vec->type()->Is<type::F32>());
     } else {
         switch (param.texture_kind) {
             case ast::builtin::test::TextureKind::kRegular:
@@ -2527,20 +2527,20 @@
                 ASSERT_NE(vec, nullptr);
                 switch (param.texture_data_type) {
                     case ast::builtin::test::TextureDataType::kF32:
-                        EXPECT_TRUE(vec->type()->Is<sem::F32>());
+                        EXPECT_TRUE(vec->type()->Is<type::F32>());
                         break;
                     case ast::builtin::test::TextureDataType::kU32:
-                        EXPECT_TRUE(vec->type()->Is<sem::U32>());
+                        EXPECT_TRUE(vec->type()->Is<type::U32>());
                         break;
                     case ast::builtin::test::TextureDataType::kI32:
-                        EXPECT_TRUE(vec->type()->Is<sem::I32>());
+                        EXPECT_TRUE(vec->type()->Is<type::I32>());
                         break;
                 }
                 break;
             }
             case ast::builtin::test::TextureKind::kDepth:
             case ast::builtin::test::TextureKind::kDepthMultisampled: {
-                EXPECT_TRUE(TypeOf(call)->Is<sem::F32>());
+                EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
                 break;
             }
         }
@@ -2574,7 +2574,7 @@
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<sem::U32>());
+    EXPECT_TRUE(TypeOf(call)->Is<type::U32>());
 }
 
 TEST_P(ResolverBuiltinTest_DataPacking, Error_IncorrectParamType) {
@@ -2675,7 +2675,7 @@
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<sem::Void>());
+    EXPECT_TRUE(TypeOf(call)->Is<type::Void>());
 }
 
 TEST_P(ResolverBuiltinTest_Barrier, Error_TooManyParams) {
diff --git a/src/tint/resolver/builtins_validation_test.cc b/src/tint/resolver/builtins_validation_test.cc
index d60b5b1..9616627 100644
--- a/src/tint/resolver/builtins_validation_test.cc
+++ b/src/tint/resolver/builtins_validation_test.cc
@@ -894,8 +894,8 @@
     ASSERT_TRUE(res_ty != nullptr);
     auto members = res_ty->Members();
     ASSERT_EQ(members.Length(), 2u);
-    EXPECT_TRUE(members[0]->Type()->Is<sem::F32>());
-    EXPECT_TRUE(members[1]->Type()->Is<sem::I32>());
+    EXPECT_TRUE(members[0]->Type()->Is<type::F32>());
+    EXPECT_TRUE(members[1]->Type()->Is<type::I32>());
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Frexp_Vec2) {
@@ -910,9 +910,9 @@
     ASSERT_TRUE(members[0]->Type()->Is<sem::Vector>());
     ASSERT_TRUE(members[1]->Type()->Is<sem::Vector>());
     EXPECT_EQ(members[0]->Type()->As<sem::Vector>()->Width(), 2u);
-    EXPECT_TRUE(members[0]->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(members[0]->Type()->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(members[1]->Type()->As<sem::Vector>()->Width(), 2u);
-    EXPECT_TRUE(members[1]->Type()->As<sem::Vector>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(members[1]->Type()->As<sem::Vector>()->type()->Is<type::I32>());
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Frexp_Vec3) {
@@ -927,9 +927,9 @@
     ASSERT_TRUE(members[0]->Type()->Is<sem::Vector>());
     ASSERT_TRUE(members[1]->Type()->Is<sem::Vector>());
     EXPECT_EQ(members[0]->Type()->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(members[0]->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(members[0]->Type()->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(members[1]->Type()->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(members[1]->Type()->As<sem::Vector>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(members[1]->Type()->As<sem::Vector>()->type()->Is<type::I32>());
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Frexp_Vec4) {
@@ -944,9 +944,9 @@
     ASSERT_TRUE(members[0]->Type()->Is<sem::Vector>());
     ASSERT_TRUE(members[1]->Type()->Is<sem::Vector>());
     EXPECT_EQ(members[0]->Type()->As<sem::Vector>()->Width(), 4u);
-    EXPECT_TRUE(members[0]->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(members[0]->Type()->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(members[1]->Type()->As<sem::Vector>()->Width(), 4u);
-    EXPECT_TRUE(members[1]->Type()->As<sem::Vector>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(members[1]->Type()->As<sem::Vector>()->type()->Is<type::I32>());
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Modf_Scalar) {
@@ -958,8 +958,8 @@
     ASSERT_TRUE(res_ty != nullptr);
     auto members = res_ty->Members();
     ASSERT_EQ(members.Length(), 2u);
-    EXPECT_TRUE(members[0]->Type()->Is<sem::F32>());
-    EXPECT_TRUE(members[1]->Type()->Is<sem::F32>());
+    EXPECT_TRUE(members[0]->Type()->Is<type::F32>());
+    EXPECT_TRUE(members[1]->Type()->Is<type::F32>());
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Modf_Vec2) {
@@ -974,9 +974,9 @@
     ASSERT_TRUE(members[0]->Type()->Is<sem::Vector>());
     ASSERT_TRUE(members[1]->Type()->Is<sem::Vector>());
     EXPECT_EQ(members[0]->Type()->As<sem::Vector>()->Width(), 2u);
-    EXPECT_TRUE(members[0]->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(members[0]->Type()->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(members[1]->Type()->As<sem::Vector>()->Width(), 2u);
-    EXPECT_TRUE(members[1]->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(members[1]->Type()->As<sem::Vector>()->type()->Is<type::F32>());
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Modf_Vec3) {
@@ -991,9 +991,9 @@
     ASSERT_TRUE(members[0]->Type()->Is<sem::Vector>());
     ASSERT_TRUE(members[1]->Type()->Is<sem::Vector>());
     EXPECT_EQ(members[0]->Type()->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(members[0]->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(members[0]->Type()->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(members[1]->Type()->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(members[1]->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(members[1]->Type()->As<sem::Vector>()->type()->Is<type::F32>());
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Modf_Vec4) {
@@ -1008,9 +1008,9 @@
     ASSERT_TRUE(members[0]->Type()->Is<sem::Vector>());
     ASSERT_TRUE(members[1]->Type()->Is<sem::Vector>());
     EXPECT_EQ(members[0]->Type()->As<sem::Vector>()->Width(), 4u);
-    EXPECT_TRUE(members[0]->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(members[0]->Type()->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(members[1]->Type()->As<sem::Vector>()->Width(), 4u);
-    EXPECT_TRUE(members[1]->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(members[1]->Type()->As<sem::Vector>()->type()->Is<type::F32>());
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Cross_Float_Vec3) {
@@ -1111,7 +1111,7 @@
          });
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
-    EXPECT_TRUE(TypeOf(builtin)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(builtin)->Is<type::F32>());
 }
 
 TEST_P(FloatAllMatching, Vec2) {
@@ -1235,7 +1235,7 @@
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
-    EXPECT_TRUE(TypeOf(builtin)->Is<sem::U32>());
+    EXPECT_TRUE(TypeOf(builtin)->Is<type::U32>());
 }
 
 TEST_P(IntegerAllMatching, Vec2Unsigned) {
@@ -1295,7 +1295,7 @@
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
-    EXPECT_TRUE(TypeOf(builtin)->Is<sem::I32>());
+    EXPECT_TRUE(TypeOf(builtin)->Is<type::I32>());
 }
 
 TEST_P(IntegerAllMatching, Vec2Signed) {
diff --git a/src/tint/resolver/const_eval.cc b/src/tint/resolver/const_eval.cc
index c94e898..682e0a3 100644
--- a/src/tint/resolver/const_eval.cc
+++ b/src/tint/resolver/const_eval.cc
@@ -24,18 +24,18 @@
 
 #include "src/tint/program_builder.h"
 #include "src/tint/sem/array.h"
-#include "src/tint/sem/bool.h"
 #include "src/tint/sem/constant.h"
-#include "src/tint/sem/f16.h"
-#include "src/tint/sem/f32.h"
-#include "src/tint/sem/i32.h"
 #include "src/tint/sem/matrix.h"
 #include "src/tint/sem/member_accessor_expression.h"
 #include "src/tint/sem/type_initializer.h"
-#include "src/tint/sem/u32.h"
 #include "src/tint/sem/vector.h"
 #include "src/tint/type/abstract_float.h"
 #include "src/tint/type/abstract_int.h"
+#include "src/tint/type/bool.h"
+#include "src/tint/type/f16.h"
+#include "src/tint/type/f32.h"
+#include "src/tint/type/i32.h"
+#include "src/tint/type/u32.h"
 #include "src/tint/utils/bitcast.h"
 #include "src/tint/utils/compiler_macros.h"
 #include "src/tint/utils/map.h"
@@ -59,8 +59,8 @@
 auto Dispatch_iu32(F&& f, CONSTANTS&&... cs) {
     return Switch(
         First(cs...)->Type(),  //
-        [&](const sem::I32*) { return f(cs->template As<i32>()...); },
-        [&](const sem::U32*) { return f(cs->template As<u32>()...); });
+        [&](const type::I32*) { return f(cs->template As<i32>()...); },
+        [&](const type::U32*) { return f(cs->template As<u32>()...); });
 }
 
 /// Helper that calls `f` passing in the value of all `cs`.
@@ -70,8 +70,8 @@
     return Switch(
         First(cs...)->Type(),  //
         [&](const type::AbstractInt*) { return f(cs->template As<AInt>()...); },
-        [&](const sem::I32*) { return f(cs->template As<i32>()...); },
-        [&](const sem::U32*) { return f(cs->template As<u32>()...); });
+        [&](const type::I32*) { return f(cs->template As<i32>()...); },
+        [&](const type::U32*) { return f(cs->template As<u32>()...); });
 }
 
 /// Helper that calls `f` passing in the value of all `cs`.
@@ -81,9 +81,9 @@
     return Switch(
         First(cs...)->Type(),  //
         [&](const type::AbstractInt*) { return f(cs->template As<AInt>()...); },
-        [&](const sem::I32*) { return f(cs->template As<i32>()...); },
-        [&](const sem::U32*) { return f(cs->template As<u32>()...); },
-        [&](const sem::Bool*) { return f(cs->template As<bool>()...); });
+        [&](const type::I32*) { return f(cs->template As<i32>()...); },
+        [&](const type::U32*) { return f(cs->template As<u32>()...); },
+        [&](const type::Bool*) { return f(cs->template As<bool>()...); });
 }
 
 /// Helper that calls `f` passing in the value of all `cs`.
@@ -94,9 +94,9 @@
         First(cs...)->Type(),  //
         [&](const type::AbstractInt*) { return f(cs->template As<AInt>()...); },
         [&](const type::AbstractFloat*) { return f(cs->template As<AFloat>()...); },
-        [&](const sem::F32*) { return f(cs->template As<f32>()...); },
-        [&](const sem::I32*) { return f(cs->template As<i32>()...); },
-        [&](const sem::F16*) { return f(cs->template As<f16>()...); });
+        [&](const type::F32*) { return f(cs->template As<f32>()...); },
+        [&](const type::I32*) { return f(cs->template As<i32>()...); },
+        [&](const type::F16*) { return f(cs->template As<f16>()...); });
 }
 
 /// Helper that calls `f` passing in the value of all `cs`.
@@ -107,10 +107,10 @@
         First(cs...)->Type(),  //
         [&](const type::AbstractInt*) { return f(cs->template As<AInt>()...); },
         [&](const type::AbstractFloat*) { return f(cs->template As<AFloat>()...); },
-        [&](const sem::F32*) { return f(cs->template As<f32>()...); },
-        [&](const sem::I32*) { return f(cs->template As<i32>()...); },
-        [&](const sem::U32*) { return f(cs->template As<u32>()...); },
-        [&](const sem::F16*) { return f(cs->template As<f16>()...); });
+        [&](const type::F32*) { return f(cs->template As<f32>()...); },
+        [&](const type::I32*) { return f(cs->template As<i32>()...); },
+        [&](const type::U32*) { return f(cs->template As<u32>()...); },
+        [&](const type::F16*) { return f(cs->template As<f16>()...); });
 }
 
 /// Helper that calls `f` passing in the value of all `cs`.
@@ -121,11 +121,11 @@
         First(cs...)->Type(),  //
         [&](const type::AbstractInt*) { return f(cs->template As<AInt>()...); },
         [&](const type::AbstractFloat*) { return f(cs->template As<AFloat>()...); },
-        [&](const sem::F32*) { return f(cs->template As<f32>()...); },
-        [&](const sem::I32*) { return f(cs->template As<i32>()...); },
-        [&](const sem::U32*) { return f(cs->template As<u32>()...); },
-        [&](const sem::F16*) { return f(cs->template As<f16>()...); },
-        [&](const sem::Bool*) { return f(cs->template As<bool>()...); });
+        [&](const type::F32*) { return f(cs->template As<f32>()...); },
+        [&](const type::I32*) { return f(cs->template As<i32>()...); },
+        [&](const type::U32*) { return f(cs->template As<u32>()...); },
+        [&](const type::F16*) { return f(cs->template As<f16>()...); },
+        [&](const type::Bool*) { return f(cs->template As<bool>()...); });
 }
 
 /// Helper that calls `f` passing in the value of all `cs`.
@@ -135,8 +135,8 @@
     return Switch(
         First(cs...)->Type(),  //
         [&](const type::AbstractFloat*) { return f(cs->template As<AFloat>()...); },
-        [&](const sem::F32*) { return f(cs->template As<f32>()...); },
-        [&](const sem::F16*) { return f(cs->template As<f16>()...); });
+        [&](const type::F32*) { return f(cs->template As<f32>()...); },
+        [&](const type::F16*) { return f(cs->template As<f16>()...); });
 }
 
 /// Helper that calls `f` passing in the value of all `cs`.
@@ -148,7 +148,7 @@
 
 /// ZeroTypeDispatch is a helper for calling the function `f`, passing a single zero-value argument
 /// of the C++ type that corresponds to the type::Type `type`. For example, calling
-/// `ZeroTypeDispatch()` with a type of `sem::I32*` will call the function f with a single argument
+/// `ZeroTypeDispatch()` with a type of `type::I32*` will call the function f with a single argument
 /// of `i32(0)`.
 /// @returns the value returned by calling `f`.
 /// @note `type` must be a scalar or abstract numeric type. Other types will not call `f`, and will
@@ -159,11 +159,11 @@
         type,                                                      //
         [&](const type::AbstractInt*) { return f(AInt(0)); },      //
         [&](const type::AbstractFloat*) { return f(AFloat(0)); },  //
-        [&](const sem::I32*) { return f(i32(0)); },                //
-        [&](const sem::U32*) { return f(u32(0)); },                //
-        [&](const sem::F32*) { return f(f32(0)); },                //
-        [&](const sem::F16*) { return f(f16(0)); },                //
-        [&](const sem::Bool*) { return f(static_cast<bool>(0)); });
+        [&](const type::I32*) { return f(i32(0)); },               //
+        [&](const type::U32*) { return f(u32(0)); },               //
+        [&](const type::F32*) { return f(f32(0)); },               //
+        [&](const type::F16*) { return f(f16(0)); },               //
+        [&](const type::Bool*) { return f(static_cast<bool>(0)); });
 }
 
 /// @returns `value` if `T` is not a Number, otherwise ValueOf returns the inner value of the
@@ -1954,7 +1954,7 @@
         return Dispatch_ia_iu32(create, c0, c1);
     };
 
-    if (!type::Type::DeepestElementOf(args[1]->Type())->Is<sem::U32>()) {
+    if (!type::Type::DeepestElementOf(args[1]->Type())->Is<type::U32>()) {
         TINT_ICE(Resolver, builder.Diagnostics())
             << "Element type of rhs of ShiftLeft must be a u32";
         return utils::Failure;
@@ -2019,7 +2019,7 @@
         return Dispatch_ia_iu32(create, c0, c1);
     };
 
-    if (!type::Type::DeepestElementOf(args[1]->Type())->Is<sem::U32>()) {
+    if (!type::Type::DeepestElementOf(args[1]->Type())->Is<type::U32>()) {
         TINT_ICE(Resolver, builder.Diagnostics())
             << "Element type of rhs of ShiftLeft must be a u32";
         return utils::Failure;
@@ -2647,16 +2647,16 @@
         double fract = std::frexp(s->As<AFloat>(), &exp);
         return Switch(
             s->Type(),
-            [&](const sem::F32*) {
+            [&](const type::F32*) {
                 return FractExp{
-                    CreateElement(builder, source, builder.create<sem::F32>(), f32(fract)),
-                    CreateElement(builder, source, builder.create<sem::I32>(), i32(exp)),
+                    CreateElement(builder, source, builder.create<type::F32>(), f32(fract)),
+                    CreateElement(builder, source, builder.create<type::I32>(), i32(exp)),
                 };
             },
-            [&](const sem::F16*) {
+            [&](const type::F16*) {
                 return FractExp{
-                    CreateElement(builder, source, builder.create<sem::F16>(), f16(fract)),
-                    CreateElement(builder, source, builder.create<sem::I32>(), i32(exp)),
+                    CreateElement(builder, source, builder.create<type::F16>(), f16(fract)),
+                    CreateElement(builder, source, builder.create<type::I32>(), i32(exp)),
                 };
             },
             [&](const type::AbstractFloat*) {
diff --git a/src/tint/resolver/const_eval_construction_test.cc b/src/tint/resolver/const_eval_construction_test.cc
index fe323c2..bf9cb62 100644
--- a/src/tint/resolver/const_eval_construction_test.cc
+++ b/src/tint/resolver/const_eval_construction_test.cc
@@ -27,7 +27,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    EXPECT_TRUE(sem->Type()->Is<sem::I32>());
+    EXPECT_TRUE(sem->Type()->Is<type::I32>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -43,7 +43,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    EXPECT_TRUE(sem->Type()->Is<sem::U32>());
+    EXPECT_TRUE(sem->Type()->Is<type::U32>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -59,7 +59,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    EXPECT_TRUE(sem->Type()->Is<sem::F32>());
+    EXPECT_TRUE(sem->Type()->Is<type::F32>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -77,7 +77,7 @@
 
     auto* sem = Sem().Get(expr);
     EXPECT_NE(sem, nullptr);
-    EXPECT_TRUE(sem->Type()->Is<sem::F16>());
+    EXPECT_TRUE(sem->Type()->Is<type::F16>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -94,7 +94,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    EXPECT_TRUE(sem->Type()->Is<sem::Bool>());
+    EXPECT_TRUE(sem->Type()->Is<type::Bool>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -112,7 +112,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::I32>());
+    EXPECT_TRUE(vec->type()->Is<type::I32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
@@ -145,7 +145,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::U32>());
+    EXPECT_TRUE(vec->type()->Is<type::U32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
@@ -178,7 +178,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::F32>());
+    EXPECT_TRUE(vec->type()->Is<type::F32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
@@ -213,7 +213,7 @@
     EXPECT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::F16>());
+    EXPECT_TRUE(vec->type()->Is<type::F16>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
@@ -246,7 +246,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::Bool>());
+    EXPECT_TRUE(vec->type()->Is<type::Bool>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
@@ -279,7 +279,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::I32>());
+    EXPECT_TRUE(vec->type()->Is<type::I32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
@@ -312,7 +312,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::U32>());
+    EXPECT_TRUE(vec->type()->Is<type::U32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
@@ -345,7 +345,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::F32>());
+    EXPECT_TRUE(vec->type()->Is<type::F32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
@@ -380,7 +380,7 @@
     EXPECT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::F16>());
+    EXPECT_TRUE(vec->type()->Is<type::F16>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
@@ -414,7 +414,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::Bool>());
+    EXPECT_TRUE(vec->type()->Is<type::Bool>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
@@ -447,7 +447,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::I32>());
+    EXPECT_TRUE(vec->type()->Is<type::I32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AllEqual());
@@ -480,7 +480,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::U32>());
+    EXPECT_TRUE(vec->type()->Is<type::U32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AllEqual());
@@ -513,7 +513,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::F32>());
+    EXPECT_TRUE(vec->type()->Is<type::F32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AllEqual());
@@ -548,7 +548,7 @@
     EXPECT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::F16>());
+    EXPECT_TRUE(vec->type()->Is<type::F16>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AllEqual());
@@ -581,7 +581,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::Bool>());
+    EXPECT_TRUE(vec->type()->Is<type::Bool>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AllEqual());
@@ -614,7 +614,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::I32>());
+    EXPECT_TRUE(vec->type()->Is<type::I32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AllEqual());
@@ -647,7 +647,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::U32>());
+    EXPECT_TRUE(vec->type()->Is<type::U32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AllEqual());
@@ -680,7 +680,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::F32>());
+    EXPECT_TRUE(vec->type()->Is<type::F32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AllEqual());
@@ -713,7 +713,7 @@
     EXPECT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::F32>());
+    EXPECT_TRUE(vec->type()->Is<type::F32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
@@ -746,7 +746,7 @@
     EXPECT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::F32>());
+    EXPECT_TRUE(vec->type()->Is<type::F32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
@@ -779,7 +779,7 @@
     EXPECT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::F32>());
+    EXPECT_TRUE(vec->type()->Is<type::F32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
@@ -812,7 +812,7 @@
     EXPECT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::F32>());
+    EXPECT_TRUE(vec->type()->Is<type::F32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AllEqual());
@@ -847,7 +847,7 @@
     EXPECT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::F16>());
+    EXPECT_TRUE(vec->type()->Is<type::F16>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AllEqual());
@@ -882,7 +882,7 @@
     EXPECT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::F16>());
+    EXPECT_TRUE(vec->type()->Is<type::F16>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
@@ -917,7 +917,7 @@
     EXPECT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::F16>());
+    EXPECT_TRUE(vec->type()->Is<type::F16>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
@@ -952,7 +952,7 @@
     EXPECT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::F16>());
+    EXPECT_TRUE(vec->type()->Is<type::F16>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
@@ -987,7 +987,7 @@
     EXPECT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::F16>());
+    EXPECT_TRUE(vec->type()->Is<type::F16>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AllEqual());
@@ -1020,7 +1020,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::Bool>());
+    EXPECT_TRUE(vec->type()->Is<type::Bool>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AllEqual());
@@ -1053,7 +1053,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::Bool>());
+    EXPECT_TRUE(vec->type()->Is<type::Bool>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
@@ -1086,7 +1086,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::Bool>());
+    EXPECT_TRUE(vec->type()->Is<type::Bool>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
@@ -1119,7 +1119,7 @@
     ASSERT_NE(sem, nullptr);
     auto* mat = sem->Type()->As<sem::Matrix>();
     ASSERT_NE(mat, nullptr);
-    EXPECT_TRUE(mat->type()->Is<sem::F32>());
+    EXPECT_TRUE(mat->type()->Is<type::F32>());
     EXPECT_EQ(mat->columns(), 2u);
     EXPECT_EQ(mat->rows(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
@@ -1170,7 +1170,7 @@
     EXPECT_NE(sem, nullptr);
     auto* mat = sem->Type()->As<sem::Matrix>();
     ASSERT_NE(mat, nullptr);
-    EXPECT_TRUE(mat->type()->Is<sem::F16>());
+    EXPECT_TRUE(mat->type()->Is<type::F16>());
     EXPECT_EQ(mat->columns(), 2u);
     EXPECT_EQ(mat->rows(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
@@ -1219,7 +1219,7 @@
     ASSERT_NE(sem, nullptr);
     auto* mat = sem->Type()->As<sem::Matrix>();
     ASSERT_NE(mat, nullptr);
-    EXPECT_TRUE(mat->type()->Is<sem::F32>());
+    EXPECT_TRUE(mat->type()->Is<type::F32>());
     EXPECT_EQ(mat->columns(), 3u);
     EXPECT_EQ(mat->rows(), 2u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
@@ -1271,7 +1271,7 @@
     ASSERT_NE(sem, nullptr);
     auto* mat = sem->Type()->As<sem::Matrix>();
     ASSERT_NE(mat, nullptr);
-    EXPECT_TRUE(mat->type()->Is<sem::F32>());
+    EXPECT_TRUE(mat->type()->Is<type::F32>());
     EXPECT_EQ(mat->columns(), 3u);
     EXPECT_EQ(mat->rows(), 2u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
@@ -1320,7 +1320,7 @@
     ASSERT_NE(sem, nullptr);
     auto* arr = sem->Type()->As<sem::Array>();
     ASSERT_NE(arr, nullptr);
-    EXPECT_TRUE(arr->ElemType()->Is<sem::I32>());
+    EXPECT_TRUE(arr->ElemType()->Is<type::I32>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
     EXPECT_TRUE(sem->ConstantValue()->AnyZero());
@@ -1357,7 +1357,7 @@
     ASSERT_NE(sem, nullptr);
     auto* arr = sem->Type()->As<sem::Array>();
     ASSERT_NE(arr, nullptr);
-    EXPECT_TRUE(arr->ElemType()->Is<sem::F32>());
+    EXPECT_TRUE(arr->ElemType()->Is<type::F32>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
     EXPECT_TRUE(sem->ConstantValue()->AnyZero());
@@ -1482,7 +1482,7 @@
     ASSERT_NE(sem, nullptr);
     auto* arr = sem->Type()->As<sem::Array>();
     ASSERT_NE(arr, nullptr);
-    EXPECT_TRUE(arr->ElemType()->Is<sem::I32>());
+    EXPECT_TRUE(arr->ElemType()->Is<type::I32>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AllEqual());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -1519,7 +1519,7 @@
     ASSERT_NE(sem, nullptr);
     auto* arr = sem->Type()->As<sem::Array>();
     ASSERT_NE(arr, nullptr);
-    EXPECT_TRUE(arr->ElemType()->Is<sem::F32>());
+    EXPECT_TRUE(arr->ElemType()->Is<type::F32>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AllEqual());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -1635,19 +1635,19 @@
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->AllEqual());
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<sem::I32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<type::I32>());
     EXPECT_EQ(sem->ConstantValue()->Index(0)->As<i32>(), 0_i);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->AllEqual());
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<sem::I32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<type::I32>());
     EXPECT_EQ(sem->ConstantValue()->Index(1)->As<i32>(), 0_i);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(2)->AllEqual());
     EXPECT_TRUE(sem->ConstantValue()->Index(2)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(2)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<sem::I32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<type::I32>());
     EXPECT_EQ(sem->ConstantValue()->Index(2)->As<i32>(), 0_i);
 }
 
@@ -1680,31 +1680,31 @@
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->AllEqual());
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<sem::I32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<type::I32>());
     EXPECT_EQ(sem->ConstantValue()->Index(0)->As<i32>(), 0_i);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->AllEqual());
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<sem::U32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<type::U32>());
     EXPECT_EQ(sem->ConstantValue()->Index(1)->As<u32>(), 0_u);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(2)->AllEqual());
     EXPECT_TRUE(sem->ConstantValue()->Index(2)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(2)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<sem::F32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<type::F32>());
     EXPECT_EQ(sem->ConstantValue()->Index(2)->As<f32>(), 0._f);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(3)->AllEqual());
     EXPECT_TRUE(sem->ConstantValue()->Index(3)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(3)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(3)->Type()->Is<sem::F16>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(3)->Type()->Is<type::F16>());
     EXPECT_EQ(sem->ConstantValue()->Index(3)->As<f16>(), 0._h);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(4)->AllEqual());
     EXPECT_TRUE(sem->ConstantValue()->Index(4)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(4)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(4)->Type()->Is<sem::Bool>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(4)->Type()->Is<type::Bool>());
     EXPECT_EQ(sem->ConstantValue()->Index(4)->As<bool>(), false);
 }
 
@@ -1734,7 +1734,7 @@
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->AllZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(sem->ConstantValue()->Index(0)->Index(0)->As<f32>(), 0._f);
     EXPECT_EQ(sem->ConstantValue()->Index(0)->Index(1)->As<f32>(), 0._f);
     EXPECT_EQ(sem->ConstantValue()->Index(0)->Index(2)->As<f32>(), 0._f);
@@ -1743,7 +1743,7 @@
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->AllZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(0)->As<f32>(), 0._f);
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(1)->As<f32>(), 0._f);
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(2)->As<f32>(), 0._f);
@@ -1752,7 +1752,7 @@
     EXPECT_TRUE(sem->ConstantValue()->Index(2)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(2)->AllZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(sem->ConstantValue()->Index(2)->Index(0)->As<f32>(), 0._f);
     EXPECT_EQ(sem->ConstantValue()->Index(2)->Index(1)->As<f32>(), 0._f);
     EXPECT_EQ(sem->ConstantValue()->Index(2)->Index(2)->As<f32>(), 0._f);
@@ -1788,7 +1788,7 @@
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->AllZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->As<sem::Vector>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->As<sem::Vector>()->type()->Is<type::I32>());
     EXPECT_EQ(sem->ConstantValue()->Index(0)->Index(0)->As<i32>(), 0_i);
     EXPECT_EQ(sem->ConstantValue()->Index(0)->Index(1)->As<i32>(), 0_i);
 
@@ -1796,7 +1796,7 @@
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->AllZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->As<sem::Vector>()->type()->Is<sem::U32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->As<sem::Vector>()->type()->Is<type::U32>());
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(0)->As<u32>(), 0_u);
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(1)->As<u32>(), 0_u);
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(2)->As<u32>(), 0_u);
@@ -1805,7 +1805,7 @@
     EXPECT_TRUE(sem->ConstantValue()->Index(2)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(2)->AllZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(sem->ConstantValue()->Index(2)->Index(0)->As<f32>(), 0._f);
     EXPECT_EQ(sem->ConstantValue()->Index(2)->Index(1)->As<f32>(), 0._f);
     EXPECT_EQ(sem->ConstantValue()->Index(2)->Index(2)->As<f32>(), 0._f);
@@ -1815,7 +1815,7 @@
     EXPECT_TRUE(sem->ConstantValue()->Index(3)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(3)->AllZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(3)->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(sem->ConstantValue()->Index(3)->Type()->As<sem::Vector>()->type()->Is<sem::F16>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(3)->Type()->As<sem::Vector>()->type()->Is<type::F16>());
     EXPECT_EQ(sem->ConstantValue()->Index(3)->Index(0)->As<f16>(), 0._h);
     EXPECT_EQ(sem->ConstantValue()->Index(3)->Index(1)->As<f16>(), 0._h);
     EXPECT_EQ(sem->ConstantValue()->Index(3)->Index(2)->As<f16>(), 0._h);
@@ -1824,7 +1824,8 @@
     EXPECT_TRUE(sem->ConstantValue()->Index(4)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(4)->AllZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(4)->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(sem->ConstantValue()->Index(4)->Type()->As<sem::Vector>()->type()->Is<sem::Bool>());
+    EXPECT_TRUE(
+        sem->ConstantValue()->Index(4)->Type()->As<sem::Vector>()->type()->Is<type::Bool>());
     EXPECT_EQ(sem->ConstantValue()->Index(4)->Index(0)->As<bool>(), false);
     EXPECT_EQ(sem->ConstantValue()->Index(4)->Index(1)->As<bool>(), false);
 }
@@ -1902,31 +1903,31 @@
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->AllEqual());
     EXPECT_FALSE(sem->ConstantValue()->Index(0)->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->Index(0)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<sem::I32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<type::I32>());
     EXPECT_EQ(sem->ConstantValue()->Index(0)->As<i32>(), 1_i);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->AllEqual());
     EXPECT_FALSE(sem->ConstantValue()->Index(1)->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->Index(1)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<sem::U32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<type::U32>());
     EXPECT_EQ(sem->ConstantValue()->Index(1)->As<u32>(), 2_u);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(2)->AllEqual());
     EXPECT_FALSE(sem->ConstantValue()->Index(2)->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->Index(2)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<sem::F32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<type::F32>());
     EXPECT_EQ(sem->ConstantValue()->Index(2)->As<f32>(), 3._f);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(3)->AllEqual());
     EXPECT_FALSE(sem->ConstantValue()->Index(3)->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->Index(3)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(3)->Type()->Is<sem::F16>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(3)->Type()->Is<type::F16>());
     EXPECT_EQ(sem->ConstantValue()->Index(3)->As<f16>(), 4._h);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(4)->AllEqual());
     EXPECT_TRUE(sem->ConstantValue()->Index(4)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(4)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(4)->Type()->Is<sem::Bool>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(4)->Type()->Is<type::Bool>());
     EXPECT_EQ(sem->ConstantValue()->Index(4)->As<bool>(), false);
 }
 
@@ -1961,7 +1962,7 @@
     EXPECT_FALSE(sem->ConstantValue()->Index(0)->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->Index(0)->AllZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->As<sem::Vector>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->As<sem::Vector>()->type()->Is<type::I32>());
     EXPECT_EQ(sem->ConstantValue()->Index(0)->Index(0)->As<i32>(), 1_i);
     EXPECT_EQ(sem->ConstantValue()->Index(0)->Index(1)->As<i32>(), 1_i);
 
@@ -1969,7 +1970,7 @@
     EXPECT_FALSE(sem->ConstantValue()->Index(1)->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->Index(1)->AllZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->As<sem::Vector>()->type()->Is<sem::U32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->As<sem::Vector>()->type()->Is<type::U32>());
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(0)->As<u32>(), 2_u);
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(1)->As<u32>(), 2_u);
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(2)->As<u32>(), 2_u);
@@ -1978,7 +1979,7 @@
     EXPECT_FALSE(sem->ConstantValue()->Index(2)->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->Index(2)->AllZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(sem->ConstantValue()->Index(2)->Index(0)->As<f32>(), 3._f);
     EXPECT_EQ(sem->ConstantValue()->Index(2)->Index(1)->As<f32>(), 3._f);
     EXPECT_EQ(sem->ConstantValue()->Index(2)->Index(2)->As<f32>(), 3._f);
@@ -1988,7 +1989,7 @@
     EXPECT_FALSE(sem->ConstantValue()->Index(3)->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->Index(3)->AllZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(3)->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(sem->ConstantValue()->Index(3)->Type()->As<sem::Vector>()->type()->Is<sem::F16>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(3)->Type()->As<sem::Vector>()->type()->Is<type::F16>());
     EXPECT_EQ(sem->ConstantValue()->Index(3)->Index(0)->As<f16>(), 4._h);
     EXPECT_EQ(sem->ConstantValue()->Index(3)->Index(1)->As<f16>(), 4._h);
     EXPECT_EQ(sem->ConstantValue()->Index(3)->Index(2)->As<f16>(), 4._h);
@@ -1997,7 +1998,8 @@
     EXPECT_TRUE(sem->ConstantValue()->Index(4)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(4)->AllZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(4)->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(sem->ConstantValue()->Index(4)->Type()->As<sem::Vector>()->type()->Is<sem::Bool>());
+    EXPECT_TRUE(
+        sem->ConstantValue()->Index(4)->Type()->As<sem::Vector>()->type()->Is<type::Bool>());
     EXPECT_EQ(sem->ConstantValue()->Index(4)->Index(0)->As<bool>(), false);
     EXPECT_EQ(sem->ConstantValue()->Index(4)->Index(1)->As<bool>(), false);
 }
diff --git a/src/tint/resolver/const_eval_conversion_test.cc b/src/tint/resolver/const_eval_conversion_test.cc
index 8640a1d..7b277b6 100644
--- a/src/tint/resolver/const_eval_conversion_test.cc
+++ b/src/tint/resolver/const_eval_conversion_test.cc
@@ -232,7 +232,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::I32>());
+    EXPECT_TRUE(vec->type()->Is<type::I32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AllEqual());
@@ -265,7 +265,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::F32>());
+    EXPECT_TRUE(vec->type()->Is<type::F32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AllEqual());
@@ -300,7 +300,7 @@
     EXPECT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::I32>());
+    EXPECT_TRUE(vec->type()->Is<type::I32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AllEqual());
@@ -335,7 +335,7 @@
     EXPECT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::F16>());
+    EXPECT_TRUE(vec->type()->Is<type::F16>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AllEqual());
@@ -368,7 +368,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::I32>());
+    EXPECT_TRUE(vec->type()->Is<type::I32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AllEqual());
@@ -401,7 +401,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::U32>());
+    EXPECT_TRUE(vec->type()->Is<type::U32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AllEqual());
@@ -446,7 +446,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::F16>());
+    EXPECT_TRUE(vec->type()->Is<type::F16>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AllEqual());
diff --git a/src/tint/resolver/const_eval_indexing_test.cc b/src/tint/resolver/const_eval_indexing_test.cc
index 09447d5..723e758 100644
--- a/src/tint/resolver/const_eval_indexing_test.cc
+++ b/src/tint/resolver/const_eval_indexing_test.cc
@@ -27,7 +27,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    ASSERT_TRUE(sem->Type()->Is<sem::I32>());
+    ASSERT_TRUE(sem->Type()->Is<type::I32>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -59,7 +59,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    ASSERT_TRUE(sem->Type()->Is<sem::I32>());
+    ASSERT_TRUE(sem->Type()->Is<type::I32>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -100,7 +100,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    ASSERT_TRUE(sem->Type()->Is<sem::I32>());
+    ASSERT_TRUE(sem->Type()->Is<type::I32>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AllEqual());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -165,7 +165,7 @@
     ASSERT_NE(sem, nullptr);
     auto* vec = sem->Type()->As<sem::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<sem::F32>());
+    EXPECT_TRUE(vec->type()->Is<type::F32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
 
@@ -277,7 +277,7 @@
         EXPECT_NE(vec, nullptr);
         auto* ty = vec->Type()->As<sem::Vector>();
         ASSERT_NE(vec->Type(), nullptr);
-        EXPECT_TRUE(ty->type()->Is<sem::F32>());
+        EXPECT_TRUE(ty->type()->Is<type::F32>());
         EXPECT_EQ(ty->Width(), 3u);
         EXPECT_EQ(vec->ConstantValue()->Type(), vec->Type());
         EXPECT_FALSE(vec->ConstantValue()->AllEqual());
@@ -302,7 +302,7 @@
     {
         auto* f = Sem().Get(f32_expr);
         EXPECT_NE(f, nullptr);
-        EXPECT_TRUE(f->Type()->Is<sem::F32>());
+        EXPECT_TRUE(f->Type()->Is<type::F32>());
         EXPECT_EQ(f->ConstantValue()->Type(), f->Type());
         EXPECT_TRUE(f->ConstantValue()->AllEqual());
         EXPECT_FALSE(f->ConstantValue()->AnyZero());
diff --git a/src/tint/resolver/const_eval_member_access_test.cc b/src/tint/resolver/const_eval_member_access_test.cc
index 4f3245e..3fb8fc3 100644
--- a/src/tint/resolver/const_eval_member_access_test.cc
+++ b/src/tint/resolver/const_eval_member_access_test.cc
@@ -65,7 +65,7 @@
     EXPECT_TRUE(i2->ConstantValue()->AllEqual());
     EXPECT_FALSE(i2->ConstantValue()->AnyZero());
     EXPECT_FALSE(i2->ConstantValue()->AllZero());
-    EXPECT_TRUE(i2->ConstantValue()->Type()->Is<sem::U32>());
+    EXPECT_TRUE(i2->ConstantValue()->Type()->Is<type::U32>());
     EXPECT_EQ(i2->ConstantValue()->As<u32>(), 2_u);
 }
 
diff --git a/src/tint/resolver/const_eval_test.h b/src/tint/resolver/const_eval_test.h
index 2b36588..120a077 100644
--- a/src/tint/resolver/const_eval_test.h
+++ b/src/tint/resolver/const_eval_test.h
@@ -43,11 +43,11 @@
         c->Type(),  //
         [&](const type::AbstractInt*) { scalars.Push(c->As<AInt>()); },
         [&](const type::AbstractFloat*) { scalars.Push(c->As<AFloat>()); },
-        [&](const sem::Bool*) { scalars.Push(c->As<bool>()); },
-        [&](const sem::I32*) { scalars.Push(c->As<i32>()); },
-        [&](const sem::U32*) { scalars.Push(c->As<u32>()); },
-        [&](const sem::F32*) { scalars.Push(c->As<f32>()); },
-        [&](const sem::F16*) { scalars.Push(c->As<f16>()); },
+        [&](const type::Bool*) { scalars.Push(c->As<bool>()); },
+        [&](const type::I32*) { scalars.Push(c->As<i32>()); },
+        [&](const type::U32*) { scalars.Push(c->As<u32>()); },
+        [&](const type::F32*) { scalars.Push(c->As<f32>()); },
+        [&](const type::F16*) { scalars.Push(c->As<f16>()); },
         [&](Default) {
             size_t i = 0;
             while (auto* child = c->Index(i++)) {
diff --git a/src/tint/resolver/inferred_type_test.cc b/src/tint/resolver/inferred_type_test.cc
index 4b3100b..d7f5548 100644
--- a/src/tint/resolver/inferred_type_test.cc
+++ b/src/tint/resolver/inferred_type_test.cc
@@ -136,7 +136,7 @@
 TEST_F(ResolverInferredTypeTest, InferArray_Pass) {
     auto* type = ty.array(ty.u32(), 10_u);
     auto* expected_type = create<sem::Array>(
-        create<sem::U32>(), create<type::ConstantArrayCount>(10u), 4u, 4u * 10u, 4u, 4u);
+        create<type::U32>(), create<type::ConstantArrayCount>(10u), 4u, 4u * 10u, 4u, 4u);
 
     auto* ctor_expr = Construct(type);
     auto* var = Var("a", ast::AddressSpace::kFunction, ctor_expr);
@@ -153,7 +153,7 @@
     auto* expected_type = create<sem::Struct>(
         str, str->source, str->name,
         utils::Vector{create<sem::StructMember>(member, member->source, member->symbol,
-                                                create<sem::I32>(), 0u, 0u, 0u, 4u, std::nullopt)},
+                                                create<type::I32>(), 0u, 0u, 0u, 4u, std::nullopt)},
         0u, 4u, 4u);
 
     auto* ctor_expr = Construct(ty.Of(str));
diff --git a/src/tint/resolver/intrinsic_table.cc b/src/tint/resolver/intrinsic_table.cc
index 6c70f66..0546561 100644
--- a/src/tint/resolver/intrinsic_table.cc
+++ b/src/tint/resolver/intrinsic_table.cc
@@ -349,7 +349,7 @@
 using OverloadFlags = utils::EnumSet<OverloadFlag>;
 
 bool match_bool(MatchState&, const type::Type* ty) {
-    return ty->IsAnyOf<Any, sem::Bool>();
+    return ty->IsAnyOf<Any, type::Bool>();
 }
 
 const type::AbstractFloat* build_fa(MatchState& state) {
@@ -370,40 +370,40 @@
            ty->IsAnyOf<Any, type::AbstractInt>();
 }
 
-const sem::Bool* build_bool(MatchState& state) {
-    return state.builder.create<sem::Bool>();
+const type::Bool* build_bool(MatchState& state) {
+    return state.builder.create<type::Bool>();
 }
 
-const sem::F16* build_f16(MatchState& state) {
-    return state.builder.create<sem::F16>();
+const type::F16* build_f16(MatchState& state) {
+    return state.builder.create<type::F16>();
 }
 
 bool match_f16(MatchState&, const type::Type* ty) {
-    return ty->IsAnyOf<Any, sem::F16, type::AbstractNumeric>();
+    return ty->IsAnyOf<Any, type::F16, type::AbstractNumeric>();
 }
 
-const sem::F32* build_f32(MatchState& state) {
-    return state.builder.create<sem::F32>();
+const type::F32* build_f32(MatchState& state) {
+    return state.builder.create<type::F32>();
 }
 
 bool match_f32(MatchState&, const type::Type* ty) {
-    return ty->IsAnyOf<Any, sem::F32, type::AbstractNumeric>();
+    return ty->IsAnyOf<Any, type::F32, type::AbstractNumeric>();
 }
 
-const sem::I32* build_i32(MatchState& state) {
-    return state.builder.create<sem::I32>();
+const type::I32* build_i32(MatchState& state) {
+    return state.builder.create<type::I32>();
 }
 
 bool match_i32(MatchState&, const type::Type* ty) {
-    return ty->IsAnyOf<Any, sem::I32, type::AbstractInt>();
+    return ty->IsAnyOf<Any, type::I32, type::AbstractInt>();
 }
 
-const sem::U32* build_u32(MatchState& state) {
-    return state.builder.create<sem::U32>();
+const type::U32* build_u32(MatchState& state) {
+    return state.builder.create<type::U32>();
 }
 
 bool match_u32(MatchState&, const type::Type* ty) {
-    return ty->IsAnyOf<Any, sem::U32, type::AbstractInt>();
+    return ty->IsAnyOf<Any, type::U32, type::AbstractInt>();
 }
 
 bool match_vec(MatchState&, const type::Type* ty, Number& N, const type::Type*& T) {
@@ -834,18 +834,18 @@
 
 const sem::Struct* build_modf_result(MatchState& state, const type::Type* el) {
     auto build_f32 = [&] {
-        auto* ty = state.builder.create<sem::F32>();
+        auto* ty = state.builder.create<type::F32>();
         return build_struct(state.builder, "__modf_result_f32", {{"fract", ty}, {"whole", ty}});
     };
     auto build_f16 = [&] {
-        auto* ty = state.builder.create<sem::F16>();
+        auto* ty = state.builder.create<type::F16>();
         return build_struct(state.builder, "__modf_result_f16", {{"fract", ty}, {"whole", ty}});
     };
 
     return Switch(
-        el,                                            //
-        [&](const sem::F32*) { return build_f32(); },  //
-        [&](const sem::F16*) { return build_f16(); },  //
+        el,                                             //
+        [&](const type::F32*) { return build_f32(); },  //
+        [&](const type::F16*) { return build_f16(); },  //
         [&](const type::AbstractFloat*) {
             auto* abstract = build_struct(state.builder, "__modf_result_abstract",
                                           {{"fract", el}, {"whole", el}});
@@ -862,18 +862,18 @@
 const sem::Struct* build_modf_result_vec(MatchState& state, Number& n, const type::Type* el) {
     auto prefix = "__modf_result_vec" + std::to_string(n.Value());
     auto build_f32 = [&] {
-        auto* vec = state.builder.create<sem::Vector>(state.builder.create<sem::F32>(), n.Value());
+        auto* vec = state.builder.create<sem::Vector>(state.builder.create<type::F32>(), n.Value());
         return build_struct(state.builder, prefix + "_f32", {{"fract", vec}, {"whole", vec}});
     };
     auto build_f16 = [&] {
-        auto* vec = state.builder.create<sem::Vector>(state.builder.create<sem::F16>(), n.Value());
+        auto* vec = state.builder.create<sem::Vector>(state.builder.create<type::F16>(), n.Value());
         return build_struct(state.builder, prefix + "_f16", {{"fract", vec}, {"whole", vec}});
     };
 
     return Switch(
-        el,                                            //
-        [&](const sem::F32*) { return build_f32(); },  //
-        [&](const sem::F16*) { return build_f16(); },  //
+        el,                                             //
+        [&](const type::F32*) { return build_f32(); },  //
+        [&](const type::F16*) { return build_f16(); },  //
         [&](const type::AbstractFloat*) {
             auto* vec = state.builder.create<sem::Vector>(el, n.Value());
             auto* abstract =
@@ -890,20 +890,20 @@
 
 const sem::Struct* build_frexp_result(MatchState& state, const type::Type* el) {
     auto build_f32 = [&] {
-        auto* f = state.builder.create<sem::F32>();
-        auto* i = state.builder.create<sem::I32>();
+        auto* f = state.builder.create<type::F32>();
+        auto* i = state.builder.create<type::I32>();
         return build_struct(state.builder, "__frexp_result_f32", {{"fract", f}, {"exp", i}});
     };
     auto build_f16 = [&] {
-        auto* f = state.builder.create<sem::F16>();
-        auto* i = state.builder.create<sem::I32>();
+        auto* f = state.builder.create<type::F16>();
+        auto* i = state.builder.create<type::I32>();
         return build_struct(state.builder, "__frexp_result_f16", {{"fract", f}, {"exp", i}});
     };
 
     return Switch(
-        el,                                            //
-        [&](const sem::F32*) { return build_f32(); },  //
-        [&](const sem::F16*) { return build_f16(); },  //
+        el,                                             //
+        [&](const type::F32*) { return build_f32(); },  //
+        [&](const type::F16*) { return build_f16(); },  //
         [&](const type::AbstractFloat*) {
             auto* i = state.builder.create<type::AbstractInt>();
             auto* abstract =
@@ -921,20 +921,20 @@
 const sem::Struct* build_frexp_result_vec(MatchState& state, Number& n, const type::Type* el) {
     auto prefix = "__frexp_result_vec" + std::to_string(n.Value());
     auto build_f32 = [&] {
-        auto* f = state.builder.create<sem::Vector>(state.builder.create<sem::F32>(), n.Value());
-        auto* e = state.builder.create<sem::Vector>(state.builder.create<sem::I32>(), n.Value());
+        auto* f = state.builder.create<sem::Vector>(state.builder.create<type::F32>(), n.Value());
+        auto* e = state.builder.create<sem::Vector>(state.builder.create<type::I32>(), n.Value());
         return build_struct(state.builder, prefix + "_f32", {{"fract", f}, {"exp", e}});
     };
     auto build_f16 = [&] {
-        auto* f = state.builder.create<sem::Vector>(state.builder.create<sem::F16>(), n.Value());
-        auto* e = state.builder.create<sem::Vector>(state.builder.create<sem::I32>(), n.Value());
+        auto* f = state.builder.create<sem::Vector>(state.builder.create<type::F16>(), n.Value());
+        auto* e = state.builder.create<sem::Vector>(state.builder.create<type::I32>(), n.Value());
         return build_struct(state.builder, prefix + "_f16", {{"fract", f}, {"exp", e}});
     };
 
     return Switch(
-        el,                                            //
-        [&](const sem::F32*) { return build_f32(); },  //
-        [&](const sem::F16*) { return build_f16(); },  //
+        el,                                             //
+        [&](const type::F32*) { return build_f32(); },  //
+        [&](const type::F16*) { return build_f16(); },  //
         [&](const type::AbstractFloat*) {
             auto* f = state.builder.create<sem::Vector>(el, n.Value());
             auto* e = state.builder.create<sem::Vector>(state.builder.create<type::AbstractInt>(),
@@ -956,7 +956,7 @@
         state.builder,
         "__atomic_compare_exchange_result" + ty->FriendlyName(state.builder.Symbols()),
         {{"old_value", const_cast<type::Type*>(ty)},
-         {"exchanged", state.builder.create<sem::Bool>()}});
+         {"exchanged", state.builder.create<type::Bool>()}});
 }
 
 /// ParameterInfo describes a parameter
@@ -1549,7 +1549,7 @@
             return {};
         }
     } else {
-        return_type = builder.create<sem::Void>();
+        return_type = builder.create<type::Void>();
     }
 
     return IntrinsicPrototype{match.overload, return_type, std::move(match.parameters)};
diff --git a/src/tint/resolver/intrinsic_table_test.cc b/src/tint/resolver/intrinsic_table_test.cc
index 3cdf65f..6f984a1 100644
--- a/src/tint/resolver/intrinsic_table_test.cc
+++ b/src/tint/resolver/intrinsic_table_test.cc
@@ -52,7 +52,7 @@
 };
 
 TEST_F(IntrinsicTableTest, MatchF32) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto result = table->Lookup(BuiltinType::kCos, utils::Vector{f32},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_NE(result.sem, nullptr) << Diagnostics().str();
@@ -64,7 +64,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchF32) {
-    auto* i32 = create<sem::I32>();
+    auto* i32 = create<type::I32>();
     auto result = table->Lookup(BuiltinType::kCos, utils::Vector{i32},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_EQ(result.sem, nullptr);
@@ -72,8 +72,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchU32) {
-    auto* f32 = create<sem::F32>();
-    auto* u32 = create<sem::U32>();
+    auto* f32 = create<type::F32>();
+    auto* u32 = create<type::U32>();
     auto* vec2_f32 = create<sem::Vector>(f32, 2u);
     auto result = table->Lookup(BuiltinType::kUnpack2X16Float, utils::Vector{u32},
                                 sem::EvaluationStage::kConstant, Source{});
@@ -86,7 +86,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchU32) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto result = table->Lookup(BuiltinType::kUnpack2X16Float, utils::Vector{f32},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_EQ(result.sem, nullptr);
@@ -94,8 +94,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchI32) {
-    auto* f32 = create<sem::F32>();
-    auto* i32 = create<sem::I32>();
+    auto* f32 = create<type::F32>();
+    auto* i32 = create<type::I32>();
     auto* vec4_f32 = create<sem::Vector>(f32, 4u);
     auto* tex = create<type::SampledTexture>(ast::TextureDimension::k1d, f32);
     auto result = table->Lookup(BuiltinType::kTextureLoad, utils::Vector{tex, i32, i32},
@@ -114,7 +114,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchI32) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* tex = create<type::SampledTexture>(ast::TextureDimension::k1d, f32);
     auto result = table->Lookup(BuiltinType::kTextureLoad, utils::Vector{tex, f32},
                                 sem::EvaluationStage::kConstant, Source{});
@@ -123,7 +123,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchIU32AsI32) {
-    auto* i32 = create<sem::I32>();
+    auto* i32 = create<type::I32>();
     auto result = table->Lookup(BuiltinType::kCountOneBits, utils::Vector{i32},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_NE(result.sem, nullptr) << Diagnostics().str();
@@ -135,7 +135,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchIU32AsU32) {
-    auto* u32 = create<sem::U32>();
+    auto* u32 = create<type::U32>();
     auto result = table->Lookup(BuiltinType::kCountOneBits, utils::Vector{u32},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_NE(result.sem, nullptr) << Diagnostics().str();
@@ -147,7 +147,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchIU32) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto result = table->Lookup(BuiltinType::kCountOneBits, utils::Vector{f32},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_EQ(result.sem, nullptr);
@@ -155,7 +155,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchFIU32AsI32) {
-    auto* i32 = create<sem::I32>();
+    auto* i32 = create<type::I32>();
     auto result = table->Lookup(BuiltinType::kClamp, utils::Vector{i32, i32, i32},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_NE(result.sem, nullptr) << Diagnostics().str();
@@ -169,7 +169,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchFIU32AsU32) {
-    auto* u32 = create<sem::U32>();
+    auto* u32 = create<type::U32>();
     auto result = table->Lookup(BuiltinType::kClamp, utils::Vector{u32, u32, u32},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_NE(result.sem, nullptr) << Diagnostics().str();
@@ -183,7 +183,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchFIU32AsF32) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto result = table->Lookup(BuiltinType::kClamp, utils::Vector{f32, f32, f32},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_NE(result.sem, nullptr) << Diagnostics().str();
@@ -197,7 +197,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchFIU32) {
-    auto* bool_ = create<sem::Bool>();
+    auto* bool_ = create<type::Bool>();
     auto result = table->Lookup(BuiltinType::kClamp, utils::Vector{bool_, bool_, bool_},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_EQ(result.sem, nullptr);
@@ -205,8 +205,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchBool) {
-    auto* f32 = create<sem::F32>();
-    auto* bool_ = create<sem::Bool>();
+    auto* f32 = create<type::F32>();
+    auto* bool_ = create<type::Bool>();
     auto result = table->Lookup(BuiltinType::kSelect, utils::Vector{f32, f32, bool_},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_NE(result.sem, nullptr) << Diagnostics().str();
@@ -220,7 +220,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchBool) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto result = table->Lookup(BuiltinType::kSelect, utils::Vector{f32, f32, f32},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_EQ(result.sem, nullptr);
@@ -228,7 +228,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchPointer) {
-    auto* i32 = create<sem::I32>();
+    auto* i32 = create<type::I32>();
     auto* atomicI32 = create<sem::Atomic>(i32);
     auto* ptr =
         create<sem::Pointer>(atomicI32, ast::AddressSpace::kWorkgroup, ast::Access::kReadWrite);
@@ -243,7 +243,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchPointer) {
-    auto* i32 = create<sem::I32>();
+    auto* i32 = create<type::I32>();
     auto* atomicI32 = create<sem::Atomic>(i32);
     auto result = table->Lookup(BuiltinType::kAtomicLoad, utils::Vector{atomicI32},
                                 sem::EvaluationStage::kConstant, Source{});
@@ -253,14 +253,14 @@
 
 TEST_F(IntrinsicTableTest, MatchArray) {
     auto* arr =
-        create<sem::Array>(create<sem::U32>(), create<type::RuntimeArrayCount>(), 4u, 4u, 4u, 4u);
+        create<sem::Array>(create<type::U32>(), create<type::RuntimeArrayCount>(), 4u, 4u, 4u, 4u);
     auto* arr_ptr = create<sem::Pointer>(arr, ast::AddressSpace::kStorage, ast::Access::kReadWrite);
     auto result = table->Lookup(BuiltinType::kArrayLength, utils::Vector{arr_ptr},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_NE(result.sem, nullptr) << Diagnostics().str();
     ASSERT_EQ(Diagnostics().str(), "");
     EXPECT_EQ(result.sem->Type(), BuiltinType::kArrayLength);
-    EXPECT_TRUE(result.sem->ReturnType()->Is<sem::U32>());
+    EXPECT_TRUE(result.sem->ReturnType()->Is<type::U32>());
     ASSERT_EQ(result.sem->Parameters().Length(), 1u);
     auto* param_type = result.sem->Parameters()[0]->Type();
     ASSERT_TRUE(param_type->Is<sem::Pointer>());
@@ -268,7 +268,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchArray) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto result = table->Lookup(BuiltinType::kArrayLength, utils::Vector{f32},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_EQ(result.sem, nullptr);
@@ -276,7 +276,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchSampler) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* vec2_f32 = create<sem::Vector>(f32, 2u);
     auto* vec4_f32 = create<sem::Vector>(f32, 4u);
     auto* tex = create<type::SampledTexture>(ast::TextureDimension::k2d, f32);
@@ -297,7 +297,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchSampler) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* vec2_f32 = create<sem::Vector>(f32, 2u);
     auto* tex = create<type::SampledTexture>(ast::TextureDimension::k2d, f32);
     auto result = table->Lookup(BuiltinType::kTextureSample, utils::Vector{tex, f32, vec2_f32},
@@ -307,8 +307,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchSampledTexture) {
-    auto* i32 = create<sem::I32>();
-    auto* f32 = create<sem::F32>();
+    auto* i32 = create<type::I32>();
+    auto* f32 = create<type::F32>();
     auto* vec2_i32 = create<sem::Vector>(i32, 2u);
     auto* vec4_f32 = create<sem::Vector>(f32, 4u);
     auto* tex = create<type::SampledTexture>(ast::TextureDimension::k2d, f32);
@@ -328,8 +328,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchMultisampledTexture) {
-    auto* i32 = create<sem::I32>();
-    auto* f32 = create<sem::F32>();
+    auto* i32 = create<type::I32>();
+    auto* f32 = create<type::F32>();
     auto* vec2_i32 = create<sem::Vector>(i32, 2u);
     auto* vec4_f32 = create<sem::Vector>(f32, 4u);
     auto* tex = create<type::MultisampledTexture>(ast::TextureDimension::k2d, f32);
@@ -349,8 +349,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchDepthTexture) {
-    auto* f32 = create<sem::F32>();
-    auto* i32 = create<sem::I32>();
+    auto* f32 = create<type::F32>();
+    auto* i32 = create<type::I32>();
     auto* vec2_i32 = create<sem::Vector>(i32, 2u);
     auto* tex = create<type::DepthTexture>(ast::TextureDimension::k2d);
     auto result = table->Lookup(BuiltinType::kTextureLoad, utils::Vector{tex, vec2_i32, i32},
@@ -369,8 +369,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchDepthMultisampledTexture) {
-    auto* f32 = create<sem::F32>();
-    auto* i32 = create<sem::I32>();
+    auto* f32 = create<type::F32>();
+    auto* i32 = create<type::I32>();
     auto* vec2_i32 = create<sem::Vector>(i32, 2u);
     auto* tex = create<type::DepthMultisampledTexture>(ast::TextureDimension::k2d);
     auto result = table->Lookup(BuiltinType::kTextureLoad, utils::Vector{tex, vec2_i32, i32},
@@ -389,8 +389,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchExternalTexture) {
-    auto* f32 = create<sem::F32>();
-    auto* i32 = create<sem::I32>();
+    auto* f32 = create<type::F32>();
+    auto* i32 = create<type::I32>();
     auto* vec2_i32 = create<sem::Vector>(i32, 2u);
     auto* vec4_f32 = create<sem::Vector>(f32, 4u);
     auto* tex = create<type::ExternalTexture>();
@@ -408,8 +408,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchWOStorageTexture) {
-    auto* f32 = create<sem::F32>();
-    auto* i32 = create<sem::I32>();
+    auto* f32 = create<type::F32>();
+    auto* i32 = create<type::I32>();
     auto* vec2_i32 = create<sem::Vector>(i32, 2u);
     auto* vec4_f32 = create<sem::Vector>(f32, 4u);
     auto* subtype = type::StorageTexture::SubtypeFor(ast::TexelFormat::kR32Float, Types());
@@ -421,7 +421,7 @@
     ASSERT_NE(result.sem, nullptr) << Diagnostics().str();
     ASSERT_EQ(Diagnostics().str(), "");
     EXPECT_EQ(result.sem->Type(), BuiltinType::kTextureStore);
-    EXPECT_TRUE(result.sem->ReturnType()->Is<sem::Void>());
+    EXPECT_TRUE(result.sem->ReturnType()->Is<type::Void>());
     ASSERT_EQ(result.sem->Parameters().Length(), 3u);
     EXPECT_EQ(result.sem->Parameters()[0]->Type(), tex);
     EXPECT_EQ(result.sem->Parameters()[0]->Usage(), ParameterUsage::kTexture);
@@ -432,8 +432,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchTexture) {
-    auto* f32 = create<sem::F32>();
-    auto* i32 = create<sem::I32>();
+    auto* f32 = create<type::F32>();
+    auto* i32 = create<type::I32>();
     auto* vec2_i32 = create<sem::Vector>(i32, 2u);
     auto result = table->Lookup(BuiltinType::kTextureLoad, utils::Vector{f32, vec2_i32},
                                 sem::EvaluationStage::kConstant, Source{});
@@ -442,7 +442,7 @@
 }
 
 TEST_F(IntrinsicTableTest, ImplicitLoadOnReference) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto result = table->Lookup(
         BuiltinType::kCos,
         utils::Vector{
@@ -458,7 +458,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchTemplateType) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto result = table->Lookup(BuiltinType::kClamp, utils::Vector{f32, f32, f32},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_NE(result.sem, nullptr) << Diagnostics().str();
@@ -471,8 +471,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchTemplateType) {
-    auto* f32 = create<sem::F32>();
-    auto* u32 = create<sem::U32>();
+    auto* f32 = create<type::F32>();
+    auto* u32 = create<type::U32>();
     auto result = table->Lookup(BuiltinType::kClamp, utils::Vector{f32, u32, f32},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_EQ(result.sem, nullptr);
@@ -480,7 +480,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchOpenSizeVector) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* vec2_f32 = create<sem::Vector>(f32, 2u);
     auto result = table->Lookup(BuiltinType::kClamp, utils::Vector{vec2_f32, vec2_f32, vec2_f32},
                                 sem::EvaluationStage::kConstant, Source{});
@@ -495,8 +495,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchOpenSizeVector) {
-    auto* f32 = create<sem::F32>();
-    auto* u32 = create<sem::U32>();
+    auto* f32 = create<type::F32>();
+    auto* u32 = create<type::U32>();
     auto* vec2_f32 = create<sem::Vector>(f32, 2u);
     auto result = table->Lookup(BuiltinType::kClamp, utils::Vector{vec2_f32, u32, vec2_f32},
                                 sem::EvaluationStage::kConstant, Source{});
@@ -505,7 +505,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchOpenSizeMatrix) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* vec3_f32 = create<sem::Vector>(f32, 3u);
     auto* mat3_f32 = create<sem::Matrix>(vec3_f32, 3u);
     auto result = table->Lookup(BuiltinType::kDeterminant, utils::Vector{mat3_f32},
@@ -519,7 +519,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchOpenSizeMatrix) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* vec2_f32 = create<sem::Vector>(f32, 2u);
     auto* mat3x2_f32 = create<sem::Matrix>(vec2_f32, 3u);
     auto result = table->Lookup(BuiltinType::kDeterminant, utils::Vector{mat3x2_f32},
@@ -530,7 +530,7 @@
 
 TEST_F(IntrinsicTableTest, MatchDifferentArgsElementType_Builtin_ConstantEval) {
     auto* af = create<type::AbstractFloat>();
-    auto* bool_ = create<sem::Bool>();
+    auto* bool_ = create<type::Bool>();
     auto result = table->Lookup(BuiltinType::kSelect, utils::Vector{af, af, bool_},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_NE(result.sem, nullptr) << Diagnostics().str();
@@ -546,7 +546,7 @@
 
 TEST_F(IntrinsicTableTest, MatchDifferentArgsElementType_Builtin_RuntimeEval) {
     auto* af = create<type::AbstractFloat>();
-    auto* bool_ref = create<sem::Reference>(create<sem::Bool>(), ast::AddressSpace::kFunction,
+    auto* bool_ref = create<sem::Reference>(create<type::Bool>(), ast::AddressSpace::kFunction,
                                             ast::Access::kReadWrite);
     auto result = table->Lookup(BuiltinType::kSelect, utils::Vector{af, af, bool_ref},
                                 sem::EvaluationStage::kRuntime, Source{});
@@ -554,16 +554,16 @@
     ASSERT_EQ(Diagnostics().str(), "");
     EXPECT_EQ(result.sem->Stage(), sem::EvaluationStage::kConstant);
     EXPECT_EQ(result.sem->Type(), BuiltinType::kSelect);
-    EXPECT_TRUE(result.sem->ReturnType()->Is<sem::F32>());
+    EXPECT_TRUE(result.sem->ReturnType()->Is<type::F32>());
     ASSERT_EQ(result.sem->Parameters().Length(), 3u);
-    EXPECT_TRUE(result.sem->Parameters()[0]->Type()->Is<sem::F32>());
-    EXPECT_TRUE(result.sem->Parameters()[1]->Type()->Is<sem::F32>());
-    EXPECT_TRUE(result.sem->Parameters()[2]->Type()->Is<sem::Bool>());
+    EXPECT_TRUE(result.sem->Parameters()[0]->Type()->Is<type::F32>());
+    EXPECT_TRUE(result.sem->Parameters()[1]->Type()->Is<type::F32>());
+    EXPECT_TRUE(result.sem->Parameters()[2]->Type()->Is<type::Bool>());
 }
 
 TEST_F(IntrinsicTableTest, MatchDifferentArgsElementType_Binary_ConstantEval) {
     auto* ai = create<type::AbstractInt>();
-    auto* u32 = create<sem::U32>();
+    auto* u32 = create<type::U32>();
     auto result = table->Lookup(ast::BinaryOp::kShiftLeft, ai, u32, sem::EvaluationStage::kConstant,
                                 Source{}, false);
     ASSERT_NE(result.result, nullptr) << Diagnostics().str();
@@ -576,21 +576,21 @@
 
 TEST_F(IntrinsicTableTest, MatchDifferentArgsElementType_Binary_RuntimeEval) {
     auto* ai = create<type::AbstractInt>();
-    auto* u32 = create<sem::U32>();
+    auto* u32 = create<type::U32>();
     auto result = table->Lookup(ast::BinaryOp::kShiftLeft, ai, u32, sem::EvaluationStage::kRuntime,
                                 Source{}, false);
     ASSERT_NE(result.result, nullptr) << Diagnostics().str();
     ASSERT_NE(result.const_eval_fn, nullptr) << Diagnostics().str();
     ASSERT_EQ(Diagnostics().str(), "");
-    EXPECT_TRUE(result.result->Is<sem::I32>());
-    EXPECT_TRUE(result.lhs->Is<sem::I32>());
-    EXPECT_TRUE(result.rhs->Is<sem::U32>());
+    EXPECT_TRUE(result.result->Is<type::I32>());
+    EXPECT_TRUE(result.lhs->Is<type::I32>());
+    EXPECT_TRUE(result.rhs->Is<type::U32>());
 }
 
 TEST_F(IntrinsicTableTest, OverloadOrderByNumberOfParameters) {
     // None of the arguments match, so expect the overloads with 2 parameters to
     // come first
-    auto* bool_ = create<sem::Bool>();
+    auto* bool_ = create<type::Bool>();
     table->Lookup(BuiltinType::kTextureDimensions, utils::Vector{bool_, bool_},
                   sem::EvaluationStage::kConstant, Source{});
     ASSERT_EQ(Diagnostics().str(),
@@ -629,7 +629,7 @@
 
 TEST_F(IntrinsicTableTest, OverloadOrderByMatchingParameter) {
     auto* tex = create<type::DepthTexture>(ast::TextureDimension::k2d);
-    auto* bool_ = create<sem::Bool>();
+    auto* bool_ = create<type::Bool>();
     table->Lookup(BuiltinType::kTextureDimensions, utils::Vector{tex, bool_},
                   sem::EvaluationStage::kConstant, Source{});
     ASSERT_EQ(Diagnostics().str(),
@@ -667,9 +667,9 @@
 }
 
 TEST_F(IntrinsicTableTest, SameOverloadReturnsSameBuiltinPointer) {
-    auto* f32 = create<sem::F32>();
-    auto* vec2_f32 = create<sem::Vector>(create<sem::F32>(), 2u);
-    auto* bool_ = create<sem::Bool>();
+    auto* f32 = create<type::F32>();
+    auto* vec2_f32 = create<sem::Vector>(create<type::F32>(), 2u);
+    auto* bool_ = create<type::Bool>();
     auto a = table->Lookup(BuiltinType::kSelect, utils::Vector{f32, f32, bool_},
                            sem::EvaluationStage::kConstant, Source{});
     ASSERT_NE(a.sem, nullptr) << Diagnostics().str();
@@ -690,7 +690,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchUnaryOp) {
-    auto* i32 = create<sem::I32>();
+    auto* i32 = create<type::I32>();
     auto* vec3_i32 = create<sem::Vector>(i32, 3u);
     auto result = table->Lookup(ast::UnaryOp::kNegation, vec3_i32, sem::EvaluationStage::kConstant,
                                 Source{{12, 34}});
@@ -699,7 +699,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchUnaryOp) {
-    auto* bool_ = create<sem::Bool>();
+    auto* bool_ = create<type::Bool>();
     auto result = table->Lookup(ast::UnaryOp::kNegation, bool_, sem::EvaluationStage::kConstant,
                                 Source{{12, 34}});
     ASSERT_EQ(result.result, nullptr);
@@ -724,12 +724,12 @@
     auto result = table->Lookup(ast::UnaryOp::kNegation, ai, sem::EvaluationStage::kRuntime,
                                 Source{{12, 34}});
     EXPECT_NE(result.result, ai);
-    EXPECT_TRUE(result.result->Is<sem::I32>());
+    EXPECT_TRUE(result.result->Is<type::I32>());
     EXPECT_EQ(Diagnostics().str(), "");
 }
 
 TEST_F(IntrinsicTableTest, MatchBinaryOp) {
-    auto* i32 = create<sem::I32>();
+    auto* i32 = create<type::I32>();
     auto* vec3_i32 = create<sem::Vector>(i32, 3u);
     auto result = table->Lookup(ast::BinaryOp::kMultiply, i32, vec3_i32,
                                 sem::EvaluationStage::kConstant, Source{{12, 34}},
@@ -741,8 +741,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchBinaryOp) {
-    auto* f32 = create<sem::F32>();
-    auto* bool_ = create<sem::Bool>();
+    auto* f32 = create<type::F32>();
+    auto* bool_ = create<type::Bool>();
     auto result = table->Lookup(ast::BinaryOp::kMultiply, f32, bool_,
                                 sem::EvaluationStage::kConstant, Source{{12, 34}},
                                 /* is_compound */ false);
@@ -763,7 +763,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchCompoundOp) {
-    auto* i32 = create<sem::I32>();
+    auto* i32 = create<type::I32>();
     auto* vec3_i32 = create<sem::Vector>(i32, 3u);
     auto result = table->Lookup(ast::BinaryOp::kMultiply, i32, vec3_i32,
                                 sem::EvaluationStage::kConstant, Source{{12, 34}},
@@ -775,8 +775,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchCompoundOp) {
-    auto* f32 = create<sem::F32>();
-    auto* bool_ = create<sem::Bool>();
+    auto* f32 = create<type::F32>();
+    auto* bool_ = create<type::Bool>();
     auto result = table->Lookup(ast::BinaryOp::kMultiply, f32, bool_,
                                 sem::EvaluationStage::kConstant, Source{{12, 34}},
                                 /* is_compound */ true);
@@ -797,7 +797,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchTypeInitializerImplicit) {
-    auto* i32 = create<sem::I32>();
+    auto* i32 = create<type::I32>();
     auto* vec3_i32 = create<sem::Vector>(i32, 3u);
     auto result = table->Lookup(InitConvIntrinsic::kVec3, nullptr, utils::Vector{i32, i32, i32},
                                 sem::EvaluationStage::kConstant, Source{{12, 34}});
@@ -812,7 +812,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchTypeInitializerExplicit) {
-    auto* i32 = create<sem::I32>();
+    auto* i32 = create<type::I32>();
     auto* vec3_i32 = create<sem::Vector>(i32, 3u);
     auto result = table->Lookup(InitConvIntrinsic::kVec3, i32, utils::Vector{i32, i32, i32},
                                 sem::EvaluationStage::kConstant, Source{{12, 34}});
@@ -827,8 +827,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchTypeInitializerImplicit) {
-    auto* i32 = create<sem::I32>();
-    auto* f32 = create<sem::F32>();
+    auto* i32 = create<type::I32>();
+    auto* f32 = create<type::F32>();
     auto result = table->Lookup(InitConvIntrinsic::kVec3, nullptr, utils::Vector{i32, f32, i32},
                                 sem::EvaluationStage::kConstant, Source{{12, 34}});
     ASSERT_EQ(result.target, nullptr);
@@ -853,8 +853,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchTypeInitializerExplicit) {
-    auto* i32 = create<sem::I32>();
-    auto* f32 = create<sem::F32>();
+    auto* i32 = create<type::I32>();
+    auto* f32 = create<type::F32>();
     auto result = table->Lookup(InitConvIntrinsic::kVec3, i32, utils::Vector{i32, f32, i32},
                                 sem::EvaluationStage::kConstant, Source{{12, 34}});
     ASSERT_EQ(result.target, nullptr);
@@ -928,7 +928,7 @@
     auto* ai = create<type::AbstractInt>();
     auto result = table->Lookup(InitConvIntrinsic::kVec3, nullptr, utils::Vector{ai, ai, ai},
                                 sem::EvaluationStage::kRuntime, Source{{12, 34}});
-    auto* i32 = create<sem::I32>();
+    auto* i32 = create<type::I32>();
     auto* vec3_i32 = create<sem::Vector>(i32, 3u);
     ASSERT_NE(result.target, nullptr);
     EXPECT_EQ(result.target->Stage(), sem::EvaluationStage::kConstant);
@@ -942,9 +942,9 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchTypeConversion) {
-    auto* i32 = create<sem::I32>();
+    auto* i32 = create<type::I32>();
     auto* vec3_i32 = create<sem::Vector>(i32, 3u);
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* vec3_f32 = create<sem::Vector>(f32, 3u);
     auto result = table->Lookup(InitConvIntrinsic::kVec3, i32, utils::Vector{vec3_f32},
                                 sem::EvaluationStage::kConstant, Source{{12, 34}});
@@ -957,8 +957,8 @@
 
 TEST_F(IntrinsicTableTest, MismatchTypeConversion) {
     auto* arr =
-        create<sem::Array>(create<sem::U32>(), create<type::RuntimeArrayCount>(), 4u, 4u, 4u, 4u);
-    auto* f32 = create<sem::F32>();
+        create<sem::Array>(create<type::U32>(), create<type::RuntimeArrayCount>(), 4u, 4u, 4u, 4u);
+    auto* f32 = create<type::F32>();
     auto result = table->Lookup(InitConvIntrinsic::kVec3, f32, utils::Vector{arr},
                                 sem::EvaluationStage::kConstant, Source{{12, 34}});
     ASSERT_EQ(result.target, nullptr);
@@ -986,7 +986,7 @@
     auto* ai = create<type::AbstractInt>();
     auto* af = create<type::AbstractFloat>();
     auto* vec3_ai = create<sem::Vector>(ai, 3u);
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* vec3_f32 = create<sem::Vector>(f32, 3u);
     auto result = table->Lookup(InitConvIntrinsic::kVec3, af, utils::Vector{vec3_ai},
                                 sem::EvaluationStage::kConstant, Source{{12, 34}});
@@ -1003,8 +1003,8 @@
     auto* ai = create<type::AbstractInt>();
     auto* af = create<type::AbstractFloat>();
     auto* vec3_ai = create<sem::Vector>(ai, 3u);
-    auto* vec3_f32 = create<sem::Vector>(create<sem::F32>(), 3u);
-    auto* vec3_i32 = create<sem::Vector>(create<sem::I32>(), 3u);
+    auto* vec3_f32 = create<sem::Vector>(create<type::F32>(), 3u);
+    auto* vec3_i32 = create<sem::Vector>(create<type::I32>(), 3u);
     auto result = table->Lookup(InitConvIntrinsic::kVec3, af, utils::Vector{vec3_ai},
                                 sem::EvaluationStage::kRuntime, Source{{12, 34}});
     ASSERT_NE(result.target, nullptr);
@@ -1016,7 +1016,7 @@
 }
 
 TEST_F(IntrinsicTableTest, Err257Arguments) {  // crbug.com/1323605
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     utils::Vector<const type::Type*, 0> arg_tys;
     arg_tys.Resize(257, f32);
     auto result = table->Lookup(BuiltinType::kAbs, std::move(arg_tys),
@@ -1031,7 +1031,7 @@
     //    conv i32<T: scalar_no_i32>(T) -> i32
     // The first should win overload resolution.
     auto* ai = create<type::AbstractInt>();
-    auto* i32 = create<sem::I32>();
+    auto* i32 = create<type::I32>();
     auto result = table->Lookup(InitConvIntrinsic::kI32, nullptr, utils::Vector{ai},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_NE(result.target, nullptr);
diff --git a/src/tint/resolver/is_host_shareable_test.cc b/src/tint/resolver/is_host_shareable_test.cc
index c106020..51bc52b 100644
--- a/src/tint/resolver/is_host_shareable_test.cc
+++ b/src/tint/resolver/is_host_shareable_test.cc
@@ -24,54 +24,54 @@
 using ResolverIsHostShareable = ResolverTest;
 
 TEST_F(ResolverIsHostShareable, Void) {
-    EXPECT_FALSE(r()->IsHostShareable(create<sem::Void>()));
+    EXPECT_FALSE(r()->IsHostShareable(create<type::Void>()));
 }
 
 TEST_F(ResolverIsHostShareable, Bool) {
-    EXPECT_FALSE(r()->IsHostShareable(create<sem::Bool>()));
+    EXPECT_FALSE(r()->IsHostShareable(create<type::Bool>()));
 }
 
 TEST_F(ResolverIsHostShareable, NumericScalar) {
-    EXPECT_TRUE(r()->IsHostShareable(create<sem::I32>()));
-    EXPECT_TRUE(r()->IsHostShareable(create<sem::U32>()));
-    EXPECT_TRUE(r()->IsHostShareable(create<sem::F32>()));
-    EXPECT_TRUE(r()->IsHostShareable(create<sem::F16>()));
+    EXPECT_TRUE(r()->IsHostShareable(create<type::I32>()));
+    EXPECT_TRUE(r()->IsHostShareable(create<type::U32>()));
+    EXPECT_TRUE(r()->IsHostShareable(create<type::F32>()));
+    EXPECT_TRUE(r()->IsHostShareable(create<type::F16>()));
 }
 
 TEST_F(ResolverIsHostShareable, NumericVector) {
-    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<sem::I32>(), 2u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<sem::I32>(), 3u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<sem::I32>(), 4u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<sem::U32>(), 2u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<sem::U32>(), 3u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<sem::U32>(), 4u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<sem::F32>(), 2u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<sem::F32>(), 3u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<sem::F32>(), 4u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<sem::F16>(), 2u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<sem::F16>(), 3u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<sem::F16>(), 4u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<type::I32>(), 2u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<type::I32>(), 3u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<type::I32>(), 4u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<type::U32>(), 2u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<type::U32>(), 3u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<type::U32>(), 4u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<type::F32>(), 2u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<type::F32>(), 3u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<type::F32>(), 4u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<type::F16>(), 2u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<type::F16>(), 3u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<sem::Vector>(create<type::F16>(), 4u)));
 }
 
 TEST_F(ResolverIsHostShareable, BoolVector) {
-    EXPECT_FALSE(r()->IsHostShareable(create<sem::Vector>(create<sem::Bool>(), 2u)));
-    EXPECT_FALSE(r()->IsHostShareable(create<sem::Vector>(create<sem::Bool>(), 3u)));
-    EXPECT_FALSE(r()->IsHostShareable(create<sem::Vector>(create<sem::Bool>(), 4u)));
-    EXPECT_FALSE(r()->IsHostShareable(create<sem::Vector>(create<sem::Bool>(), 2u)));
-    EXPECT_FALSE(r()->IsHostShareable(create<sem::Vector>(create<sem::Bool>(), 3u)));
-    EXPECT_FALSE(r()->IsHostShareable(create<sem::Vector>(create<sem::Bool>(), 4u)));
-    EXPECT_FALSE(r()->IsHostShareable(create<sem::Vector>(create<sem::Bool>(), 2u)));
-    EXPECT_FALSE(r()->IsHostShareable(create<sem::Vector>(create<sem::Bool>(), 3u)));
-    EXPECT_FALSE(r()->IsHostShareable(create<sem::Vector>(create<sem::Bool>(), 4u)));
+    EXPECT_FALSE(r()->IsHostShareable(create<sem::Vector>(create<type::Bool>(), 2u)));
+    EXPECT_FALSE(r()->IsHostShareable(create<sem::Vector>(create<type::Bool>(), 3u)));
+    EXPECT_FALSE(r()->IsHostShareable(create<sem::Vector>(create<type::Bool>(), 4u)));
+    EXPECT_FALSE(r()->IsHostShareable(create<sem::Vector>(create<type::Bool>(), 2u)));
+    EXPECT_FALSE(r()->IsHostShareable(create<sem::Vector>(create<type::Bool>(), 3u)));
+    EXPECT_FALSE(r()->IsHostShareable(create<sem::Vector>(create<type::Bool>(), 4u)));
+    EXPECT_FALSE(r()->IsHostShareable(create<sem::Vector>(create<type::Bool>(), 2u)));
+    EXPECT_FALSE(r()->IsHostShareable(create<sem::Vector>(create<type::Bool>(), 3u)));
+    EXPECT_FALSE(r()->IsHostShareable(create<sem::Vector>(create<type::Bool>(), 4u)));
 }
 
 TEST_F(ResolverIsHostShareable, Matrix) {
-    auto* vec2_f32 = create<sem::Vector>(create<sem::F32>(), 2u);
-    auto* vec3_f32 = create<sem::Vector>(create<sem::F32>(), 3u);
-    auto* vec4_f32 = create<sem::Vector>(create<sem::F32>(), 4u);
-    auto* vec2_f16 = create<sem::Vector>(create<sem::F16>(), 2u);
-    auto* vec3_f16 = create<sem::Vector>(create<sem::F16>(), 3u);
-    auto* vec4_f16 = create<sem::Vector>(create<sem::F16>(), 4u);
+    auto* vec2_f32 = create<sem::Vector>(create<type::F32>(), 2u);
+    auto* vec3_f32 = create<sem::Vector>(create<type::F32>(), 3u);
+    auto* vec4_f32 = create<sem::Vector>(create<type::F32>(), 4u);
+    auto* vec2_f16 = create<sem::Vector>(create<type::F16>(), 2u);
+    auto* vec3_f16 = create<sem::Vector>(create<type::F16>(), 3u);
+    auto* vec4_f16 = create<sem::Vector>(create<type::F16>(), 4u);
 
     EXPECT_TRUE(r()->IsHostShareable(create<sem::Matrix>(vec2_f32, 2u)));
     EXPECT_TRUE(r()->IsHostShareable(create<sem::Matrix>(vec2_f32, 3u)));
@@ -95,25 +95,25 @@
 }
 
 TEST_F(ResolverIsHostShareable, Pointer) {
-    auto* ptr = create<sem::Pointer>(create<sem::I32>(), ast::AddressSpace::kPrivate,
+    auto* ptr = create<sem::Pointer>(create<type::I32>(), ast::AddressSpace::kPrivate,
                                      ast::Access::kReadWrite);
     EXPECT_FALSE(r()->IsHostShareable(ptr));
 }
 
 TEST_F(ResolverIsHostShareable, Atomic) {
-    EXPECT_TRUE(r()->IsHostShareable(create<sem::Atomic>(create<sem::I32>())));
-    EXPECT_TRUE(r()->IsHostShareable(create<sem::Atomic>(create<sem::U32>())));
+    EXPECT_TRUE(r()->IsHostShareable(create<sem::Atomic>(create<type::I32>())));
+    EXPECT_TRUE(r()->IsHostShareable(create<sem::Atomic>(create<type::U32>())));
 }
 
 TEST_F(ResolverIsHostShareable, ArraySizedOfHostShareable) {
-    auto* arr = create<sem::Array>(create<sem::I32>(), create<type::ConstantArrayCount>(5u), 4u,
+    auto* arr = create<sem::Array>(create<type::I32>(), create<type::ConstantArrayCount>(5u), 4u,
                                    20u, 4u, 4u);
     EXPECT_TRUE(r()->IsHostShareable(arr));
 }
 
 TEST_F(ResolverIsHostShareable, ArrayUnsizedOfHostShareable) {
     auto* arr =
-        create<sem::Array>(create<sem::I32>(), create<type::RuntimeArrayCount>(), 4u, 4u, 4u, 4u);
+        create<sem::Array>(create<type::I32>(), create<type::RuntimeArrayCount>(), 4u, 4u, 4u, 4u);
     EXPECT_TRUE(r()->IsHostShareable(arr));
 }
 
diff --git a/src/tint/resolver/is_storeable_test.cc b/src/tint/resolver/is_storeable_test.cc
index 9c80e0a..4f7edc4 100644
--- a/src/tint/resolver/is_storeable_test.cc
+++ b/src/tint/resolver/is_storeable_test.cc
@@ -24,39 +24,39 @@
 using ResolverIsStorableTest = ResolverTest;
 
 TEST_F(ResolverIsStorableTest, Void) {
-    EXPECT_FALSE(r()->IsStorable(create<sem::Void>()));
+    EXPECT_FALSE(r()->IsStorable(create<type::Void>()));
 }
 
 TEST_F(ResolverIsStorableTest, Scalar) {
-    EXPECT_TRUE(r()->IsStorable(create<sem::Bool>()));
-    EXPECT_TRUE(r()->IsStorable(create<sem::I32>()));
-    EXPECT_TRUE(r()->IsStorable(create<sem::U32>()));
-    EXPECT_TRUE(r()->IsStorable(create<sem::F32>()));
-    EXPECT_TRUE(r()->IsStorable(create<sem::F16>()));
+    EXPECT_TRUE(r()->IsStorable(create<type::Bool>()));
+    EXPECT_TRUE(r()->IsStorable(create<type::I32>()));
+    EXPECT_TRUE(r()->IsStorable(create<type::U32>()));
+    EXPECT_TRUE(r()->IsStorable(create<type::F32>()));
+    EXPECT_TRUE(r()->IsStorable(create<type::F16>()));
 }
 
 TEST_F(ResolverIsStorableTest, Vector) {
-    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<sem::I32>(), 2u)));
-    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<sem::I32>(), 3u)));
-    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<sem::I32>(), 4u)));
-    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<sem::U32>(), 2u)));
-    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<sem::U32>(), 3u)));
-    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<sem::U32>(), 4u)));
-    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<sem::F32>(), 2u)));
-    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<sem::F32>(), 3u)));
-    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<sem::F32>(), 4u)));
-    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<sem::F16>(), 2u)));
-    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<sem::F16>(), 3u)));
-    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<sem::F16>(), 4u)));
+    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<type::I32>(), 2u)));
+    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<type::I32>(), 3u)));
+    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<type::I32>(), 4u)));
+    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<type::U32>(), 2u)));
+    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<type::U32>(), 3u)));
+    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<type::U32>(), 4u)));
+    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<type::F32>(), 2u)));
+    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<type::F32>(), 3u)));
+    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<type::F32>(), 4u)));
+    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<type::F16>(), 2u)));
+    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<type::F16>(), 3u)));
+    EXPECT_TRUE(r()->IsStorable(create<sem::Vector>(create<type::F16>(), 4u)));
 }
 
 TEST_F(ResolverIsStorableTest, Matrix) {
-    auto* vec2_f32 = create<sem::Vector>(create<sem::F32>(), 2u);
-    auto* vec3_f32 = create<sem::Vector>(create<sem::F32>(), 3u);
-    auto* vec4_f32 = create<sem::Vector>(create<sem::F32>(), 4u);
-    auto* vec2_f16 = create<sem::Vector>(create<sem::F16>(), 2u);
-    auto* vec3_f16 = create<sem::Vector>(create<sem::F16>(), 3u);
-    auto* vec4_f16 = create<sem::Vector>(create<sem::F16>(), 4u);
+    auto* vec2_f32 = create<sem::Vector>(create<type::F32>(), 2u);
+    auto* vec3_f32 = create<sem::Vector>(create<type::F32>(), 3u);
+    auto* vec4_f32 = create<sem::Vector>(create<type::F32>(), 4u);
+    auto* vec2_f16 = create<sem::Vector>(create<type::F16>(), 2u);
+    auto* vec3_f16 = create<sem::Vector>(create<type::F16>(), 3u);
+    auto* vec4_f16 = create<sem::Vector>(create<type::F16>(), 4u);
     EXPECT_TRUE(r()->IsStorable(create<sem::Matrix>(vec2_f32, 2u)));
     EXPECT_TRUE(r()->IsStorable(create<sem::Matrix>(vec2_f32, 3u)));
     EXPECT_TRUE(r()->IsStorable(create<sem::Matrix>(vec2_f32, 4u)));
@@ -78,25 +78,25 @@
 }
 
 TEST_F(ResolverIsStorableTest, Pointer) {
-    auto* ptr = create<sem::Pointer>(create<sem::I32>(), ast::AddressSpace::kPrivate,
+    auto* ptr = create<sem::Pointer>(create<type::I32>(), ast::AddressSpace::kPrivate,
                                      ast::Access::kReadWrite);
     EXPECT_FALSE(r()->IsStorable(ptr));
 }
 
 TEST_F(ResolverIsStorableTest, Atomic) {
-    EXPECT_TRUE(r()->IsStorable(create<sem::Atomic>(create<sem::I32>())));
-    EXPECT_TRUE(r()->IsStorable(create<sem::Atomic>(create<sem::U32>())));
+    EXPECT_TRUE(r()->IsStorable(create<sem::Atomic>(create<type::I32>())));
+    EXPECT_TRUE(r()->IsStorable(create<sem::Atomic>(create<type::U32>())));
 }
 
 TEST_F(ResolverIsStorableTest, ArraySizedOfStorable) {
-    auto* arr = create<sem::Array>(create<sem::I32>(), create<type::ConstantArrayCount>(5u), 4u,
+    auto* arr = create<sem::Array>(create<type::I32>(), create<type::ConstantArrayCount>(5u), 4u,
                                    20u, 4u, 4u);
     EXPECT_TRUE(r()->IsStorable(arr));
 }
 
 TEST_F(ResolverIsStorableTest, ArrayUnsizedOfStorable) {
     auto* arr =
-        create<sem::Array>(create<sem::I32>(), create<type::RuntimeArrayCount>(), 4u, 4u, 4u, 4u);
+        create<sem::Array>(create<type::I32>(), create<type::RuntimeArrayCount>(), 4u, 4u, 4u, 4u);
     EXPECT_TRUE(r()->IsStorable(arr));
 }
 
diff --git a/src/tint/resolver/materialize_test.cc b/src/tint/resolver/materialize_test.cc
index d9425609..4451f9d 100644
--- a/src/tint/resolver/materialize_test.cc
+++ b/src/tint/resolver/materialize_test.cc
@@ -1254,7 +1254,7 @@
     auto* materialize = sem->As<sem::Materialize>();
     ASSERT_TRUE(materialize->Type()->Is<sem::Struct>());
     auto* concrete_str = materialize->Type()->As<sem::Struct>();
-    ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<sem::F32>());
+    ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<type::F32>());
     ASSERT_TRUE(materialize->Expr()->Type()->Is<sem::Struct>());
     auto* abstract_str = materialize->Expr()->Type()->As<sem::Struct>();
     ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<type::AbstractFloat>());
@@ -1271,7 +1271,7 @@
     ASSERT_TRUE(materialize->Type()->Is<sem::Struct>());
     auto* concrete_str = materialize->Type()->As<sem::Struct>();
     ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<sem::Vector>());
-    ASSERT_TRUE(concrete_str->Members()[0]->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+    ASSERT_TRUE(concrete_str->Members()[0]->Type()->As<sem::Vector>()->type()->Is<type::F32>());
     ASSERT_TRUE(materialize->Expr()->Type()->Is<sem::Struct>());
     auto* abstract_str = materialize->Expr()->Type()->As<sem::Struct>();
     ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<sem::Vector>());
@@ -1292,7 +1292,7 @@
     auto* materialize = sem->As<sem::Materialize>();
     ASSERT_TRUE(materialize->Type()->Is<sem::Struct>());
     auto* concrete_str = materialize->Type()->As<sem::Struct>();
-    ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<sem::F16>());
+    ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<type::F16>());
     ASSERT_TRUE(materialize->Expr()->Type()->Is<sem::Struct>());
     auto* abstract_str = materialize->Expr()->Type()->As<sem::Struct>();
     ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<type::AbstractFloat>());
@@ -1312,7 +1312,7 @@
     ASSERT_TRUE(materialize->Type()->Is<sem::Struct>());
     auto* concrete_str = materialize->Type()->As<sem::Struct>();
     ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<sem::Vector>());
-    ASSERT_TRUE(concrete_str->Members()[0]->Type()->As<sem::Vector>()->type()->Is<sem::F16>());
+    ASSERT_TRUE(concrete_str->Members()[0]->Type()->As<sem::Vector>()->type()->Is<type::F16>());
     ASSERT_TRUE(materialize->Expr()->Type()->Is<sem::Struct>());
     auto* abstract_str = materialize->Expr()->Type()->As<sem::Struct>();
     ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<sem::Vector>());
@@ -1330,8 +1330,8 @@
     auto* materialize = sem->As<sem::Materialize>();
     ASSERT_TRUE(materialize->Type()->Is<sem::Struct>());
     auto* concrete_str = materialize->Type()->As<sem::Struct>();
-    ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<sem::F32>());
-    ASSERT_TRUE(concrete_str->Members()[1]->Type()->Is<sem::I32>());
+    ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<type::F32>());
+    ASSERT_TRUE(concrete_str->Members()[1]->Type()->Is<type::I32>());
     ASSERT_TRUE(materialize->Expr()->Type()->Is<sem::Struct>());
     auto* abstract_str = materialize->Expr()->Type()->As<sem::Struct>();
     ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<type::AbstractFloat>());
@@ -1350,8 +1350,8 @@
     auto* concrete_str = materialize->Type()->As<sem::Struct>();
     ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<sem::Vector>());
     ASSERT_TRUE(concrete_str->Members()[1]->Type()->Is<sem::Vector>());
-    ASSERT_TRUE(concrete_str->Members()[0]->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
-    ASSERT_TRUE(concrete_str->Members()[1]->Type()->As<sem::Vector>()->type()->Is<sem::I32>());
+    ASSERT_TRUE(concrete_str->Members()[0]->Type()->As<sem::Vector>()->type()->Is<type::F32>());
+    ASSERT_TRUE(concrete_str->Members()[1]->Type()->As<sem::Vector>()->type()->Is<type::I32>());
     ASSERT_TRUE(materialize->Expr()->Type()->Is<sem::Struct>());
     auto* abstract_str = materialize->Expr()->Type()->As<sem::Struct>();
     ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<sem::Vector>());
@@ -1374,8 +1374,8 @@
     auto* materialize = sem->As<sem::Materialize>();
     ASSERT_TRUE(materialize->Type()->Is<sem::Struct>());
     auto* concrete_str = materialize->Type()->As<sem::Struct>();
-    ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<sem::F16>());
-    ASSERT_TRUE(concrete_str->Members()[1]->Type()->Is<sem::I32>());
+    ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<type::F16>());
+    ASSERT_TRUE(concrete_str->Members()[1]->Type()->Is<type::I32>());
     ASSERT_TRUE(materialize->Expr()->Type()->Is<sem::Struct>());
     auto* abstract_str = materialize->Expr()->Type()->As<sem::Struct>();
     ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<type::AbstractFloat>());
@@ -1397,8 +1397,8 @@
     auto* concrete_str = materialize->Type()->As<sem::Struct>();
     ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<sem::Vector>());
     ASSERT_TRUE(concrete_str->Members()[1]->Type()->Is<sem::Vector>());
-    ASSERT_TRUE(concrete_str->Members()[0]->Type()->As<sem::Vector>()->type()->Is<sem::F16>());
-    ASSERT_TRUE(concrete_str->Members()[1]->Type()->As<sem::Vector>()->type()->Is<sem::I32>());
+    ASSERT_TRUE(concrete_str->Members()[0]->Type()->As<sem::Vector>()->type()->Is<type::F16>());
+    ASSERT_TRUE(concrete_str->Members()[1]->Type()->As<sem::Vector>()->type()->Is<type::I32>());
     ASSERT_TRUE(materialize->Expr()->Type()->Is<sem::Struct>());
     auto* abstract_str = materialize->Expr()->Type()->As<sem::Struct>();
     ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<sem::Vector>());
diff --git a/src/tint/resolver/ptr_ref_test.cc b/src/tint/resolver/ptr_ref_test.cc
index a42d554..872bcdc 100644
--- a/src/tint/resolver/ptr_ref_test.cc
+++ b/src/tint/resolver/ptr_ref_test.cc
@@ -37,7 +37,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_TRUE(TypeOf(expr)->Is<sem::Pointer>());
-    EXPECT_TRUE(TypeOf(expr)->As<sem::Pointer>()->StoreType()->Is<sem::I32>());
+    EXPECT_TRUE(TypeOf(expr)->As<sem::Pointer>()->StoreType()->Is<type::I32>());
     EXPECT_EQ(TypeOf(expr)->As<sem::Pointer>()->AddressSpace(), ast::AddressSpace::kFunction);
 }
 
@@ -53,7 +53,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_TRUE(TypeOf(expr)->Is<sem::Reference>());
-    EXPECT_TRUE(TypeOf(expr)->As<sem::Reference>()->StoreType()->Is<sem::I32>());
+    EXPECT_TRUE(TypeOf(expr)->As<sem::Reference>()->StoreType()->Is<type::I32>());
 }
 
 TEST_F(ResolverPtrRefTest, DefaultPtrAddressSpace) {
diff --git a/src/tint/resolver/resolver.cc b/src/tint/resolver/resolver.cc
index 18a6f59..bf12325 100644
--- a/src/tint/resolver/resolver.cc
+++ b/src/tint/resolver/resolver.cc
@@ -203,19 +203,19 @@
     Mark(ty);
     auto* s = Switch(
         ty,  //
-        [&](const ast::Void*) { return builder_->create<sem::Void>(); },
-        [&](const ast::Bool*) { return builder_->create<sem::Bool>(); },
-        [&](const ast::I32*) { return builder_->create<sem::I32>(); },
-        [&](const ast::U32*) { return builder_->create<sem::U32>(); },
-        [&](const ast::F16* t) -> sem::F16* {
+        [&](const ast::Void*) { return builder_->create<type::Void>(); },
+        [&](const ast::Bool*) { return builder_->create<type::Bool>(); },
+        [&](const ast::I32*) { return builder_->create<type::I32>(); },
+        [&](const ast::U32*) { return builder_->create<type::U32>(); },
+        [&](const ast::F16* t) -> type::F16* {
             // Validate if f16 type is allowed.
             if (!enabled_extensions_.Contains(ast::Extension::kF16)) {
                 AddError("f16 used without 'f16' extension enabled", t->source);
                 return nullptr;
             }
-            return builder_->create<sem::F16>();
+            return builder_->create<type::F16>();
         },
-        [&](const ast::F32*) { return builder_->create<sem::F32>(); },
+        [&](const ast::F32*) { return builder_->create<type::F32>(); },
         [&](const ast::Vector* t) -> sem::Vector* {
             if (!t->type) {
                 AddError("missing vector element type", t->source.End());
@@ -481,7 +481,7 @@
         if (!materialized) {
             return nullptr;
         }
-        if (!materialized->Type()->IsAnyOf<sem::I32, sem::U32>()) {
+        if (!materialized->Type()->IsAnyOf<type::I32, type::U32>()) {
             AddError("@id must be an i32 or u32 value", id_attr->source);
             return nullptr;
         }
@@ -661,7 +661,7 @@
                 if (!materialized) {
                     return nullptr;
                 }
-                if (!materialized->Type()->IsAnyOf<sem::I32, sem::U32>()) {
+                if (!materialized->Type()->IsAnyOf<type::I32, type::U32>()) {
                     AddError("@binding must be an i32 or u32 value", attr->source);
                     return nullptr;
                 }
@@ -685,7 +685,7 @@
                 if (!materialized) {
                     return nullptr;
                 }
-                if (!materialized->Type()->IsAnyOf<sem::I32, sem::U32>()) {
+                if (!materialized->Type()->IsAnyOf<type::I32, type::U32>()) {
                     AddError("@group must be an i32 or u32 value", attr->source);
                     return nullptr;
                 }
@@ -809,7 +809,7 @@
         return utils::Failure;
     }
 
-    if (!materialized->Type()->IsAnyOf<sem::I32, sem::U32>()) {
+    if (!materialized->Type()->IsAnyOf<type::I32, type::U32>()) {
         AddError("@location must be an i32 or u32 value", attr->source);
         return utils::Failure;
     }
@@ -947,7 +947,7 @@
         return nullptr;
     }
     auto* cond = expr->ConstantValue();
-    if (auto* ty = cond->Type(); !ty->Is<sem::Bool>()) {
+    if (auto* ty = cond->Type(); !ty->Is<type::Bool>()) {
         AddError(
             "static assertion condition must be a bool, got '" + builder_->FriendlyName(ty) + "'",
             assertion->condition->source);
@@ -1018,7 +1018,7 @@
             return nullptr;
         }
     } else {
-        return_type = builder_->create<sem::Void>();
+        return_type = builder_->create<type::Void>();
     }
 
     // Determine if the return type has a location
@@ -1155,7 +1155,7 @@
             return false;
         }
         auto* ty = expr->Type();
-        if (!ty->IsAnyOf<sem::I32, sem::U32, type::AbstractInt>()) {
+        if (!ty->IsAnyOf<type::I32, type::U32, type::AbstractInt>()) {
             AddError(kErrBadExpr, value->source);
             return false;
         }
@@ -1179,7 +1179,7 @@
 
     // If all arguments are abstract-integers, then materialize to i32.
     if (common_ty->Is<type::AbstractInt>()) {
-        common_ty = builder_->create<sem::I32>();
+        common_ty = builder_->create<type::I32>();
     }
 
     for (size_t i = 0; i < args.Length(); i++) {
@@ -1293,7 +1293,7 @@
                 if (!materialized) {
                     return false;
                 }
-                if (!materialized->Type()->IsAnyOf<sem::I32, sem::U32>()) {
+                if (!materialized->Type()->IsAnyOf<type::I32, type::U32>()) {
                     AddError("case selector must be an i32 or u32 value", sel->source);
                     return false;
                 }
@@ -1542,7 +1542,7 @@
             },
             [&](const ast::UnaryOpExpression* unary) -> sem::Expression* { return UnaryOp(unary); },
             [&](const ast::PhonyExpression*) -> sem::Expression* {
-                return builder_->create<sem::Expression>(expr, builder_->create<sem::Void>(),
+                return builder_->create<sem::Expression>(expr, builder_->create<type::Void>(),
                                                          sem::EvaluationStage::kRuntime,
                                                          current_statement_,
                                                          /* constant_value */ nullptr,
@@ -1716,8 +1716,8 @@
 const type::Type* Resolver::ConcreteType(const type::Type* ty,
                                          const type::Type* target_ty,
                                          const Source& source) {
-    auto i32 = [&] { return builder_->create<sem::I32>(); };
-    auto f32 = [&] { return builder_->create<sem::F32>(); };
+    auto i32 = [&] { return builder_->create<type::I32>(); };
+    auto f32 = [&] { return builder_->create<type::F32>(); };
     auto i32v = [&](uint32_t width) { return builder_->create<sem::Vector>(i32(), width); };
     auto f32v = [&](uint32_t width) { return builder_->create<sem::Vector>(f32(), width); };
     auto f32m = [&](uint32_t columns, uint32_t rows) {
@@ -1883,7 +1883,7 @@
     }
 
     auto* idx_ty = idx->Type()->UnwrapRef();
-    if (!idx_ty->IsAnyOf<sem::I32, sem::U32>()) {
+    if (!idx_ty->IsAnyOf<type::I32, type::U32>()) {
         AddError("index must be of type 'i32' or 'u32', found: '" + sem_.TypeNameOf(idx_ty) + "'",
                  idx->Declaration()->source);
         return nullptr;
@@ -2040,11 +2040,11 @@
             [&](const sem::Matrix* m) {
                 return ct_init_or_conv(MatrixInitConvIntrinsic(m->columns(), m->rows()), m->type());
             },
-            [&](const sem::I32*) { return ct_init_or_conv(InitConvIntrinsic::kI32, nullptr); },
-            [&](const sem::U32*) { return ct_init_or_conv(InitConvIntrinsic::kU32, nullptr); },
-            [&](const sem::F16*) { return ct_init_or_conv(InitConvIntrinsic::kF16, nullptr); },
-            [&](const sem::F32*) { return ct_init_or_conv(InitConvIntrinsic::kF32, nullptr); },
-            [&](const sem::Bool*) { return ct_init_or_conv(InitConvIntrinsic::kBool, nullptr); },
+            [&](const type::I32*) { return ct_init_or_conv(InitConvIntrinsic::kI32, nullptr); },
+            [&](const type::U32*) { return ct_init_or_conv(InitConvIntrinsic::kU32, nullptr); },
+            [&](const type::F16*) { return ct_init_or_conv(InitConvIntrinsic::kF16, nullptr); },
+            [&](const type::F32*) { return ct_init_or_conv(InitConvIntrinsic::kF32, nullptr); },
+            [&](const type::Bool*) { return ct_init_or_conv(InitConvIntrinsic::kBool, nullptr); },
             [&](const sem::Array* arr) -> sem::Call* {
                 auto* call_target = array_inits_.GetOrCreate(
                     ArrayInitializerSig{{arr, args.Length(), args_stage}},
@@ -2351,29 +2351,29 @@
     auto& b = *builder_;
     switch (ParseTypeAlias(name)) {
         case TypeAlias::kVec2F:
-            return b.create<sem::Vector>(b.create<sem::F32>(), 2u);
+            return b.create<sem::Vector>(b.create<type::F32>(), 2u);
         case TypeAlias::kVec3F:
-            return b.create<sem::Vector>(b.create<sem::F32>(), 3u);
+            return b.create<sem::Vector>(b.create<type::F32>(), 3u);
         case TypeAlias::kVec4F:
-            return b.create<sem::Vector>(b.create<sem::F32>(), 4u);
+            return b.create<sem::Vector>(b.create<type::F32>(), 4u);
         case TypeAlias::kVec2H:
-            return b.create<sem::Vector>(b.create<sem::F16>(), 2u);
+            return b.create<sem::Vector>(b.create<type::F16>(), 2u);
         case TypeAlias::kVec3H:
-            return b.create<sem::Vector>(b.create<sem::F16>(), 3u);
+            return b.create<sem::Vector>(b.create<type::F16>(), 3u);
         case TypeAlias::kVec4H:
-            return b.create<sem::Vector>(b.create<sem::F16>(), 4u);
+            return b.create<sem::Vector>(b.create<type::F16>(), 4u);
         case TypeAlias::kVec2I:
-            return b.create<sem::Vector>(b.create<sem::I32>(), 2u);
+            return b.create<sem::Vector>(b.create<type::I32>(), 2u);
         case TypeAlias::kVec3I:
-            return b.create<sem::Vector>(b.create<sem::I32>(), 3u);
+            return b.create<sem::Vector>(b.create<type::I32>(), 3u);
         case TypeAlias::kVec4I:
-            return b.create<sem::Vector>(b.create<sem::I32>(), 4u);
+            return b.create<sem::Vector>(b.create<type::I32>(), 4u);
         case TypeAlias::kVec2U:
-            return b.create<sem::Vector>(b.create<sem::U32>(), 2u);
+            return b.create<sem::Vector>(b.create<type::U32>(), 2u);
         case TypeAlias::kVec3U:
-            return b.create<sem::Vector>(b.create<sem::U32>(), 3u);
+            return b.create<sem::Vector>(b.create<type::U32>(), 3u);
         case TypeAlias::kVec4U:
-            return b.create<sem::Vector>(b.create<sem::U32>(), 4u);
+            return b.create<sem::Vector>(b.create<type::U32>(), 4u);
         case TypeAlias::kUndefined:
             break;
     }
@@ -2485,9 +2485,9 @@
                 case ast::IntLiteralExpression::Suffix::kNone:
                     return builder_->create<type::AbstractInt>();
                 case ast::IntLiteralExpression::Suffix::kI:
-                    return builder_->create<sem::I32>();
+                    return builder_->create<type::I32>();
                 case ast::IntLiteralExpression::Suffix::kU:
-                    return builder_->create<sem::U32>();
+                    return builder_->create<type::U32>();
             }
             return nullptr;
         },
@@ -2496,13 +2496,13 @@
                 case ast::FloatLiteralExpression::Suffix::kNone:
                     return builder_->create<type::AbstractFloat>();
                 case ast::FloatLiteralExpression::Suffix::kF:
-                    return builder_->create<sem::F32>();
+                    return builder_->create<type::F32>();
                 case ast::FloatLiteralExpression::Suffix::kH:
-                    return builder_->create<sem::F16>();
+                    return builder_->create<type::F16>();
             }
             return nullptr;
         },
-        [&](const ast::BoolLiteralExpression*) { return builder_->create<sem::Bool>(); },
+        [&](const ast::BoolLiteralExpression*) { return builder_->create<type::Bool>(); },
         [&](Default) { return nullptr; });
 
     if (ty == nullptr) {
@@ -2511,7 +2511,7 @@
         return nullptr;
     }
 
-    if ((ty->Is<sem::F16>()) && (!enabled_extensions_.Contains(tint::ast::Extension::kF16))) {
+    if ((ty->Is<type::F16>()) && (!enabled_extensions_.Contains(tint::ast::Extension::kF16))) {
         AddError("f16 literal used without 'f16' extension enabled", literal->source);
         return nullptr;
     }
@@ -3190,7 +3190,7 @@
                     if (!materialized) {
                         return false;
                     }
-                    if (!materialized->Type()->IsAnyOf<sem::I32, sem::U32>()) {
+                    if (!materialized->Type()->IsAnyOf<type::I32, type::U32>()) {
                         AddError("@align must be an i32 or u32 value", a->source);
                         return false;
                     }
@@ -3219,7 +3219,7 @@
                     if (!materialized) {
                         return false;
                     }
-                    if (!materialized->Type()->IsAnyOf<sem::U32, sem::I32>()) {
+                    if (!materialized->Type()->IsAnyOf<type::U32, type::I32>()) {
                         AddError("@size must be an i32 or u32 value", s->source);
                         return false;
                     }
@@ -3344,7 +3344,7 @@
             if (!expr) {
                 return false;
             }
-            if (auto* ret_ty = current_function_->ReturnType(); !ret_ty->Is<sem::Void>()) {
+            if (auto* ret_ty = current_function_->ReturnType(); !ret_ty->Is<type::Void>()) {
                 expr = Materialize(expr, ret_ty);
                 if (!expr) {
                     return false;
@@ -3355,7 +3355,7 @@
 
             RegisterLoadIfNeeded(expr);
         } else {
-            value_ty = builder_->create<sem::Void>();
+            value_ty = builder_->create<type::Void>();
         }
 
         // Validate after processing the return value expression so that its type
@@ -3401,7 +3401,7 @@
         if (!common_ty || !common_ty->is_integer_scalar()) {
             // No common type found or the common type was abstract.
             // Pick i32 and let validation deal with any mismatches.
-            common_ty = builder_->create<sem::I32>();
+            common_ty = builder_->create<type::I32>();
         }
         cond = Materialize(cond, common_ty);
         if (!cond) {
diff --git a/src/tint/resolver/resolver_test.cc b/src/tint/resolver/resolver_test.cc
index 73a61a7..7f3ea6a 100644
--- a/src/tint/resolver/resolver_test.cc
+++ b/src/tint/resolver/resolver_test.cc
@@ -99,8 +99,8 @@
     ASSERT_NE(TypeOf(lhs), nullptr);
     ASSERT_NE(TypeOf(rhs), nullptr);
 
-    EXPECT_TRUE(TypeOf(lhs)->UnwrapRef()->Is<sem::F32>());
-    EXPECT_TRUE(TypeOf(rhs)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(lhs)->UnwrapRef()->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(rhs)->Is<type::F32>());
     EXPECT_EQ(StmtOf(lhs), assign);
     EXPECT_EQ(StmtOf(rhs), assign);
 }
@@ -123,8 +123,8 @@
 
     ASSERT_NE(TypeOf(lhs), nullptr);
     ASSERT_NE(TypeOf(rhs), nullptr);
-    EXPECT_TRUE(TypeOf(lhs)->UnwrapRef()->Is<sem::F32>());
-    EXPECT_TRUE(TypeOf(rhs)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(lhs)->UnwrapRef()->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(rhs)->Is<type::F32>());
     EXPECT_EQ(StmtOf(lhs), assign);
     EXPECT_EQ(StmtOf(rhs), assign);
     EXPECT_EQ(BlockOf(assign), block);
@@ -156,8 +156,8 @@
 
     ASSERT_NE(TypeOf(lhs), nullptr);
     ASSERT_NE(TypeOf(rhs), nullptr);
-    EXPECT_TRUE(TypeOf(lhs)->UnwrapRef()->Is<sem::F32>());
-    EXPECT_TRUE(TypeOf(rhs)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(lhs)->UnwrapRef()->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(rhs)->Is<type::F32>());
     EXPECT_EQ(StmtOf(lhs), assign);
     EXPECT_EQ(StmtOf(rhs), assign);
     EXPECT_EQ(BlockOf(lhs), block);
@@ -191,11 +191,11 @@
     ASSERT_NE(TypeOf(else_rhs), nullptr);
     ASSERT_NE(TypeOf(lhs), nullptr);
     ASSERT_NE(TypeOf(rhs), nullptr);
-    EXPECT_TRUE(TypeOf(stmt->condition)->Is<sem::Bool>());
-    EXPECT_TRUE(TypeOf(else_lhs)->UnwrapRef()->Is<sem::F32>());
-    EXPECT_TRUE(TypeOf(else_rhs)->Is<sem::F32>());
-    EXPECT_TRUE(TypeOf(lhs)->UnwrapRef()->Is<sem::F32>());
-    EXPECT_TRUE(TypeOf(rhs)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(stmt->condition)->Is<type::Bool>());
+    EXPECT_TRUE(TypeOf(else_lhs)->UnwrapRef()->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(else_rhs)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(lhs)->UnwrapRef()->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(rhs)->Is<type::F32>());
     EXPECT_EQ(StmtOf(lhs), assign);
     EXPECT_EQ(StmtOf(rhs), assign);
     EXPECT_EQ(StmtOf(cond), stmt);
@@ -226,10 +226,10 @@
     ASSERT_NE(TypeOf(body_rhs), nullptr);
     ASSERT_NE(TypeOf(continuing_lhs), nullptr);
     ASSERT_NE(TypeOf(continuing_rhs), nullptr);
-    EXPECT_TRUE(TypeOf(body_lhs)->UnwrapRef()->Is<sem::F32>());
-    EXPECT_TRUE(TypeOf(body_rhs)->Is<sem::F32>());
-    EXPECT_TRUE(TypeOf(continuing_lhs)->UnwrapRef()->Is<sem::F32>());
-    EXPECT_TRUE(TypeOf(continuing_rhs)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(body_lhs)->UnwrapRef()->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(body_rhs)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(continuing_lhs)->UnwrapRef()->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(continuing_rhs)->Is<type::F32>());
     EXPECT_EQ(BlockOf(body_lhs), body);
     EXPECT_EQ(BlockOf(body_rhs), body);
     EXPECT_EQ(BlockOf(continuing_lhs), continuing);
@@ -246,7 +246,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(cond), nullptr);
-    EXPECT_TRUE(TypeOf(cond)->Is<sem::I32>());
+    EXPECT_TRUE(TypeOf(cond)->Is<type::I32>());
 }
 
 TEST_F(ResolverTest, Stmt_Return_WithoutValue) {
@@ -270,9 +270,9 @@
     ASSERT_NE(TypeOf(lhs), nullptr);
     ASSERT_NE(TypeOf(rhs), nullptr);
 
-    EXPECT_TRUE(TypeOf(stmt->condition)->Is<sem::I32>());
-    EXPECT_TRUE(TypeOf(lhs)->UnwrapRef()->Is<sem::F32>());
-    EXPECT_TRUE(TypeOf(rhs)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(stmt->condition)->Is<type::I32>());
+    EXPECT_TRUE(TypeOf(lhs)->UnwrapRef()->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(rhs)->Is<type::F32>());
     EXPECT_EQ(BlockOf(lhs), case_block);
     EXPECT_EQ(BlockOf(rhs), case_block);
 }
@@ -291,7 +291,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    EXPECT_TRUE(TypeOf(expr)->Is<sem::Void>());
+    EXPECT_TRUE(TypeOf(expr)->Is<type::Void>());
     EXPECT_EQ(StmtOf(expr), call);
 }
 
@@ -305,7 +305,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(init), nullptr);
-    EXPECT_TRUE(TypeOf(init)->Is<sem::I32>());
+    EXPECT_TRUE(TypeOf(init)->Is<type::I32>());
 }
 
 TEST_F(ResolverTest, Stmt_VariableDecl_Alias) {
@@ -319,7 +319,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(init), nullptr);
-    EXPECT_TRUE(TypeOf(init)->Is<sem::I32>());
+    EXPECT_TRUE(TypeOf(init)->Is<type::I32>());
 }
 
 TEST_F(ResolverTest, Stmt_VariableDecl_ModuleScope) {
@@ -329,7 +329,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(init), nullptr);
-    EXPECT_TRUE(TypeOf(init)->Is<sem::I32>());
+    EXPECT_TRUE(TypeOf(init)->Is<type::I32>());
     EXPECT_EQ(StmtOf(init), nullptr);
 }
 
@@ -369,13 +369,13 @@
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
     ASSERT_NE(TypeOf(foo_i32_init), nullptr);
-    EXPECT_TRUE(TypeOf(foo_i32_init)->Is<sem::I32>());
+    EXPECT_TRUE(TypeOf(foo_i32_init)->Is<type::I32>());
     ASSERT_NE(TypeOf(foo_f32_init), nullptr);
-    EXPECT_TRUE(TypeOf(foo_f32_init)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(foo_f32_init)->Is<type::F32>());
     ASSERT_NE(TypeOf(bar_i32_init), nullptr);
-    EXPECT_TRUE(TypeOf(bar_i32_init)->UnwrapRef()->Is<sem::I32>());
+    EXPECT_TRUE(TypeOf(bar_i32_init)->UnwrapRef()->Is<type::I32>());
     ASSERT_NE(TypeOf(bar_f32_init), nullptr);
-    EXPECT_TRUE(TypeOf(bar_f32_init)->UnwrapRef()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(bar_f32_init)->UnwrapRef()->Is<type::F32>());
     EXPECT_EQ(StmtOf(foo_i32_init), foo_i32_decl);
     EXPECT_EQ(StmtOf(bar_i32_init), bar_i32_decl);
     EXPECT_EQ(StmtOf(foo_f32_init), foo_f32_decl);
@@ -416,11 +416,11 @@
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
     ASSERT_NE(TypeOf(mod_init), nullptr);
-    EXPECT_TRUE(TypeOf(mod_init)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(mod_init)->Is<type::F32>());
     ASSERT_NE(TypeOf(fn_i32_init), nullptr);
-    EXPECT_TRUE(TypeOf(fn_i32_init)->Is<sem::I32>());
+    EXPECT_TRUE(TypeOf(fn_i32_init)->Is<type::I32>());
     ASSERT_NE(TypeOf(fn_f32_init), nullptr);
-    EXPECT_TRUE(TypeOf(fn_f32_init)->UnwrapRef()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(fn_f32_init)->UnwrapRef()->Is<type::F32>());
     EXPECT_EQ(StmtOf(fn_i32_init), fn_i32_decl);
     EXPECT_EQ(StmtOf(mod_init), nullptr);
     EXPECT_EQ(StmtOf(fn_f32_init), fn_f32_decl);
@@ -586,7 +586,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(bitcast), nullptr);
-    EXPECT_TRUE(TypeOf(bitcast)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(bitcast)->Is<type::F32>());
 }
 
 TEST_F(ResolverTest, Expr_Call) {
@@ -598,7 +598,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
 }
 
 TEST_F(ResolverTest, Expr_Call_InBinaryOp) {
@@ -610,7 +610,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    EXPECT_TRUE(TypeOf(expr)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(expr)->Is<type::F32>());
 }
 
 TEST_F(ResolverTest, Expr_Call_WithParams) {
@@ -627,7 +627,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(param), nullptr);
-    EXPECT_TRUE(TypeOf(param)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(param)->Is<type::F32>());
 }
 
 TEST_F(ResolverTest, Expr_Call_Builtin) {
@@ -637,7 +637,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
 }
 
 TEST_F(ResolverTest, Expr_Cast) {
@@ -649,7 +649,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(cast), nullptr);
-    EXPECT_TRUE(TypeOf(cast)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(cast)->Is<type::F32>());
 }
 
 TEST_F(ResolverTest, Expr_Initializer_Scalar) {
@@ -659,7 +659,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(s), nullptr);
-    EXPECT_TRUE(TypeOf(s)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(s)->Is<type::F32>());
 }
 
 TEST_F(ResolverTest, Expr_Initializer_Type_Vec2) {
@@ -670,7 +670,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 2u);
 }
 
@@ -682,7 +682,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 3u);
 }
 
@@ -694,7 +694,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
 }
 
@@ -708,7 +708,7 @@
 
     ASSERT_NE(TypeOf(ident), nullptr);
     ASSERT_TRUE(TypeOf(ident)->Is<sem::Reference>());
-    EXPECT_TRUE(TypeOf(ident)->UnwrapRef()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(ident)->UnwrapRef()->Is<type::F32>());
     EXPECT_TRUE(CheckVarUsers(my_var, utils::Vector{ident}));
     ASSERT_NE(VarOf(ident), nullptr);
     EXPECT_EQ(VarOf(ident)->Declaration(), my_var);
@@ -723,7 +723,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(ident), nullptr);
-    EXPECT_TRUE(TypeOf(ident)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(ident)->Is<type::F32>());
     EXPECT_TRUE(CheckVarUsers(my_var, utils::Vector{ident}));
     ASSERT_NE(VarOf(ident), nullptr);
     EXPECT_EQ(VarOf(ident)->Declaration(), my_var);
@@ -743,7 +743,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(my_var_a), nullptr);
-    EXPECT_TRUE(TypeOf(my_var_a)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(my_var_a)->Is<type::F32>());
     EXPECT_EQ(StmtOf(my_var_a), decl);
     EXPECT_TRUE(CheckVarUsers(var, utils::Vector{my_var_a}));
     ASSERT_NE(VarOf(my_var_a), nullptr);
@@ -785,11 +785,11 @@
 
     ASSERT_NE(TypeOf(my_var_a), nullptr);
     ASSERT_TRUE(TypeOf(my_var_a)->Is<sem::Reference>());
-    EXPECT_TRUE(TypeOf(my_var_a)->UnwrapRef()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(my_var_a)->UnwrapRef()->Is<type::F32>());
     EXPECT_EQ(StmtOf(my_var_a), assign);
     ASSERT_NE(TypeOf(my_var_b), nullptr);
     ASSERT_TRUE(TypeOf(my_var_b)->Is<sem::Reference>());
-    EXPECT_TRUE(TypeOf(my_var_b)->UnwrapRef()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(my_var_b)->UnwrapRef()->Is<type::F32>());
     EXPECT_EQ(StmtOf(my_var_b), assign);
     EXPECT_TRUE(CheckVarUsers(var, utils::Vector{my_var_a, my_var_b}));
     ASSERT_NE(VarOf(my_var_a), nullptr);
@@ -815,11 +815,11 @@
 
     ASSERT_NE(TypeOf(v), nullptr);
     ASSERT_TRUE(TypeOf(v)->Is<sem::Reference>());
-    EXPECT_TRUE(TypeOf(v)->UnwrapRef()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(v)->UnwrapRef()->Is<type::F32>());
     EXPECT_EQ(StmtOf(v), p_decl);
     ASSERT_NE(TypeOf(p), nullptr);
     ASSERT_TRUE(TypeOf(p)->Is<sem::Pointer>());
-    EXPECT_TRUE(TypeOf(p)->UnwrapPtr()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(p)->UnwrapPtr()->Is<type::F32>());
     EXPECT_EQ(StmtOf(p), assign);
 }
 
@@ -835,7 +835,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
 }
 
 TEST_F(ResolverTest, Expr_Identifier_Unknown) {
@@ -863,13 +863,13 @@
     auto* func_sem = Sem().Get(func);
     ASSERT_NE(func_sem, nullptr);
     EXPECT_EQ(func_sem->Parameters().Length(), 3u);
-    EXPECT_TRUE(func_sem->Parameters()[0]->Type()->Is<sem::F32>());
-    EXPECT_TRUE(func_sem->Parameters()[1]->Type()->Is<sem::I32>());
-    EXPECT_TRUE(func_sem->Parameters()[2]->Type()->Is<sem::U32>());
+    EXPECT_TRUE(func_sem->Parameters()[0]->Type()->Is<type::F32>());
+    EXPECT_TRUE(func_sem->Parameters()[1]->Type()->Is<type::I32>());
+    EXPECT_TRUE(func_sem->Parameters()[2]->Type()->Is<type::U32>());
     EXPECT_EQ(func_sem->Parameters()[0]->Declaration(), param_a);
     EXPECT_EQ(func_sem->Parameters()[1]->Declaration(), param_b);
     EXPECT_EQ(func_sem->Parameters()[2]->Declaration(), param_c);
-    EXPECT_TRUE(func_sem->ReturnType()->Is<sem::Void>());
+    EXPECT_TRUE(func_sem->ReturnType()->Is<type::Void>());
 }
 
 TEST_F(ResolverTest, Function_Parameters_Locations) {
@@ -937,7 +937,7 @@
     auto* func_sem = Sem().Get(func);
     ASSERT_NE(func_sem, nullptr);
     EXPECT_EQ(func_sem->Parameters().Length(), 0u);
-    EXPECT_TRUE(func_sem->ReturnType()->Is<sem::Void>());
+    EXPECT_TRUE(func_sem->ReturnType()->Is<type::Void>());
 
     const auto& vars = func_sem->TransitivelyReferencedGlobals();
     ASSERT_EQ(vars.Length(), 3u);
@@ -1029,7 +1029,7 @@
     ASSERT_NE(func_sem, nullptr);
 
     EXPECT_EQ(func_sem->TransitivelyReferencedGlobals().Length(), 0u);
-    EXPECT_TRUE(func_sem->ReturnType()->Is<sem::Void>());
+    EXPECT_TRUE(func_sem->ReturnType()->Is<type::Void>());
 }
 
 TEST_F(ResolverTest, Function_NotRegisterFunctionConstant) {
@@ -1044,7 +1044,7 @@
     ASSERT_NE(func_sem, nullptr);
 
     EXPECT_EQ(func_sem->TransitivelyReferencedGlobals().Length(), 0u);
-    EXPECT_TRUE(func_sem->ReturnType()->Is<sem::Void>());
+    EXPECT_TRUE(func_sem->ReturnType()->Is<type::Void>());
 }
 
 TEST_F(ResolverTest, Function_NotRegisterFunctionParams) {
@@ -1055,7 +1055,7 @@
     ASSERT_NE(func_sem, nullptr);
 
     EXPECT_EQ(func_sem->TransitivelyReferencedGlobals().Length(), 0u);
-    EXPECT_TRUE(func_sem->ReturnType()->Is<sem::Void>());
+    EXPECT_TRUE(func_sem->ReturnType()->Is<type::Void>());
 }
 
 TEST_F(ResolverTest, Function_CallSites) {
@@ -1253,10 +1253,10 @@
     ASSERT_TRUE(TypeOf(mem)->Is<sem::Reference>());
 
     auto* ref = TypeOf(mem)->As<sem::Reference>();
-    EXPECT_TRUE(ref->StoreType()->Is<sem::F32>());
+    EXPECT_TRUE(ref->StoreType()->Is<type::F32>());
     auto* sma = Sem().Get(mem)->As<sem::StructMemberAccess>();
     ASSERT_NE(sma, nullptr);
-    EXPECT_TRUE(sma->Member()->Type()->Is<sem::F32>());
+    EXPECT_TRUE(sma->Member()->Type()->Is<type::F32>());
     EXPECT_EQ(sma->Object()->Declaration(), mem->structure);
     EXPECT_EQ(sma->Member()->Index(), 1u);
     EXPECT_EQ(sma->Member()->Declaration()->symbol, Symbols().Get("second_member"));
@@ -1277,11 +1277,11 @@
     ASSERT_TRUE(TypeOf(mem)->Is<sem::Reference>());
 
     auto* ref = TypeOf(mem)->As<sem::Reference>();
-    EXPECT_TRUE(ref->StoreType()->Is<sem::F32>());
+    EXPECT_TRUE(ref->StoreType()->Is<type::F32>());
     auto* sma = Sem().Get(mem)->As<sem::StructMemberAccess>();
     ASSERT_NE(sma, nullptr);
     EXPECT_EQ(sma->Object()->Declaration(), mem->structure);
-    EXPECT_TRUE(sma->Member()->Type()->Is<sem::F32>());
+    EXPECT_TRUE(sma->Member()->Type()->Is<type::F32>());
     EXPECT_EQ(sma->Member()->Index(), 1u);
 }
 
@@ -1295,7 +1295,7 @@
 
     ASSERT_NE(TypeOf(mem), nullptr);
     ASSERT_TRUE(TypeOf(mem)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(mem)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(mem)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(mem)->As<sem::Vector>()->Width(), 4u);
     auto* sma = Sem().Get(mem)->As<sem::Swizzle>();
     ASSERT_NE(sma, nullptr);
@@ -1315,7 +1315,7 @@
     ASSERT_TRUE(TypeOf(mem)->Is<sem::Reference>());
 
     auto* ref = TypeOf(mem)->As<sem::Reference>();
-    ASSERT_TRUE(ref->StoreType()->Is<sem::F32>());
+    ASSERT_TRUE(ref->StoreType()->Is<type::F32>());
     auto* sma = Sem().Get(mem)->As<sem::Swizzle>();
     ASSERT_NE(sma, nullptr);
     EXPECT_EQ(sma->Object()->Declaration(), mem->structure);
@@ -1350,7 +1350,7 @@
 
     ASSERT_NE(TypeOf(mem), nullptr);
     ASSERT_TRUE(TypeOf(mem)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(mem)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(mem)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(mem)->As<sem::Vector>()->Width(), 2u);
     ASSERT_TRUE(Sem().Get(mem)->Is<sem::Swizzle>());
 }
@@ -1367,7 +1367,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    EXPECT_TRUE(TypeOf(expr)->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(expr)->Is<type::F32>());
 }
 
 namespace ExprBinaryTest {
@@ -1773,12 +1773,12 @@
     if (vec_by_mat) {
         lhs_type = ty.vec<f32>(vec_size);
         rhs_type = ty.mat<f32>(mat_cols, mat_rows);
-        result_type = create<sem::Vector>(create<sem::F32>(), mat_cols);
+        result_type = create<sem::Vector>(create<type::F32>(), mat_cols);
         is_valid_expr = vec_size == mat_rows;
     } else {
         lhs_type = ty.mat<f32>(mat_cols, mat_rows);
         rhs_type = ty.vec<f32>(vec_size);
-        result_type = create<sem::Vector>(create<sem::F32>(), mat_rows);
+        result_type = create<sem::Vector>(create<type::F32>(), mat_rows);
         is_valid_expr = vec_size == mat_cols;
     }
 
@@ -1815,7 +1815,7 @@
     auto* lhs_type = ty.mat<f32>(lhs_mat_cols, lhs_mat_rows);
     auto* rhs_type = ty.mat<f32>(rhs_mat_cols, rhs_mat_rows);
 
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* col = create<sem::Vector>(f32, lhs_mat_rows);
     auto* result_type = create<sem::Matrix>(col, rhs_mat_cols);
 
@@ -1862,11 +1862,11 @@
     ASSERT_NE(TypeOf(der), nullptr);
     ASSERT_TRUE(TypeOf(der)->Is<sem::Vector>());
     if (op == ast::UnaryOp::kNot) {
-        EXPECT_TRUE(TypeOf(der)->As<sem::Vector>()->type()->Is<sem::Bool>());
+        EXPECT_TRUE(TypeOf(der)->As<sem::Vector>()->type()->Is<type::Bool>());
     } else if (op == ast::UnaryOp::kNegation || op == ast::UnaryOp::kComplement) {
-        EXPECT_TRUE(TypeOf(der)->As<sem::Vector>()->type()->Is<sem::I32>());
+        EXPECT_TRUE(TypeOf(der)->As<sem::Vector>()->type()->Is<type::I32>());
     } else {
-        EXPECT_TRUE(TypeOf(der)->As<sem::Vector>()->type()->Is<sem::F32>());
+        EXPECT_TRUE(TypeOf(der)->As<sem::Vector>()->type()->Is<type::F32>());
     }
     EXPECT_EQ(TypeOf(der)->As<sem::Vector>()->Width(), 4u);
 }
diff --git a/src/tint/resolver/resolver_test_helper.h b/src/tint/resolver/resolver_test_helper.h
index 1186fa1..e4625b6 100644
--- a/src/tint/resolver/resolver_test_helper.h
+++ b/src/tint/resolver/resolver_test_helper.h
@@ -232,7 +232,7 @@
     static inline const ast::Type* AST(ProgramBuilder& b) { return b.ty.bool_(); }
     /// @param b the ProgramBuilder
     /// @return the semantic bool type
-    static inline const type::Type* Sem(ProgramBuilder& b) { return b.create<sem::Bool>(); }
+    static inline const type::Type* Sem(ProgramBuilder& b) { return b.create<type::Bool>(); }
     /// @param b the ProgramBuilder
     /// @param args args of size 1 with the boolean value to init with
     /// @return a new AST expression of the bool type
@@ -263,7 +263,7 @@
     static inline const ast::Type* AST(ProgramBuilder& b) { return b.ty.i32(); }
     /// @param b the ProgramBuilder
     /// @return the semantic i32 type
-    static inline const type::Type* Sem(ProgramBuilder& b) { return b.create<sem::I32>(); }
+    static inline const type::Type* Sem(ProgramBuilder& b) { return b.create<type::I32>(); }
     /// @param b the ProgramBuilder
     /// @param args args of size 1 with the i32 value to init with
     /// @return a new AST i32 literal value expression
@@ -294,7 +294,7 @@
     static inline const ast::Type* AST(ProgramBuilder& b) { return b.ty.u32(); }
     /// @param b the ProgramBuilder
     /// @return the semantic u32 type
-    static inline const type::Type* Sem(ProgramBuilder& b) { return b.create<sem::U32>(); }
+    static inline const type::Type* Sem(ProgramBuilder& b) { return b.create<type::U32>(); }
     /// @param b the ProgramBuilder
     /// @param args args of size 1 with the u32 value to init with
     /// @return a new AST u32 literal value expression
@@ -325,7 +325,7 @@
     static inline const ast::Type* AST(ProgramBuilder& b) { return b.ty.f32(); }
     /// @param b the ProgramBuilder
     /// @return the semantic f32 type
-    static inline const type::Type* Sem(ProgramBuilder& b) { return b.create<sem::F32>(); }
+    static inline const type::Type* Sem(ProgramBuilder& b) { return b.create<type::F32>(); }
     /// @param b the ProgramBuilder
     /// @param args args of size 1 with the f32 value to init with
     /// @return a new AST f32 literal value expression
@@ -356,7 +356,7 @@
     static inline const ast::Type* AST(ProgramBuilder& b) { return b.ty.f16(); }
     /// @param b the ProgramBuilder
     /// @return the semantic f16 type
-    static inline const type::Type* Sem(ProgramBuilder& b) { return b.create<sem::F16>(); }
+    static inline const type::Type* Sem(ProgramBuilder& b) { return b.create<type::F16>(); }
     /// @param b the ProgramBuilder
     /// @param args args of size 1 with the f16 value to init with
     /// @return a new AST f16 literal value expression
diff --git a/src/tint/resolver/type_initializer_validation_test.cc b/src/tint/resolver/type_initializer_validation_test.cc
index 437f28f..cbb6b89 100644
--- a/src/tint/resolver/type_initializer_validation_test.cc
+++ b/src/tint/resolver/type_initializer_validation_test.cc
@@ -68,10 +68,10 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     ASSERT_TRUE(TypeOf(a_ident)->Is<sem::Reference>());
-    EXPECT_TRUE(TypeOf(a_ident)->As<sem::Reference>()->StoreType()->Is<sem::I32>());
+    EXPECT_TRUE(TypeOf(a_ident)->As<sem::Reference>()->StoreType()->Is<type::I32>());
     EXPECT_EQ(TypeOf(a_ident)->As<sem::Reference>()->AddressSpace(), ast::AddressSpace::kFunction);
     ASSERT_TRUE(TypeOf(b_ident)->Is<sem::Reference>());
-    EXPECT_TRUE(TypeOf(b_ident)->As<sem::Reference>()->StoreType()->Is<sem::I32>());
+    EXPECT_TRUE(TypeOf(b_ident)->As<sem::Reference>()->StoreType()->Is<type::I32>());
     EXPECT_EQ(TypeOf(b_ident)->As<sem::Reference>()->AddressSpace(), ast::AddressSpace::kFunction);
 }
 
@@ -515,9 +515,9 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::U32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::U32>());
-    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<sem::U32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::U32>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, InferredArray_U32U32U32) {
@@ -534,9 +534,9 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::U32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::U32>());
-    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<sem::U32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::U32>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, Array_U32AIU32) {
@@ -553,9 +553,9 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::U32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::U32>());
-    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<sem::U32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::U32>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, InferredArray_U32AIU32) {
@@ -572,9 +572,9 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::U32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::U32>());
-    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<sem::U32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::U32>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, ArrayU32_AIAIAI) {
@@ -591,9 +591,9 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::U32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::U32>());
-    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<sem::U32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::U32>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, InferredArray_AIAIAI) {
@@ -632,9 +632,9 @@
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
     ASSERT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->As<sem::Vector>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->As<sem::Vector>()->type()->Is<type::I32>());
     ASSERT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->As<sem::Vector>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->As<sem::Vector>()->type()->Is<type::I32>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, InferredArrayU32_VecAI_VecF32) {
@@ -654,9 +654,9 @@
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
     ASSERT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->As<sem::Vector>()->type()->Is<type::F32>());
     ASSERT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->As<sem::Vector>()->type()->Is<type::F32>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, ArrayArgumentTypeMismatch_U32F32) {
@@ -896,7 +896,7 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    ASSERT_TRUE(TypeOf(expr)->Is<sem::I32>());
+    ASSERT_TRUE(TypeOf(expr)->Is<type::I32>());
 
     auto* call = Sem().Get<sem::Call>(expr);
     ASSERT_NE(call, nullptr);
@@ -904,7 +904,7 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 1u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, U32_Success) {
@@ -914,7 +914,7 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    ASSERT_TRUE(TypeOf(expr)->Is<sem::U32>());
+    ASSERT_TRUE(TypeOf(expr)->Is<type::U32>());
 
     auto* call = Sem().Get<sem::Call>(expr);
     ASSERT_NE(call, nullptr);
@@ -922,7 +922,7 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 1u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::U32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::U32>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, F32_Success) {
@@ -932,7 +932,7 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    ASSERT_TRUE(TypeOf(expr)->Is<sem::F32>());
+    ASSERT_TRUE(TypeOf(expr)->Is<type::F32>());
 
     auto* call = Sem().Get<sem::Call>(expr);
     ASSERT_NE(call, nullptr);
@@ -940,7 +940,7 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 1u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::F32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::F32>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, F16_Success) {
@@ -952,7 +952,7 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    ASSERT_TRUE(TypeOf(expr)->Is<sem::F16>());
+    ASSERT_TRUE(TypeOf(expr)->Is<type::F16>());
 
     auto* call = Sem().Get<sem::Call>(expr);
     ASSERT_NE(call, nullptr);
@@ -960,7 +960,7 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 1u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::F16>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::F16>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, Convert_f32_to_i32_Success) {
@@ -970,7 +970,7 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    ASSERT_TRUE(TypeOf(expr)->Is<sem::I32>());
+    ASSERT_TRUE(TypeOf(expr)->Is<type::I32>());
 
     auto* call = Sem().Get<sem::Call>(expr);
     ASSERT_NE(call, nullptr);
@@ -978,7 +978,7 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 1u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::F32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::F32>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, Convert_i32_to_u32_Success) {
@@ -988,7 +988,7 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    ASSERT_TRUE(TypeOf(expr)->Is<sem::U32>());
+    ASSERT_TRUE(TypeOf(expr)->Is<type::U32>());
 
     auto* call = Sem().Get<sem::Call>(expr);
     ASSERT_NE(call, nullptr);
@@ -996,7 +996,7 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 1u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, Convert_u32_to_f16_Success) {
@@ -1008,7 +1008,7 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    ASSERT_TRUE(TypeOf(expr)->Is<sem::F16>());
+    ASSERT_TRUE(TypeOf(expr)->Is<type::F16>());
 
     auto* call = Sem().Get<sem::Call>(expr);
     ASSERT_NE(call, nullptr);
@@ -1016,7 +1016,7 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 1u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::U32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::U32>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, Convert_f16_to_f32_Success) {
@@ -1028,7 +1028,7 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    ASSERT_TRUE(TypeOf(expr)->Is<sem::F32>());
+    ASSERT_TRUE(TypeOf(expr)->Is<type::F32>());
 
     auto* call = Sem().Get<sem::Call>(expr);
     ASSERT_NE(call, nullptr);
@@ -1036,7 +1036,7 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 1u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::F16>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::F16>());
 }
 
 }  // namespace ScalarInitializer
@@ -1142,7 +1142,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 2u);
 
     auto* call = Sem().Get<sem::Call>(tc);
@@ -1161,7 +1161,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 2u);
 
     auto* call = Sem().Get<sem::Call>(tc);
@@ -1170,8 +1170,8 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::F32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::F32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::F32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::F32>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, Vec2F16_Success_Scalar) {
@@ -1184,7 +1184,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F16>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 2u);
 
     auto* call = Sem().Get<sem::Call>(tc);
@@ -1193,8 +1193,8 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::F16>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::F16>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::F16>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::F16>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, Vec2U32_Success_Scalar) {
@@ -1205,7 +1205,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::U32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::U32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 2u);
 
     auto* call = Sem().Get<sem::Call>(tc);
@@ -1214,8 +1214,8 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::U32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::U32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::U32>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, Vec2I32_Success_Scalar) {
@@ -1226,7 +1226,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::I32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 2u);
 
     auto* call = Sem().Get<sem::Call>(tc);
@@ -1235,8 +1235,8 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::I32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, Vec2Bool_Success_Scalar) {
@@ -1247,7 +1247,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::Bool>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::Bool>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 2u);
 
     auto* call = Sem().Get<sem::Call>(tc);
@@ -1256,8 +1256,8 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::Bool>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::Bool>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Bool>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::Bool>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, Vec2_Success_Identity) {
@@ -1268,7 +1268,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 2u);
 
     auto* call = Sem().Get<sem::Call>(tc);
@@ -1288,7 +1288,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 2u);
 
     auto* call = Sem().Get<sem::Call>(tc);
@@ -1417,7 +1417,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 3u);
 
     auto* call = Sem().Get<sem::Call>(tc);
@@ -1436,7 +1436,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 3u);
 
     auto* call = Sem().Get<sem::Call>(tc);
@@ -1445,9 +1445,9 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::F32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::F32>());
-    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<sem::F32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::F32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::F32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::F32>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, Vec3F16_Success_Scalar) {
@@ -1460,7 +1460,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F16>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 3u);
 
     auto* call = Sem().Get<sem::Call>(tc);
@@ -1469,9 +1469,9 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::F16>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::F16>());
-    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<sem::F16>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::F16>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::F16>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::F16>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, Vec3U32_Success_Scalar) {
@@ -1482,7 +1482,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::U32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::U32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 3u);
 
     auto* call = Sem().Get<sem::Call>(tc);
@@ -1491,9 +1491,9 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::U32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::U32>());
-    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<sem::U32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::U32>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, Vec3I32_Success_Scalar) {
@@ -1504,7 +1504,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::I32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 3u);
 
     auto* call = Sem().Get<sem::Call>(tc);
@@ -1513,9 +1513,9 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::I32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::I32>());
-    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::I32>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, Vec3Bool_Success_Scalar) {
@@ -1526,7 +1526,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::Bool>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::Bool>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 3u);
 
     auto* call = Sem().Get<sem::Call>(tc);
@@ -1535,9 +1535,9 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::Bool>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::Bool>());
-    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<sem::Bool>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Bool>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::Bool>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::Bool>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, Vec3_Success_Vec2AndScalar) {
@@ -1548,7 +1548,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 3u);
 
     auto* call = Sem().Get<sem::Call>(tc);
@@ -1558,7 +1558,7 @@
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
     EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::F32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::F32>());
 }
 
 TEST_F(ResolverTypeInitializerValidationTest, Vec3_Success_ScalarAndVec2) {
@@ -1569,7 +1569,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 3u);
 
     auto* call = Sem().Get<sem::Call>(tc);
@@ -1578,7 +1578,7 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::F32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::F32>());
     EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::Vector>());
 }
 
@@ -1590,7 +1590,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 3u);
 
     auto* call = Sem().Get<sem::Call>(tc);
@@ -1610,7 +1610,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 3u);
 
     auto* call = Sem().Get<sem::Call>(tc);
@@ -1782,7 +1782,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
 }
 
@@ -1794,7 +1794,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
 }
 
@@ -1808,7 +1808,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F16>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
 }
 
@@ -1820,7 +1820,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::U32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::U32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
 }
 
@@ -1832,7 +1832,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::I32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
 }
 
@@ -1844,7 +1844,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::Bool>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::Bool>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
 }
 
@@ -1856,7 +1856,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
 }
 
@@ -1868,7 +1868,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
 }
 
@@ -1880,7 +1880,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
 }
 
@@ -1892,7 +1892,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
 }
 
@@ -1904,7 +1904,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
 }
 
@@ -1916,7 +1916,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
 }
 
@@ -1928,7 +1928,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
 }
 
@@ -1940,7 +1940,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
 }
 
@@ -1962,7 +1962,7 @@
 
     ASSERT_NE(TypeOf(tc), nullptr);
     ASSERT_TRUE(TypeOf(tc)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(TypeOf(tc)->As<sem::Vector>()->type()->Is<type::F32>());
     EXPECT_EQ(TypeOf(tc)->As<sem::Vector>()->Width(), 4u);
 }
 
@@ -2051,11 +2051,11 @@
     ASSERT_TRUE(TypeOf(vec2_u32)->Is<sem::Vector>());
     ASSERT_TRUE(TypeOf(vec2_f32)->Is<sem::Vector>());
     ASSERT_TRUE(TypeOf(vec2_f16)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(vec2_bool)->As<sem::Vector>()->type()->Is<sem::Bool>());
-    EXPECT_TRUE(TypeOf(vec2_i32)->As<sem::Vector>()->type()->Is<sem::I32>());
-    EXPECT_TRUE(TypeOf(vec2_u32)->As<sem::Vector>()->type()->Is<sem::U32>());
-    EXPECT_TRUE(TypeOf(vec2_f32)->As<sem::Vector>()->type()->Is<sem::F32>());
-    EXPECT_TRUE(TypeOf(vec2_f16)->As<sem::Vector>()->type()->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(vec2_bool)->As<sem::Vector>()->type()->Is<type::Bool>());
+    EXPECT_TRUE(TypeOf(vec2_i32)->As<sem::Vector>()->type()->Is<type::I32>());
+    EXPECT_TRUE(TypeOf(vec2_u32)->As<sem::Vector>()->type()->Is<type::U32>());
+    EXPECT_TRUE(TypeOf(vec2_f32)->As<sem::Vector>()->type()->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(vec2_f16)->As<sem::Vector>()->type()->Is<type::F16>());
     EXPECT_EQ(TypeOf(vec2_bool)->As<sem::Vector>()->Width(), 2u);
     EXPECT_EQ(TypeOf(vec2_i32)->As<sem::Vector>()->Width(), 2u);
     EXPECT_EQ(TypeOf(vec2_u32)->As<sem::Vector>()->Width(), 2u);
@@ -2085,11 +2085,11 @@
     ASSERT_TRUE(TypeOf(vec2_u32)->Is<sem::Vector>());
     ASSERT_TRUE(TypeOf(vec2_f32)->Is<sem::Vector>());
     ASSERT_TRUE(TypeOf(vec2_f16)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(vec2_bool)->As<sem::Vector>()->type()->Is<sem::Bool>());
-    EXPECT_TRUE(TypeOf(vec2_i32)->As<sem::Vector>()->type()->Is<sem::I32>());
-    EXPECT_TRUE(TypeOf(vec2_u32)->As<sem::Vector>()->type()->Is<sem::U32>());
-    EXPECT_TRUE(TypeOf(vec2_f32)->As<sem::Vector>()->type()->Is<sem::F32>());
-    EXPECT_TRUE(TypeOf(vec2_f16)->As<sem::Vector>()->type()->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(vec2_bool)->As<sem::Vector>()->type()->Is<type::Bool>());
+    EXPECT_TRUE(TypeOf(vec2_i32)->As<sem::Vector>()->type()->Is<type::I32>());
+    EXPECT_TRUE(TypeOf(vec2_u32)->As<sem::Vector>()->type()->Is<type::U32>());
+    EXPECT_TRUE(TypeOf(vec2_f32)->As<sem::Vector>()->type()->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(vec2_f16)->As<sem::Vector>()->type()->Is<type::F16>());
     EXPECT_EQ(TypeOf(vec2_bool)->As<sem::Vector>()->Width(), 2u);
     EXPECT_EQ(TypeOf(vec2_i32)->As<sem::Vector>()->Width(), 2u);
     EXPECT_EQ(TypeOf(vec2_u32)->As<sem::Vector>()->Width(), 2u);
@@ -2120,11 +2120,11 @@
     ASSERT_TRUE(TypeOf(vec3_u32)->Is<sem::Vector>());
     ASSERT_TRUE(TypeOf(vec3_f32)->Is<sem::Vector>());
     ASSERT_TRUE(TypeOf(vec3_f16)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(vec3_bool)->As<sem::Vector>()->type()->Is<sem::Bool>());
-    EXPECT_TRUE(TypeOf(vec3_i32)->As<sem::Vector>()->type()->Is<sem::I32>());
-    EXPECT_TRUE(TypeOf(vec3_u32)->As<sem::Vector>()->type()->Is<sem::U32>());
-    EXPECT_TRUE(TypeOf(vec3_f32)->As<sem::Vector>()->type()->Is<sem::F32>());
-    EXPECT_TRUE(TypeOf(vec3_f16)->As<sem::Vector>()->type()->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(vec3_bool)->As<sem::Vector>()->type()->Is<type::Bool>());
+    EXPECT_TRUE(TypeOf(vec3_i32)->As<sem::Vector>()->type()->Is<type::I32>());
+    EXPECT_TRUE(TypeOf(vec3_u32)->As<sem::Vector>()->type()->Is<type::U32>());
+    EXPECT_TRUE(TypeOf(vec3_f32)->As<sem::Vector>()->type()->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(vec3_f16)->As<sem::Vector>()->type()->Is<type::F16>());
     EXPECT_EQ(TypeOf(vec3_bool)->As<sem::Vector>()->Width(), 3u);
     EXPECT_EQ(TypeOf(vec3_i32)->As<sem::Vector>()->Width(), 3u);
     EXPECT_EQ(TypeOf(vec3_u32)->As<sem::Vector>()->Width(), 3u);
@@ -2154,11 +2154,11 @@
     ASSERT_TRUE(TypeOf(vec3_u32)->Is<sem::Vector>());
     ASSERT_TRUE(TypeOf(vec3_f32)->Is<sem::Vector>());
     ASSERT_TRUE(TypeOf(vec3_f16)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(vec3_bool)->As<sem::Vector>()->type()->Is<sem::Bool>());
-    EXPECT_TRUE(TypeOf(vec3_i32)->As<sem::Vector>()->type()->Is<sem::I32>());
-    EXPECT_TRUE(TypeOf(vec3_u32)->As<sem::Vector>()->type()->Is<sem::U32>());
-    EXPECT_TRUE(TypeOf(vec3_f32)->As<sem::Vector>()->type()->Is<sem::F32>());
-    EXPECT_TRUE(TypeOf(vec3_f16)->As<sem::Vector>()->type()->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(vec3_bool)->As<sem::Vector>()->type()->Is<type::Bool>());
+    EXPECT_TRUE(TypeOf(vec3_i32)->As<sem::Vector>()->type()->Is<type::I32>());
+    EXPECT_TRUE(TypeOf(vec3_u32)->As<sem::Vector>()->type()->Is<type::U32>());
+    EXPECT_TRUE(TypeOf(vec3_f32)->As<sem::Vector>()->type()->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(vec3_f16)->As<sem::Vector>()->type()->Is<type::F16>());
     EXPECT_EQ(TypeOf(vec3_bool)->As<sem::Vector>()->Width(), 3u);
     EXPECT_EQ(TypeOf(vec3_i32)->As<sem::Vector>()->Width(), 3u);
     EXPECT_EQ(TypeOf(vec3_u32)->As<sem::Vector>()->Width(), 3u);
@@ -2189,11 +2189,11 @@
     ASSERT_TRUE(TypeOf(vec3_u32)->Is<sem::Vector>());
     ASSERT_TRUE(TypeOf(vec3_f32)->Is<sem::Vector>());
     ASSERT_TRUE(TypeOf(vec3_f16)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(vec3_bool)->As<sem::Vector>()->type()->Is<sem::Bool>());
-    EXPECT_TRUE(TypeOf(vec3_i32)->As<sem::Vector>()->type()->Is<sem::I32>());
-    EXPECT_TRUE(TypeOf(vec3_u32)->As<sem::Vector>()->type()->Is<sem::U32>());
-    EXPECT_TRUE(TypeOf(vec3_f32)->As<sem::Vector>()->type()->Is<sem::F32>());
-    EXPECT_TRUE(TypeOf(vec3_f16)->As<sem::Vector>()->type()->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(vec3_bool)->As<sem::Vector>()->type()->Is<type::Bool>());
+    EXPECT_TRUE(TypeOf(vec3_i32)->As<sem::Vector>()->type()->Is<type::I32>());
+    EXPECT_TRUE(TypeOf(vec3_u32)->As<sem::Vector>()->type()->Is<type::U32>());
+    EXPECT_TRUE(TypeOf(vec3_f32)->As<sem::Vector>()->type()->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(vec3_f16)->As<sem::Vector>()->type()->Is<type::F16>());
     EXPECT_EQ(TypeOf(vec3_bool)->As<sem::Vector>()->Width(), 3u);
     EXPECT_EQ(TypeOf(vec3_i32)->As<sem::Vector>()->Width(), 3u);
     EXPECT_EQ(TypeOf(vec3_u32)->As<sem::Vector>()->Width(), 3u);
@@ -2228,11 +2228,11 @@
     ASSERT_TRUE(TypeOf(vec4_u32)->Is<sem::Vector>());
     ASSERT_TRUE(TypeOf(vec4_f32)->Is<sem::Vector>());
     ASSERT_TRUE(TypeOf(vec4_f16)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(vec4_bool)->As<sem::Vector>()->type()->Is<sem::Bool>());
-    EXPECT_TRUE(TypeOf(vec4_i32)->As<sem::Vector>()->type()->Is<sem::I32>());
-    EXPECT_TRUE(TypeOf(vec4_u32)->As<sem::Vector>()->type()->Is<sem::U32>());
-    EXPECT_TRUE(TypeOf(vec4_f32)->As<sem::Vector>()->type()->Is<sem::F32>());
-    EXPECT_TRUE(TypeOf(vec4_f16)->As<sem::Vector>()->type()->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(vec4_bool)->As<sem::Vector>()->type()->Is<type::Bool>());
+    EXPECT_TRUE(TypeOf(vec4_i32)->As<sem::Vector>()->type()->Is<type::I32>());
+    EXPECT_TRUE(TypeOf(vec4_u32)->As<sem::Vector>()->type()->Is<type::U32>());
+    EXPECT_TRUE(TypeOf(vec4_f32)->As<sem::Vector>()->type()->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(vec4_f16)->As<sem::Vector>()->type()->Is<type::F16>());
     EXPECT_EQ(TypeOf(vec4_bool)->As<sem::Vector>()->Width(), 4u);
     EXPECT_EQ(TypeOf(vec4_i32)->As<sem::Vector>()->Width(), 4u);
     EXPECT_EQ(TypeOf(vec4_u32)->As<sem::Vector>()->Width(), 4u);
@@ -2263,11 +2263,11 @@
     ASSERT_TRUE(TypeOf(vec4_u32)->Is<sem::Vector>());
     ASSERT_TRUE(TypeOf(vec4_f32)->Is<sem::Vector>());
     ASSERT_TRUE(TypeOf(vec4_f16)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(vec4_bool)->As<sem::Vector>()->type()->Is<sem::Bool>());
-    EXPECT_TRUE(TypeOf(vec4_i32)->As<sem::Vector>()->type()->Is<sem::I32>());
-    EXPECT_TRUE(TypeOf(vec4_u32)->As<sem::Vector>()->type()->Is<sem::U32>());
-    EXPECT_TRUE(TypeOf(vec4_f32)->As<sem::Vector>()->type()->Is<sem::F32>());
-    EXPECT_TRUE(TypeOf(vec4_f16)->As<sem::Vector>()->type()->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(vec4_bool)->As<sem::Vector>()->type()->Is<type::Bool>());
+    EXPECT_TRUE(TypeOf(vec4_i32)->As<sem::Vector>()->type()->Is<type::I32>());
+    EXPECT_TRUE(TypeOf(vec4_u32)->As<sem::Vector>()->type()->Is<type::U32>());
+    EXPECT_TRUE(TypeOf(vec4_f32)->As<sem::Vector>()->type()->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(vec4_f16)->As<sem::Vector>()->type()->Is<type::F16>());
     EXPECT_EQ(TypeOf(vec4_bool)->As<sem::Vector>()->Width(), 4u);
     EXPECT_EQ(TypeOf(vec4_i32)->As<sem::Vector>()->Width(), 4u);
     EXPECT_EQ(TypeOf(vec4_u32)->As<sem::Vector>()->Width(), 4u);
@@ -2302,11 +2302,11 @@
     ASSERT_TRUE(TypeOf(vec4_u32)->Is<sem::Vector>());
     ASSERT_TRUE(TypeOf(vec4_f32)->Is<sem::Vector>());
     ASSERT_TRUE(TypeOf(vec4_f16)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(vec4_bool)->As<sem::Vector>()->type()->Is<sem::Bool>());
-    EXPECT_TRUE(TypeOf(vec4_i32)->As<sem::Vector>()->type()->Is<sem::I32>());
-    EXPECT_TRUE(TypeOf(vec4_u32)->As<sem::Vector>()->type()->Is<sem::U32>());
-    EXPECT_TRUE(TypeOf(vec4_f32)->As<sem::Vector>()->type()->Is<sem::F32>());
-    EXPECT_TRUE(TypeOf(vec4_f16)->As<sem::Vector>()->type()->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(vec4_bool)->As<sem::Vector>()->type()->Is<type::Bool>());
+    EXPECT_TRUE(TypeOf(vec4_i32)->As<sem::Vector>()->type()->Is<type::I32>());
+    EXPECT_TRUE(TypeOf(vec4_u32)->As<sem::Vector>()->type()->Is<type::U32>());
+    EXPECT_TRUE(TypeOf(vec4_f32)->As<sem::Vector>()->type()->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(vec4_f16)->As<sem::Vector>()->type()->Is<type::F16>());
     EXPECT_EQ(TypeOf(vec4_bool)->As<sem::Vector>()->Width(), 4u);
     EXPECT_EQ(TypeOf(vec4_i32)->As<sem::Vector>()->Width(), 4u);
     EXPECT_EQ(TypeOf(vec4_u32)->As<sem::Vector>()->Width(), 4u);
@@ -2341,11 +2341,11 @@
     ASSERT_TRUE(TypeOf(vec4_u32)->Is<sem::Vector>());
     ASSERT_TRUE(TypeOf(vec4_f32)->Is<sem::Vector>());
     ASSERT_TRUE(TypeOf(vec4_f16)->Is<sem::Vector>());
-    EXPECT_TRUE(TypeOf(vec4_bool)->As<sem::Vector>()->type()->Is<sem::Bool>());
-    EXPECT_TRUE(TypeOf(vec4_i32)->As<sem::Vector>()->type()->Is<sem::I32>());
-    EXPECT_TRUE(TypeOf(vec4_u32)->As<sem::Vector>()->type()->Is<sem::U32>());
-    EXPECT_TRUE(TypeOf(vec4_f32)->As<sem::Vector>()->type()->Is<sem::F32>());
-    EXPECT_TRUE(TypeOf(vec4_f16)->As<sem::Vector>()->type()->Is<sem::F16>());
+    EXPECT_TRUE(TypeOf(vec4_bool)->As<sem::Vector>()->type()->Is<type::Bool>());
+    EXPECT_TRUE(TypeOf(vec4_i32)->As<sem::Vector>()->type()->Is<type::I32>());
+    EXPECT_TRUE(TypeOf(vec4_u32)->As<sem::Vector>()->type()->Is<type::U32>());
+    EXPECT_TRUE(TypeOf(vec4_f32)->As<sem::Vector>()->type()->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(vec4_f16)->As<sem::Vector>()->type()->Is<type::F16>());
     EXPECT_EQ(TypeOf(vec4_bool)->As<sem::Vector>()->Width(), 4u);
     EXPECT_EQ(TypeOf(vec4_i32)->As<sem::Vector>()->Width(), 4u);
     EXPECT_EQ(TypeOf(vec4_u32)->As<sem::Vector>()->Width(), 4u);
diff --git a/src/tint/resolver/validator.cc b/src/tint/resolver/validator.cc
index 1740a06..18cb152 100644
--- a/src/tint/resolver/validator.cc
+++ b/src/tint/resolver/validator.cc
@@ -210,7 +210,7 @@
 
 // https://gpuweb.github.io/gpuweb/wgsl.html#host-shareable-types
 bool Validator::IsHostShareable(const type::Type* type) const {
-    if (type->IsAnyOf<sem::I32, sem::U32, sem::F32, sem::F16>()) {
+    if (type->IsAnyOf<type::I32, type::U32, type::F32, type::F16>()) {
         return true;
     }
     return Switch(
@@ -263,7 +263,7 @@
 bool Validator::Atomic(const ast::Atomic* a, const sem::Atomic* s) const {
     // https://gpuweb.github.io/gpuweb/wgsl/#atomic-types
     // T must be either u32 or i32.
-    if (!s->Type()->IsAnyOf<sem::U32, sem::I32>()) {
+    if (!s->Type()->IsAnyOf<type::U32, type::I32>()) {
         AddError("atomic only supports i32 or u32 types", a->type ? a->type->source : a->source);
         return false;
     }
@@ -320,7 +320,7 @@
 }
 
 bool Validator::SampledTexture(const type::SampledTexture* t, const Source& source) const {
-    if (!t->type()->UnwrapRef()->IsAnyOf<sem::F32, sem::I32, sem::U32>()) {
+    if (!t->type()->UnwrapRef()->IsAnyOf<type::F32, type::I32, type::U32>()) {
         AddError("texture_2d<type>: type must be f32, i32 or u32", source);
         return false;
     }
@@ -335,7 +335,7 @@
         return false;
     }
 
-    if (!t->type()->UnwrapRef()->IsAnyOf<sem::F32, sem::I32, sem::U32>()) {
+    if (!t->type()->UnwrapRef()->IsAnyOf<type::F32, type::I32, type::U32>()) {
         AddError("texture_multisampled_2d<type>: type must be f32, i32 or u32", source);
         return false;
     }
@@ -435,7 +435,7 @@
 
     // Among three host-shareable address spaces, f16 is supported in "uniform" and
     // "storage" address space, but not "push_constant" address space yet.
-    if (Is<sem::F16>(type::Type::DeepestElementOf(store_ty)) &&
+    if (Is<type::F16>(type::Type::DeepestElementOf(store_ty)) &&
         address_space == ast::AddressSpace::kPushConstant) {
         AddError("using f16 types in 'push_constant' address space is not implemented yet", source);
         return false;
@@ -764,7 +764,7 @@
         return false;
     }
 
-    if (storage_ty->Is<sem::F16>()) {
+    if (storage_ty->Is<type::F16>()) {
         AddError("'override' of type f16 is not implemented yet", decl->source);
         return false;
     }
@@ -882,7 +882,7 @@
                 !(stage == ast::PipelineStage::kFragment && !is_input)) {
                 is_stage_mismatch = true;
             }
-            if (!type->Is<sem::F32>()) {
+            if (!type->Is<type::F32>()) {
                 AddError("store type of " + attr_to_str(attr) + " must be 'f32'", attr->source);
                 return false;
             }
@@ -892,7 +892,7 @@
                 !(stage == ast::PipelineStage::kFragment && is_input)) {
                 is_stage_mismatch = true;
             }
-            if (!type->Is<sem::Bool>()) {
+            if (!type->Is<type::Bool>()) {
                 AddError("store type of " + attr_to_str(attr) + " must be 'bool'", attr->source);
                 return false;
             }
@@ -902,7 +902,7 @@
                 !(stage == ast::PipelineStage::kCompute && is_input)) {
                 is_stage_mismatch = true;
             }
-            if (!type->Is<sem::U32>()) {
+            if (!type->Is<type::U32>()) {
                 AddError("store type of " + attr_to_str(attr) + " must be 'u32'", attr->source);
                 return false;
             }
@@ -913,7 +913,7 @@
                 !(stage == ast::PipelineStage::kVertex && is_input)) {
                 is_stage_mismatch = true;
             }
-            if (!type->Is<sem::U32>()) {
+            if (!type->Is<type::U32>()) {
                 AddError("store type of " + attr_to_str(attr) + " must be 'u32'", attr->source);
                 return false;
             }
@@ -922,7 +922,7 @@
             if (stage != ast::PipelineStage::kNone && !(stage == ast::PipelineStage::kFragment)) {
                 is_stage_mismatch = true;
             }
-            if (!type->Is<sem::U32>()) {
+            if (!type->Is<type::U32>()) {
                 AddError("store type of " + attr_to_str(attr) + " must be 'u32'", attr->source);
                 return false;
             }
@@ -932,7 +932,7 @@
                 !(stage == ast::PipelineStage::kFragment && is_input)) {
                 is_stage_mismatch = true;
             }
-            if (!type->Is<sem::U32>()) {
+            if (!type->Is<type::U32>()) {
                 AddError("store type of " + attr_to_str(attr) + " must be 'u32'", attr->source);
                 return false;
             }
@@ -991,7 +991,7 @@
         return false;
     }
 
-    if (!func->ReturnType()->Is<sem::Void>()) {
+    if (!func->ReturnType()->Is<type::Void>()) {
         if (!func->ReturnType()->IsConstructible()) {
             AddError("function return type must be a constructible type",
                      decl->return_type->source);
@@ -1247,7 +1247,7 @@
     builtins.Clear();
     locations.Clear();
 
-    if (!func->ReturnType()->Is<sem::Void>()) {
+    if (!func->ReturnType()->Is<type::Void>()) {
         if (!validate_entry_point_attributes(decl->return_type_attributes, func->ReturnType(),
                                              decl->source, ParamOrRetType::kReturnType,
                                              func->ReturnLocation())) {
@@ -1458,7 +1458,7 @@
     }
     if (auto* cond = stmt->Condition()) {
         auto* cond_ty = cond->Type()->UnwrapRef();
-        if (!cond_ty->Is<sem::Bool>()) {
+        if (!cond_ty->Is<type::Bool>()) {
             AddError("for-loop condition must be bool, got " + sem_.TypeNameOf(cond_ty),
                      stmt->Condition()->Declaration()->source);
             return false;
@@ -1474,7 +1474,7 @@
     }
     if (auto* cond = stmt->Condition()) {
         auto* cond_ty = cond->Type()->UnwrapRef();
-        if (!cond_ty->Is<sem::Bool>()) {
+        if (!cond_ty->Is<type::Bool>()) {
             AddError("while condition must be bool, got " + sem_.TypeNameOf(cond_ty),
                      stmt->Condition()->Declaration()->source);
             return false;
@@ -1486,7 +1486,7 @@
 bool Validator::BreakIfStatement(const sem::BreakIfStatement* stmt,
                                  sem::Statement* current_statement) const {
     auto* cond_ty = stmt->Condition()->Type()->UnwrapRef();
-    if (!cond_ty->Is<sem::Bool>()) {
+    if (!cond_ty->Is<type::Bool>()) {
         AddError("break-if statement condition must be bool, got " + sem_.TypeNameOf(cond_ty),
                  stmt->Condition()->Declaration()->source);
         return false;
@@ -1513,7 +1513,7 @@
 
 bool Validator::IfStatement(const sem::IfStatement* stmt) const {
     auto* cond_ty = stmt->Condition()->Type()->UnwrapRef();
-    if (!cond_ty->Is<sem::Bool>()) {
+    if (!cond_ty->Is<type::Bool>()) {
         AddError("if statement condition must be bool, got " + sem_.TypeNameOf(cond_ty),
                  stmt->Condition()->Declaration()->source);
         return false;
@@ -1522,7 +1522,7 @@
 }
 
 bool Validator::BuiltinCall(const sem::Call* call) const {
-    if (call->Type()->Is<sem::Void>()) {
+    if (call->Type()->Is<type::Void>()) {
         bool is_call_statement = false;
         // Some built-in call are not owned by a statement, e.g. a built-in called in global
         // variable declaration. Calling no-return-value built-in in these context is invalid as
@@ -1692,7 +1692,7 @@
         }
     }
 
-    if (call->Type()->Is<sem::Void>()) {
+    if (call->Type()->Is<type::Void>()) {
         bool is_call_statement = false;
         if (auto* call_stmt = As<ast::CallStatement>(call->Stmt()->Declaration())) {
             if (call_stmt->expr == call->Declaration()) {
@@ -2228,7 +2228,7 @@
             auto value = selector->Value()->As<uint32_t>();
             if (auto added = selectors.Add(value, selector->Declaration()->source); !added) {
                 AddError("duplicate switch case '" +
-                             (decl_ty->IsAnyOf<sem::I32, type::AbstractNumeric>()
+                             (decl_ty->IsAnyOf<type::I32, type::AbstractNumeric>()
                                   ? std::to_string(i32(value))
                                   : std::to_string(value)) +
                              "'",
diff --git a/src/tint/resolver/validator_is_storeable_test.cc b/src/tint/resolver/validator_is_storeable_test.cc
index 3dd144c..6e464bc 100644
--- a/src/tint/resolver/validator_is_storeable_test.cc
+++ b/src/tint/resolver/validator_is_storeable_test.cc
@@ -24,39 +24,39 @@
 using ValidatorIsStorableTest = ResolverTest;
 
 TEST_F(ValidatorIsStorableTest, Void) {
-    EXPECT_FALSE(v()->IsStorable(create<sem::Void>()));
+    EXPECT_FALSE(v()->IsStorable(create<type::Void>()));
 }
 
 TEST_F(ValidatorIsStorableTest, Scalar) {
-    EXPECT_TRUE(v()->IsStorable(create<sem::Bool>()));
-    EXPECT_TRUE(v()->IsStorable(create<sem::I32>()));
-    EXPECT_TRUE(v()->IsStorable(create<sem::U32>()));
-    EXPECT_TRUE(v()->IsStorable(create<sem::F32>()));
-    EXPECT_TRUE(v()->IsStorable(create<sem::F16>()));
+    EXPECT_TRUE(v()->IsStorable(create<type::Bool>()));
+    EXPECT_TRUE(v()->IsStorable(create<type::I32>()));
+    EXPECT_TRUE(v()->IsStorable(create<type::U32>()));
+    EXPECT_TRUE(v()->IsStorable(create<type::F32>()));
+    EXPECT_TRUE(v()->IsStorable(create<type::F16>()));
 }
 
 TEST_F(ValidatorIsStorableTest, Vector) {
-    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<sem::I32>(), 2u)));
-    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<sem::I32>(), 3u)));
-    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<sem::I32>(), 4u)));
-    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<sem::U32>(), 2u)));
-    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<sem::U32>(), 3u)));
-    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<sem::U32>(), 4u)));
-    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<sem::F32>(), 2u)));
-    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<sem::F32>(), 3u)));
-    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<sem::F32>(), 4u)));
-    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<sem::F16>(), 2u)));
-    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<sem::F16>(), 3u)));
-    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<sem::F16>(), 4u)));
+    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<type::I32>(), 2u)));
+    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<type::I32>(), 3u)));
+    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<type::I32>(), 4u)));
+    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<type::U32>(), 2u)));
+    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<type::U32>(), 3u)));
+    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<type::U32>(), 4u)));
+    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<type::F32>(), 2u)));
+    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<type::F32>(), 3u)));
+    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<type::F32>(), 4u)));
+    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<type::F16>(), 2u)));
+    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<type::F16>(), 3u)));
+    EXPECT_TRUE(v()->IsStorable(create<sem::Vector>(create<type::F16>(), 4u)));
 }
 
 TEST_F(ValidatorIsStorableTest, Matrix) {
-    auto* vec2_f32 = create<sem::Vector>(create<sem::F32>(), 2u);
-    auto* vec3_f32 = create<sem::Vector>(create<sem::F32>(), 3u);
-    auto* vec4_f32 = create<sem::Vector>(create<sem::F32>(), 4u);
-    auto* vec2_f16 = create<sem::Vector>(create<sem::F16>(), 2u);
-    auto* vec3_f16 = create<sem::Vector>(create<sem::F16>(), 3u);
-    auto* vec4_f16 = create<sem::Vector>(create<sem::F16>(), 4u);
+    auto* vec2_f32 = create<sem::Vector>(create<type::F32>(), 2u);
+    auto* vec3_f32 = create<sem::Vector>(create<type::F32>(), 3u);
+    auto* vec4_f32 = create<sem::Vector>(create<type::F32>(), 4u);
+    auto* vec2_f16 = create<sem::Vector>(create<type::F16>(), 2u);
+    auto* vec3_f16 = create<sem::Vector>(create<type::F16>(), 3u);
+    auto* vec4_f16 = create<sem::Vector>(create<type::F16>(), 4u);
     EXPECT_TRUE(v()->IsStorable(create<sem::Matrix>(vec2_f32, 2u)));
     EXPECT_TRUE(v()->IsStorable(create<sem::Matrix>(vec2_f32, 3u)));
     EXPECT_TRUE(v()->IsStorable(create<sem::Matrix>(vec2_f32, 4u)));
@@ -78,25 +78,25 @@
 }
 
 TEST_F(ValidatorIsStorableTest, Pointer) {
-    auto* ptr = create<sem::Pointer>(create<sem::I32>(), ast::AddressSpace::kPrivate,
+    auto* ptr = create<sem::Pointer>(create<type::I32>(), ast::AddressSpace::kPrivate,
                                      ast::Access::kReadWrite);
     EXPECT_FALSE(v()->IsStorable(ptr));
 }
 
 TEST_F(ValidatorIsStorableTest, Atomic) {
-    EXPECT_TRUE(v()->IsStorable(create<sem::Atomic>(create<sem::I32>())));
-    EXPECT_TRUE(v()->IsStorable(create<sem::Atomic>(create<sem::U32>())));
+    EXPECT_TRUE(v()->IsStorable(create<sem::Atomic>(create<type::I32>())));
+    EXPECT_TRUE(v()->IsStorable(create<sem::Atomic>(create<type::U32>())));
 }
 
 TEST_F(ValidatorIsStorableTest, ArraySizedOfStorable) {
-    auto* arr = create<sem::Array>(create<sem::I32>(), create<type::ConstantArrayCount>(5u), 4u,
+    auto* arr = create<sem::Array>(create<type::I32>(), create<type::ConstantArrayCount>(5u), 4u,
                                    20u, 4u, 4u);
     EXPECT_TRUE(v()->IsStorable(arr));
 }
 
 TEST_F(ValidatorIsStorableTest, ArrayUnsizedOfStorable) {
     auto* arr =
-        create<sem::Array>(create<sem::I32>(), create<type::RuntimeArrayCount>(), 4u, 4u, 4u, 4u);
+        create<sem::Array>(create<type::I32>(), create<type::RuntimeArrayCount>(), 4u, 4u, 4u, 4u);
     EXPECT_TRUE(v()->IsStorable(arr));
 }
 
diff --git a/src/tint/resolver/variable_test.cc b/src/tint/resolver/variable_test.cc
index 68f4bc2..a0a5ae7 100644
--- a/src/tint/resolver/variable_test.cc
+++ b/src/tint/resolver/variable_test.cc
@@ -76,11 +76,11 @@
     ASSERT_TRUE(TypeOf(s)->Is<sem::Reference>());
     ASSERT_TRUE(TypeOf(a)->Is<sem::Reference>());
 
-    EXPECT_TRUE(TypeOf(i)->As<sem::Reference>()->StoreType()->Is<sem::I32>());
-    EXPECT_TRUE(TypeOf(u)->As<sem::Reference>()->StoreType()->Is<sem::U32>());
-    EXPECT_TRUE(TypeOf(f)->As<sem::Reference>()->StoreType()->Is<sem::F32>());
-    EXPECT_TRUE(TypeOf(h)->As<sem::Reference>()->StoreType()->Is<sem::F16>());
-    EXPECT_TRUE(TypeOf(b)->As<sem::Reference>()->StoreType()->Is<sem::Bool>());
+    EXPECT_TRUE(TypeOf(i)->As<sem::Reference>()->StoreType()->Is<type::I32>());
+    EXPECT_TRUE(TypeOf(u)->As<sem::Reference>()->StoreType()->Is<type::U32>());
+    EXPECT_TRUE(TypeOf(f)->As<sem::Reference>()->StoreType()->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(h)->As<sem::Reference>()->StoreType()->Is<type::F16>());
+    EXPECT_TRUE(TypeOf(b)->As<sem::Reference>()->StoreType()->Is<type::Bool>());
     EXPECT_TRUE(TypeOf(s)->As<sem::Reference>()->StoreType()->Is<sem::Struct>());
     EXPECT_TRUE(TypeOf(a)->As<sem::Reference>()->StoreType()->Is<sem::Struct>());
 
@@ -156,11 +156,11 @@
     EXPECT_EQ(TypeOf(s)->As<sem::Reference>()->Access(), ast::Access::kReadWrite);
     EXPECT_EQ(TypeOf(a)->As<sem::Reference>()->Access(), ast::Access::kReadWrite);
 
-    EXPECT_TRUE(TypeOf(i)->As<sem::Reference>()->StoreType()->Is<sem::I32>());
-    EXPECT_TRUE(TypeOf(u)->As<sem::Reference>()->StoreType()->Is<sem::U32>());
-    EXPECT_TRUE(TypeOf(f)->As<sem::Reference>()->StoreType()->Is<sem::F32>());
-    EXPECT_TRUE(TypeOf(h)->As<sem::Reference>()->StoreType()->Is<sem::F16>());
-    EXPECT_TRUE(TypeOf(b)->As<sem::Reference>()->StoreType()->Is<sem::Bool>());
+    EXPECT_TRUE(TypeOf(i)->As<sem::Reference>()->StoreType()->Is<type::I32>());
+    EXPECT_TRUE(TypeOf(u)->As<sem::Reference>()->StoreType()->Is<type::U32>());
+    EXPECT_TRUE(TypeOf(f)->As<sem::Reference>()->StoreType()->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(h)->As<sem::Reference>()->StoreType()->Is<type::F16>());
+    EXPECT_TRUE(TypeOf(b)->As<sem::Reference>()->StoreType()->Is<type::Bool>());
     EXPECT_TRUE(TypeOf(s)->As<sem::Reference>()->StoreType()->Is<sem::Struct>());
     EXPECT_TRUE(TypeOf(a)->As<sem::Reference>()->StoreType()->Is<sem::Struct>());
 
@@ -437,15 +437,15 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     // `let` declarations are always of the storage type
-    ASSERT_TRUE(TypeOf(i)->Is<sem::I32>());
-    ASSERT_TRUE(TypeOf(u)->Is<sem::U32>());
-    ASSERT_TRUE(TypeOf(f)->Is<sem::F32>());
-    ASSERT_TRUE(TypeOf(h)->Is<sem::F16>());
-    ASSERT_TRUE(TypeOf(b)->Is<sem::Bool>());
+    ASSERT_TRUE(TypeOf(i)->Is<type::I32>());
+    ASSERT_TRUE(TypeOf(u)->Is<type::U32>());
+    ASSERT_TRUE(TypeOf(f)->Is<type::F32>());
+    ASSERT_TRUE(TypeOf(h)->Is<type::F16>());
+    ASSERT_TRUE(TypeOf(b)->Is<type::Bool>());
     ASSERT_TRUE(TypeOf(s)->Is<sem::Struct>());
     ASSERT_TRUE(TypeOf(a)->Is<sem::Struct>());
     ASSERT_TRUE(TypeOf(p)->Is<sem::Pointer>());
-    ASSERT_TRUE(TypeOf(p)->As<sem::Pointer>()->StoreType()->Is<sem::I32>());
+    ASSERT_TRUE(TypeOf(p)->As<sem::Pointer>()->StoreType()->Is<type::I32>());
 
     EXPECT_EQ(Sem().Get(i)->Initializer()->Declaration(), i_c);
     EXPECT_EQ(Sem().Get(u)->Initializer()->Declaration(), u_c);
@@ -913,9 +913,9 @@
     EXPECT_EQ(Sem().Get(c_mf32)->Declaration(), c_mf32);
     EXPECT_EQ(Sem().Get(c_s)->Declaration(), c_s);
 
-    ASSERT_TRUE(TypeOf(c_i32)->Is<sem::I32>());
-    ASSERT_TRUE(TypeOf(c_u32)->Is<sem::U32>());
-    ASSERT_TRUE(TypeOf(c_f32)->Is<sem::F32>());
+    ASSERT_TRUE(TypeOf(c_i32)->Is<type::I32>());
+    ASSERT_TRUE(TypeOf(c_u32)->Is<type::U32>());
+    ASSERT_TRUE(TypeOf(c_f32)->Is<type::F32>());
     ASSERT_TRUE(TypeOf(c_vi32)->Is<sem::Vector>());
     ASSERT_TRUE(TypeOf(c_vu32)->Is<sem::Vector>());
     ASSERT_TRUE(TypeOf(c_vf32)->Is<sem::Vector>());
@@ -971,9 +971,9 @@
     EXPECT_EQ(Sem().Get(c_maf32)->Declaration(), c_maf32);
     EXPECT_EQ(Sem().Get(c_s)->Declaration(), c_s);
 
-    ASSERT_TRUE(TypeOf(c_i32)->Is<sem::I32>());
-    ASSERT_TRUE(TypeOf(c_u32)->Is<sem::U32>());
-    ASSERT_TRUE(TypeOf(c_f32)->Is<sem::F32>());
+    ASSERT_TRUE(TypeOf(c_i32)->Is<type::I32>());
+    ASSERT_TRUE(TypeOf(c_u32)->Is<type::U32>());
+    ASSERT_TRUE(TypeOf(c_f32)->Is<type::F32>());
     ASSERT_TRUE(TypeOf(c_ai)->Is<type::AbstractInt>());
     ASSERT_TRUE(TypeOf(c_af)->Is<type::AbstractFloat>());
     ASSERT_TRUE(TypeOf(c_vi32)->Is<sem::Vector>());
@@ -1009,7 +1009,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(c)->Is<sem::I32>());
+    ASSERT_TRUE(TypeOf(c)->Is<type::I32>());
 
     EXPECT_EQ(Sem().Get(c)->ConstantValue()->As<i32>(), 42_i);
 }
@@ -1021,7 +1021,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(c)->Is<sem::I32>());
+    ASSERT_TRUE(TypeOf(c)->Is<type::I32>());
 
     EXPECT_EQ(Sem().Get(c)->ConstantValue()->As<i32>(), 3_i);
 }
@@ -1093,9 +1093,9 @@
     EXPECT_EQ(Sem().Get(c_vf32)->Declaration(), c_vf32);
     EXPECT_EQ(Sem().Get(c_mf32)->Declaration(), c_mf32);
 
-    ASSERT_TRUE(TypeOf(c_i32)->Is<sem::I32>());
-    ASSERT_TRUE(TypeOf(c_u32)->Is<sem::U32>());
-    ASSERT_TRUE(TypeOf(c_f32)->Is<sem::F32>());
+    ASSERT_TRUE(TypeOf(c_i32)->Is<type::I32>());
+    ASSERT_TRUE(TypeOf(c_u32)->Is<type::U32>());
+    ASSERT_TRUE(TypeOf(c_f32)->Is<type::F32>());
     ASSERT_TRUE(TypeOf(c_vi32)->Is<sem::Vector>());
     ASSERT_TRUE(TypeOf(c_vu32)->Is<sem::Vector>());
     ASSERT_TRUE(TypeOf(c_vf32)->Is<sem::Vector>());
@@ -1142,9 +1142,9 @@
     EXPECT_EQ(Sem().Get(c_mf32)->Declaration(), c_mf32);
     EXPECT_EQ(Sem().Get(c_maf32)->Declaration(), c_maf32);
 
-    ASSERT_TRUE(TypeOf(c_i32)->Is<sem::I32>());
-    ASSERT_TRUE(TypeOf(c_u32)->Is<sem::U32>());
-    ASSERT_TRUE(TypeOf(c_f32)->Is<sem::F32>());
+    ASSERT_TRUE(TypeOf(c_i32)->Is<type::I32>());
+    ASSERT_TRUE(TypeOf(c_u32)->Is<type::U32>());
+    ASSERT_TRUE(TypeOf(c_f32)->Is<type::F32>());
     ASSERT_TRUE(TypeOf(c_ai)->Is<type::AbstractInt>());
     ASSERT_TRUE(TypeOf(c_af)->Is<type::AbstractFloat>());
     ASSERT_TRUE(TypeOf(c_vi32)->Is<sem::Vector>());
@@ -1176,7 +1176,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(c)->Is<sem::I32>());
+    ASSERT_TRUE(TypeOf(c)->Is<type::I32>());
 
     EXPECT_EQ(Sem().Get(c)->ConstantValue()->As<i32>(), 42_i);
 }
@@ -1186,7 +1186,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(c)->Is<sem::I32>());
+    ASSERT_TRUE(TypeOf(c)->Is<type::I32>());
 
     EXPECT_EQ(Sem().Get(c)->ConstantValue()->As<i32>(), 3_i);
 }
diff --git a/src/tint/sem/array_test.cc b/src/tint/sem/array_test.cc
index e4ecd07..ab244b9 100644
--- a/src/tint/sem/array_test.cc
+++ b/src/tint/sem/array_test.cc
@@ -21,15 +21,22 @@
 using ArrayTest = TestHelper;
 
 TEST_F(ArrayTest, CreateSizedArray) {
-    auto* a = create<Array>(create<U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 32u, 16u);
-    auto* b = create<Array>(create<U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 32u, 16u);
-    auto* c = create<Array>(create<U32>(), create<type::ConstantArrayCount>(3u), 4u, 8u, 32u, 16u);
-    auto* d = create<Array>(create<U32>(), create<type::ConstantArrayCount>(2u), 5u, 8u, 32u, 16u);
-    auto* e = create<Array>(create<U32>(), create<type::ConstantArrayCount>(2u), 4u, 9u, 32u, 16u);
-    auto* f = create<Array>(create<U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 33u, 16u);
-    auto* g = create<Array>(create<U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 33u, 17u);
+    auto* a =
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 32u, 16u);
+    auto* b =
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 32u, 16u);
+    auto* c =
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(3u), 4u, 8u, 32u, 16u);
+    auto* d =
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(2u), 5u, 8u, 32u, 16u);
+    auto* e =
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(2u), 4u, 9u, 32u, 16u);
+    auto* f =
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 33u, 16u);
+    auto* g =
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 33u, 17u);
 
-    EXPECT_EQ(a->ElemType(), create<U32>());
+    EXPECT_EQ(a->ElemType(), create<type::U32>());
     EXPECT_EQ(a->Count(), create<type::ConstantArrayCount>(2u));
     EXPECT_EQ(a->Align(), 4u);
     EXPECT_EQ(a->Size(), 8u);
@@ -47,14 +54,20 @@
 }
 
 TEST_F(ArrayTest, CreateRuntimeArray) {
-    auto* a = create<Array>(create<U32>(), create<type::RuntimeArrayCount>(), 4u, 8u, 32u, 32u);
-    auto* b = create<Array>(create<U32>(), create<type::RuntimeArrayCount>(), 4u, 8u, 32u, 32u);
-    auto* c = create<Array>(create<U32>(), create<type::RuntimeArrayCount>(), 5u, 8u, 32u, 32u);
-    auto* d = create<Array>(create<U32>(), create<type::RuntimeArrayCount>(), 4u, 9u, 32u, 32u);
-    auto* e = create<Array>(create<U32>(), create<type::RuntimeArrayCount>(), 4u, 8u, 33u, 32u);
-    auto* f = create<Array>(create<U32>(), create<type::RuntimeArrayCount>(), 4u, 8u, 33u, 17u);
+    auto* a =
+        create<Array>(create<type::U32>(), create<type::RuntimeArrayCount>(), 4u, 8u, 32u, 32u);
+    auto* b =
+        create<Array>(create<type::U32>(), create<type::RuntimeArrayCount>(), 4u, 8u, 32u, 32u);
+    auto* c =
+        create<Array>(create<type::U32>(), create<type::RuntimeArrayCount>(), 5u, 8u, 32u, 32u);
+    auto* d =
+        create<Array>(create<type::U32>(), create<type::RuntimeArrayCount>(), 4u, 9u, 32u, 32u);
+    auto* e =
+        create<Array>(create<type::U32>(), create<type::RuntimeArrayCount>(), 4u, 8u, 33u, 32u);
+    auto* f =
+        create<Array>(create<type::U32>(), create<type::RuntimeArrayCount>(), 4u, 8u, 33u, 17u);
 
-    EXPECT_EQ(a->ElemType(), create<U32>());
+    EXPECT_EQ(a->ElemType(), create<type::U32>());
     EXPECT_EQ(a->Count(), create<type::RuntimeArrayCount>());
     EXPECT_EQ(a->Align(), 4u);
     EXPECT_EQ(a->Size(), 8u);
@@ -71,13 +84,20 @@
 }
 
 TEST_F(ArrayTest, Hash) {
-    auto* a = create<Array>(create<U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 32u, 16u);
-    auto* b = create<Array>(create<U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 32u, 16u);
-    auto* c = create<Array>(create<U32>(), create<type::ConstantArrayCount>(3u), 4u, 8u, 32u, 16u);
-    auto* d = create<Array>(create<U32>(), create<type::ConstantArrayCount>(2u), 5u, 8u, 32u, 16u);
-    auto* e = create<Array>(create<U32>(), create<type::ConstantArrayCount>(2u), 4u, 9u, 32u, 16u);
-    auto* f = create<Array>(create<U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 33u, 16u);
-    auto* g = create<Array>(create<U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 33u, 17u);
+    auto* a =
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 32u, 16u);
+    auto* b =
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 32u, 16u);
+    auto* c =
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(3u), 4u, 8u, 32u, 16u);
+    auto* d =
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(2u), 5u, 8u, 32u, 16u);
+    auto* e =
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(2u), 4u, 9u, 32u, 16u);
+    auto* f =
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 33u, 16u);
+    auto* g =
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 33u, 17u);
 
     EXPECT_EQ(a->Hash(), b->Hash());
     EXPECT_NE(a->Hash(), c->Hash());
@@ -88,13 +108,20 @@
 }
 
 TEST_F(ArrayTest, Equals) {
-    auto* a = create<Array>(create<U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 32u, 16u);
-    auto* b = create<Array>(create<U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 32u, 16u);
-    auto* c = create<Array>(create<U32>(), create<type::ConstantArrayCount>(3u), 4u, 8u, 32u, 16u);
-    auto* d = create<Array>(create<U32>(), create<type::ConstantArrayCount>(2u), 5u, 8u, 32u, 16u);
-    auto* e = create<Array>(create<U32>(), create<type::ConstantArrayCount>(2u), 4u, 9u, 32u, 16u);
-    auto* f = create<Array>(create<U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 33u, 16u);
-    auto* g = create<Array>(create<U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 33u, 17u);
+    auto* a =
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 32u, 16u);
+    auto* b =
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 32u, 16u);
+    auto* c =
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(3u), 4u, 8u, 32u, 16u);
+    auto* d =
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(2u), 5u, 8u, 32u, 16u);
+    auto* e =
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(2u), 4u, 9u, 32u, 16u);
+    auto* f =
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 33u, 16u);
+    auto* g =
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 33u, 17u);
 
     EXPECT_TRUE(a->Equals(*b));
     EXPECT_FALSE(a->Equals(*c));
@@ -102,38 +129,42 @@
     EXPECT_FALSE(a->Equals(*e));
     EXPECT_FALSE(a->Equals(*f));
     EXPECT_FALSE(a->Equals(*g));
-    EXPECT_FALSE(a->Equals(Void{}));
+    EXPECT_FALSE(a->Equals(type::Void{}));
 }
 
 TEST_F(ArrayTest, FriendlyNameRuntimeSized) {
-    auto* arr = create<Array>(create<I32>(), create<type::RuntimeArrayCount>(), 0u, 4u, 4u, 4u);
+    auto* arr =
+        create<Array>(create<type::I32>(), create<type::RuntimeArrayCount>(), 0u, 4u, 4u, 4u);
     EXPECT_EQ(arr->FriendlyName(Symbols()), "array<i32>");
 }
 
 TEST_F(ArrayTest, FriendlyNameStaticSized) {
-    auto* arr = create<Array>(create<I32>(), create<type::ConstantArrayCount>(5u), 4u, 20u, 4u, 4u);
+    auto* arr =
+        create<Array>(create<type::I32>(), create<type::ConstantArrayCount>(5u), 4u, 20u, 4u, 4u);
     EXPECT_EQ(arr->FriendlyName(Symbols()), "array<i32, 5>");
 }
 
 TEST_F(ArrayTest, FriendlyNameRuntimeSizedNonImplicitStride) {
-    auto* arr = create<Array>(create<I32>(), create<type::RuntimeArrayCount>(), 0u, 4u, 8u, 4u);
+    auto* arr =
+        create<Array>(create<type::I32>(), create<type::RuntimeArrayCount>(), 0u, 4u, 8u, 4u);
     EXPECT_EQ(arr->FriendlyName(Symbols()), "@stride(8) array<i32>");
 }
 
 TEST_F(ArrayTest, FriendlyNameStaticSizedNonImplicitStride) {
-    auto* arr = create<Array>(create<I32>(), create<type::ConstantArrayCount>(5u), 4u, 20u, 8u, 4u);
+    auto* arr =
+        create<Array>(create<type::I32>(), create<type::ConstantArrayCount>(5u), 4u, 20u, 8u, 4u);
     EXPECT_EQ(arr->FriendlyName(Symbols()), "@stride(8) array<i32, 5>");
 }
 
 TEST_F(ArrayTest, IsConstructable) {
     auto* fixed_sized =
-        create<Array>(create<U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 32u, 16u);
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 32u, 16u);
     auto* named_override_sized = create<Array>(
-        create<U32>(), create<sem::NamedOverrideArrayCount>(nullptr), 4u, 8u, 32u, 16u);
+        create<type::U32>(), create<sem::NamedOverrideArrayCount>(nullptr), 4u, 8u, 32u, 16u);
     auto* unnamed_override_sized = create<Array>(
-        create<U32>(), create<sem::UnnamedOverrideArrayCount>(nullptr), 4u, 8u, 32u, 16u);
+        create<type::U32>(), create<sem::UnnamedOverrideArrayCount>(nullptr), 4u, 8u, 32u, 16u);
     auto* runtime_sized =
-        create<Array>(create<U32>(), create<type::RuntimeArrayCount>(), 4u, 8u, 32u, 16u);
+        create<Array>(create<type::U32>(), create<type::RuntimeArrayCount>(), 4u, 8u, 32u, 16u);
 
     EXPECT_TRUE(fixed_sized->IsConstructible());
     EXPECT_FALSE(named_override_sized->IsConstructible());
@@ -143,13 +174,13 @@
 
 TEST_F(ArrayTest, HasCreationFixedFootprint) {
     auto* fixed_sized =
-        create<Array>(create<U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 32u, 16u);
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 32u, 16u);
     auto* named_override_sized = create<Array>(
-        create<U32>(), create<sem::NamedOverrideArrayCount>(nullptr), 4u, 8u, 32u, 16u);
+        create<type::U32>(), create<sem::NamedOverrideArrayCount>(nullptr), 4u, 8u, 32u, 16u);
     auto* unnamed_override_sized = create<Array>(
-        create<U32>(), create<sem::UnnamedOverrideArrayCount>(nullptr), 4u, 8u, 32u, 16u);
+        create<type::U32>(), create<sem::UnnamedOverrideArrayCount>(nullptr), 4u, 8u, 32u, 16u);
     auto* runtime_sized =
-        create<Array>(create<U32>(), create<type::RuntimeArrayCount>(), 4u, 8u, 32u, 16u);
+        create<Array>(create<type::U32>(), create<type::RuntimeArrayCount>(), 4u, 8u, 32u, 16u);
 
     EXPECT_TRUE(fixed_sized->HasCreationFixedFootprint());
     EXPECT_FALSE(named_override_sized->HasCreationFixedFootprint());
@@ -159,13 +190,13 @@
 
 TEST_F(ArrayTest, HasFixedFootprint) {
     auto* fixed_sized =
-        create<Array>(create<U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 32u, 16u);
+        create<Array>(create<type::U32>(), create<type::ConstantArrayCount>(2u), 4u, 8u, 32u, 16u);
     auto* named_override_sized = create<Array>(
-        create<U32>(), create<sem::NamedOverrideArrayCount>(nullptr), 4u, 8u, 32u, 16u);
+        create<type::U32>(), create<sem::NamedOverrideArrayCount>(nullptr), 4u, 8u, 32u, 16u);
     auto* unnamed_override_sized = create<Array>(
-        create<U32>(), create<sem::UnnamedOverrideArrayCount>(nullptr), 4u, 8u, 32u, 16u);
+        create<type::U32>(), create<sem::UnnamedOverrideArrayCount>(nullptr), 4u, 8u, 32u, 16u);
     auto* runtime_sized =
-        create<Array>(create<U32>(), create<type::RuntimeArrayCount>(), 4u, 8u, 32u, 16u);
+        create<Array>(create<type::U32>(), create<type::RuntimeArrayCount>(), 4u, 8u, 32u, 16u);
 
     EXPECT_TRUE(fixed_sized->HasFixedFootprint());
     EXPECT_TRUE(named_override_sized->HasFixedFootprint());
diff --git a/src/tint/sem/atomic_test.cc b/src/tint/sem/atomic_test.cc
index fbf9bc3..436f185 100644
--- a/src/tint/sem/atomic_test.cc
+++ b/src/tint/sem/atomic_test.cc
@@ -22,33 +22,33 @@
 using AtomicTest = TestHelper;
 
 TEST_F(AtomicTest, Creation) {
-    auto* a = create<Atomic>(create<I32>());
-    auto* b = create<Atomic>(create<I32>());
-    auto* c = create<Atomic>(create<U32>());
-    EXPECT_TRUE(a->Type()->Is<sem::I32>());
+    auto* a = create<Atomic>(create<type::I32>());
+    auto* b = create<Atomic>(create<type::I32>());
+    auto* c = create<Atomic>(create<type::U32>());
+    EXPECT_TRUE(a->Type()->Is<type::I32>());
     EXPECT_EQ(a, b);
     EXPECT_NE(a, c);
 }
 
 TEST_F(AtomicTest, Hash) {
-    auto* a = create<Atomic>(create<I32>());
-    auto* b = create<Atomic>(create<I32>());
-    auto* c = create<Atomic>(create<U32>());
+    auto* a = create<Atomic>(create<type::I32>());
+    auto* b = create<Atomic>(create<type::I32>());
+    auto* c = create<Atomic>(create<type::U32>());
     EXPECT_EQ(a->Hash(), b->Hash());
     EXPECT_NE(a->Hash(), c->Hash());
 }
 
 TEST_F(AtomicTest, Equals) {
-    auto* a = create<Atomic>(create<I32>());
-    auto* b = create<Atomic>(create<I32>());
-    auto* c = create<Atomic>(create<U32>());
+    auto* a = create<Atomic>(create<type::I32>());
+    auto* b = create<Atomic>(create<type::I32>());
+    auto* c = create<Atomic>(create<type::U32>());
     EXPECT_TRUE(a->Equals(*b));
     EXPECT_FALSE(a->Equals(*c));
-    EXPECT_FALSE(a->Equals(Void{}));
+    EXPECT_FALSE(a->Equals(type::Void{}));
 }
 
 TEST_F(AtomicTest, FriendlyName) {
-    auto* a = create<Atomic>(create<I32>());
+    auto* a = create<Atomic>(create<type::I32>());
     EXPECT_EQ(a->FriendlyName(Symbols()), "atomic<i32>");
 }
 
diff --git a/src/tint/sem/expression_test.cc b/src/tint/sem/expression_test.cc
index aae9f46..f12f0ed 100644
--- a/src/tint/sem/expression_test.cc
+++ b/src/tint/sem/expression_test.cc
@@ -42,8 +42,8 @@
 using ExpressionTest = TestHelper;
 
 TEST_F(ExpressionTest, UnwrapMaterialize) {
-    MockConstant c(create<I32>());
-    auto* a = create<Expression>(/* declaration */ nullptr, create<I32>(),
+    MockConstant c(create<type::I32>());
+    auto* a = create<Expression>(/* declaration */ nullptr, create<type::I32>(),
                                  sem::EvaluationStage::kRuntime, /* statement */ nullptr,
                                  /* constant_value */ nullptr,
                                  /* has_side_effects */ false, /* root_ident */ nullptr);
diff --git a/src/tint/sem/matrix_test.cc b/src/tint/sem/matrix_test.cc
index fb8c850..5ff13dc 100644
--- a/src/tint/sem/matrix_test.cc
+++ b/src/tint/sem/matrix_test.cc
@@ -21,13 +21,13 @@
 using MatrixTest = TestHelper;
 
 TEST_F(MatrixTest, Creation) {
-    auto* a = create<Matrix>(create<Vector>(create<I32>(), 3u), 4u);
-    auto* b = create<Matrix>(create<Vector>(create<I32>(), 3u), 4u);
-    auto* c = create<Matrix>(create<Vector>(create<F32>(), 3u), 4u);
-    auto* d = create<Matrix>(create<Vector>(create<I32>(), 2u), 4u);
-    auto* e = create<Matrix>(create<Vector>(create<I32>(), 3u), 2u);
+    auto* a = create<Matrix>(create<Vector>(create<type::I32>(), 3u), 4u);
+    auto* b = create<Matrix>(create<Vector>(create<type::I32>(), 3u), 4u);
+    auto* c = create<Matrix>(create<Vector>(create<type::F32>(), 3u), 4u);
+    auto* d = create<Matrix>(create<Vector>(create<type::I32>(), 2u), 4u);
+    auto* e = create<Matrix>(create<Vector>(create<type::I32>(), 3u), 2u);
 
-    EXPECT_EQ(a->type(), create<I32>());
+    EXPECT_EQ(a->type(), create<type::I32>());
     EXPECT_EQ(a->rows(), 3u);
     EXPECT_EQ(a->columns(), 4u);
 
@@ -38,11 +38,11 @@
 }
 
 TEST_F(MatrixTest, Hash) {
-    auto* a = create<Matrix>(create<Vector>(create<I32>(), 3u), 4u);
-    auto* b = create<Matrix>(create<Vector>(create<I32>(), 3u), 4u);
-    auto* c = create<Matrix>(create<Vector>(create<F32>(), 3u), 4u);
-    auto* d = create<Matrix>(create<Vector>(create<I32>(), 2u), 4u);
-    auto* e = create<Matrix>(create<Vector>(create<I32>(), 3u), 2u);
+    auto* a = create<Matrix>(create<Vector>(create<type::I32>(), 3u), 4u);
+    auto* b = create<Matrix>(create<Vector>(create<type::I32>(), 3u), 4u);
+    auto* c = create<Matrix>(create<Vector>(create<type::F32>(), 3u), 4u);
+    auto* d = create<Matrix>(create<Vector>(create<type::I32>(), 2u), 4u);
+    auto* e = create<Matrix>(create<Vector>(create<type::I32>(), 3u), 2u);
 
     EXPECT_EQ(a->Hash(), b->Hash());
     EXPECT_NE(a->Hash(), c->Hash());
@@ -51,21 +51,21 @@
 }
 
 TEST_F(MatrixTest, Equals) {
-    auto* a = create<Matrix>(create<Vector>(create<I32>(), 3u), 4u);
-    auto* b = create<Matrix>(create<Vector>(create<I32>(), 3u), 4u);
-    auto* c = create<Matrix>(create<Vector>(create<F32>(), 3u), 4u);
-    auto* d = create<Matrix>(create<Vector>(create<I32>(), 2u), 4u);
-    auto* e = create<Matrix>(create<Vector>(create<I32>(), 3u), 2u);
+    auto* a = create<Matrix>(create<Vector>(create<type::I32>(), 3u), 4u);
+    auto* b = create<Matrix>(create<Vector>(create<type::I32>(), 3u), 4u);
+    auto* c = create<Matrix>(create<Vector>(create<type::F32>(), 3u), 4u);
+    auto* d = create<Matrix>(create<Vector>(create<type::I32>(), 2u), 4u);
+    auto* e = create<Matrix>(create<Vector>(create<type::I32>(), 3u), 2u);
 
     EXPECT_TRUE(a->Equals(*b));
     EXPECT_FALSE(a->Equals(*c));
     EXPECT_FALSE(a->Equals(*d));
     EXPECT_FALSE(a->Equals(*e));
-    EXPECT_FALSE(a->Equals(Void{}));
+    EXPECT_FALSE(a->Equals(type::Void{}));
 }
 
 TEST_F(MatrixTest, FriendlyName) {
-    I32 i32;
+    type::I32 i32;
     Vector c{&i32, 3};
     Matrix m{&c, 2};
     EXPECT_EQ(m.FriendlyName(Symbols()), "mat2x3<i32>");
diff --git a/src/tint/sem/pointer_test.cc b/src/tint/sem/pointer_test.cc
index fb3d6c0..c5201ff 100644
--- a/src/tint/sem/pointer_test.cc
+++ b/src/tint/sem/pointer_test.cc
@@ -21,13 +21,17 @@
 using PointerTest = TestHelper;
 
 TEST_F(PointerTest, Creation) {
-    auto* a = create<Pointer>(create<I32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
-    auto* b = create<Pointer>(create<I32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
-    auto* c = create<Pointer>(create<F32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
-    auto* d = create<Pointer>(create<I32>(), ast::AddressSpace::kPrivate, ast::Access::kReadWrite);
-    auto* e = create<Pointer>(create<I32>(), ast::AddressSpace::kStorage, ast::Access::kRead);
+    auto* a =
+        create<Pointer>(create<type::I32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
+    auto* b =
+        create<Pointer>(create<type::I32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
+    auto* c =
+        create<Pointer>(create<type::F32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
+    auto* d =
+        create<Pointer>(create<type::I32>(), ast::AddressSpace::kPrivate, ast::Access::kReadWrite);
+    auto* e = create<Pointer>(create<type::I32>(), ast::AddressSpace::kStorage, ast::Access::kRead);
 
-    EXPECT_TRUE(a->StoreType()->Is<sem::I32>());
+    EXPECT_TRUE(a->StoreType()->Is<type::I32>());
     EXPECT_EQ(a->AddressSpace(), ast::AddressSpace::kStorage);
     EXPECT_EQ(a->Access(), ast::Access::kReadWrite);
 
@@ -38,11 +42,15 @@
 }
 
 TEST_F(PointerTest, Hash) {
-    auto* a = create<Pointer>(create<I32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
-    auto* b = create<Pointer>(create<I32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
-    auto* c = create<Pointer>(create<F32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
-    auto* d = create<Pointer>(create<I32>(), ast::AddressSpace::kPrivate, ast::Access::kReadWrite);
-    auto* e = create<Pointer>(create<I32>(), ast::AddressSpace::kStorage, ast::Access::kRead);
+    auto* a =
+        create<Pointer>(create<type::I32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
+    auto* b =
+        create<Pointer>(create<type::I32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
+    auto* c =
+        create<Pointer>(create<type::F32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
+    auto* d =
+        create<Pointer>(create<type::I32>(), ast::AddressSpace::kPrivate, ast::Access::kReadWrite);
+    auto* e = create<Pointer>(create<type::I32>(), ast::AddressSpace::kStorage, ast::Access::kRead);
 
     EXPECT_EQ(a->Hash(), b->Hash());
     EXPECT_NE(a->Hash(), c->Hash());
@@ -51,26 +59,31 @@
 }
 
 TEST_F(PointerTest, Equals) {
-    auto* a = create<Pointer>(create<I32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
-    auto* b = create<Pointer>(create<I32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
-    auto* c = create<Pointer>(create<F32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
-    auto* d = create<Pointer>(create<I32>(), ast::AddressSpace::kPrivate, ast::Access::kReadWrite);
-    auto* e = create<Pointer>(create<I32>(), ast::AddressSpace::kStorage, ast::Access::kRead);
+    auto* a =
+        create<Pointer>(create<type::I32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
+    auto* b =
+        create<Pointer>(create<type::I32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
+    auto* c =
+        create<Pointer>(create<type::F32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
+    auto* d =
+        create<Pointer>(create<type::I32>(), ast::AddressSpace::kPrivate, ast::Access::kReadWrite);
+    auto* e = create<Pointer>(create<type::I32>(), ast::AddressSpace::kStorage, ast::Access::kRead);
 
     EXPECT_TRUE(a->Equals(*b));
     EXPECT_FALSE(a->Equals(*c));
     EXPECT_FALSE(a->Equals(*d));
     EXPECT_FALSE(a->Equals(*e));
-    EXPECT_FALSE(a->Equals(Void{}));
+    EXPECT_FALSE(a->Equals(type::Void{}));
 }
 
 TEST_F(PointerTest, FriendlyName) {
-    auto* r = create<Pointer>(create<I32>(), ast::AddressSpace::kNone, ast::Access::kRead);
+    auto* r = create<Pointer>(create<type::I32>(), ast::AddressSpace::kNone, ast::Access::kRead);
     EXPECT_EQ(r->FriendlyName(Symbols()), "ptr<i32, read>");
 }
 
 TEST_F(PointerTest, FriendlyNameWithAddressSpace) {
-    auto* r = create<Pointer>(create<I32>(), ast::AddressSpace::kWorkgroup, ast::Access::kRead);
+    auto* r =
+        create<Pointer>(create<type::I32>(), ast::AddressSpace::kWorkgroup, ast::Access::kRead);
     EXPECT_EQ(r->FriendlyName(Symbols()), "ptr<workgroup, i32, read>");
 }
 
diff --git a/src/tint/sem/reference_test.cc b/src/tint/sem/reference_test.cc
index 53ba21b..3ead233 100644
--- a/src/tint/sem/reference_test.cc
+++ b/src/tint/sem/reference_test.cc
@@ -21,17 +21,18 @@
 using ReferenceTest = TestHelper;
 
 TEST_F(ReferenceTest, Creation) {
-    auto* a =
-        create<Reference>(create<I32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
-    auto* b =
-        create<Reference>(create<I32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
-    auto* c =
-        create<Reference>(create<F32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
-    auto* d =
-        create<Reference>(create<I32>(), ast::AddressSpace::kPrivate, ast::Access::kReadWrite);
-    auto* e = create<Reference>(create<I32>(), ast::AddressSpace::kStorage, ast::Access::kRead);
+    auto* a = create<Reference>(create<type::I32>(), ast::AddressSpace::kStorage,
+                                ast::Access::kReadWrite);
+    auto* b = create<Reference>(create<type::I32>(), ast::AddressSpace::kStorage,
+                                ast::Access::kReadWrite);
+    auto* c = create<Reference>(create<type::F32>(), ast::AddressSpace::kStorage,
+                                ast::Access::kReadWrite);
+    auto* d = create<Reference>(create<type::I32>(), ast::AddressSpace::kPrivate,
+                                ast::Access::kReadWrite);
+    auto* e =
+        create<Reference>(create<type::I32>(), ast::AddressSpace::kStorage, ast::Access::kRead);
 
-    EXPECT_TRUE(a->StoreType()->Is<sem::I32>());
+    EXPECT_TRUE(a->StoreType()->Is<type::I32>());
     EXPECT_EQ(a->AddressSpace(), ast::AddressSpace::kStorage);
     EXPECT_EQ(a->Access(), ast::Access::kReadWrite);
 
@@ -42,15 +43,16 @@
 }
 
 TEST_F(ReferenceTest, Hash) {
-    auto* a =
-        create<Reference>(create<I32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
-    auto* b =
-        create<Reference>(create<I32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
-    auto* c =
-        create<Reference>(create<F32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
-    auto* d =
-        create<Reference>(create<I32>(), ast::AddressSpace::kPrivate, ast::Access::kReadWrite);
-    auto* e = create<Reference>(create<I32>(), ast::AddressSpace::kStorage, ast::Access::kRead);
+    auto* a = create<Reference>(create<type::I32>(), ast::AddressSpace::kStorage,
+                                ast::Access::kReadWrite);
+    auto* b = create<Reference>(create<type::I32>(), ast::AddressSpace::kStorage,
+                                ast::Access::kReadWrite);
+    auto* c = create<Reference>(create<type::F32>(), ast::AddressSpace::kStorage,
+                                ast::Access::kReadWrite);
+    auto* d = create<Reference>(create<type::I32>(), ast::AddressSpace::kPrivate,
+                                ast::Access::kReadWrite);
+    auto* e =
+        create<Reference>(create<type::I32>(), ast::AddressSpace::kStorage, ast::Access::kRead);
 
     EXPECT_EQ(a->Hash(), b->Hash());
     EXPECT_NE(a->Hash(), c->Hash());
@@ -59,30 +61,32 @@
 }
 
 TEST_F(ReferenceTest, Equals) {
-    auto* a =
-        create<Reference>(create<I32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
-    auto* b =
-        create<Reference>(create<I32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
-    auto* c =
-        create<Reference>(create<F32>(), ast::AddressSpace::kStorage, ast::Access::kReadWrite);
-    auto* d =
-        create<Reference>(create<I32>(), ast::AddressSpace::kPrivate, ast::Access::kReadWrite);
-    auto* e = create<Reference>(create<I32>(), ast::AddressSpace::kStorage, ast::Access::kRead);
+    auto* a = create<Reference>(create<type::I32>(), ast::AddressSpace::kStorage,
+                                ast::Access::kReadWrite);
+    auto* b = create<Reference>(create<type::I32>(), ast::AddressSpace::kStorage,
+                                ast::Access::kReadWrite);
+    auto* c = create<Reference>(create<type::F32>(), ast::AddressSpace::kStorage,
+                                ast::Access::kReadWrite);
+    auto* d = create<Reference>(create<type::I32>(), ast::AddressSpace::kPrivate,
+                                ast::Access::kReadWrite);
+    auto* e =
+        create<Reference>(create<type::I32>(), ast::AddressSpace::kStorage, ast::Access::kRead);
 
     EXPECT_TRUE(a->Equals(*b));
     EXPECT_FALSE(a->Equals(*c));
     EXPECT_FALSE(a->Equals(*d));
     EXPECT_FALSE(a->Equals(*e));
-    EXPECT_FALSE(a->Equals(Void{}));
+    EXPECT_FALSE(a->Equals(type::Void{}));
 }
 
 TEST_F(ReferenceTest, FriendlyName) {
-    auto* r = create<Reference>(create<I32>(), ast::AddressSpace::kNone, ast::Access::kRead);
+    auto* r = create<Reference>(create<type::I32>(), ast::AddressSpace::kNone, ast::Access::kRead);
     EXPECT_EQ(r->FriendlyName(Symbols()), "ref<i32, read>");
 }
 
 TEST_F(ReferenceTest, FriendlyNameWithAddressSpace) {
-    auto* r = create<Reference>(create<I32>(), ast::AddressSpace::kWorkgroup, ast::Access::kRead);
+    auto* r =
+        create<Reference>(create<type::I32>(), ast::AddressSpace::kWorkgroup, ast::Access::kRead);
     EXPECT_EQ(r->FriendlyName(Symbols()), "ref<workgroup, i32, read>");
 }
 
diff --git a/src/tint/sem/struct_test.cc b/src/tint/sem/struct_test.cc
index 2d07f53..b2f16cf 100644
--- a/src/tint/sem/struct_test.cc
+++ b/src/tint/sem/struct_test.cc
@@ -55,7 +55,7 @@
 
     EXPECT_TRUE(a->Equals(*a));
     EXPECT_FALSE(a->Equals(*b));
-    EXPECT_FALSE(a->Equals(Void{}));
+    EXPECT_FALSE(a->Equals(type::Void{}));
 }
 
 TEST_F(StructTest, FriendlyName) {
diff --git a/src/tint/sem/vector_test.cc b/src/tint/sem/vector_test.cc
index e5c3201..a20f0d7 100644
--- a/src/tint/sem/vector_test.cc
+++ b/src/tint/sem/vector_test.cc
@@ -21,12 +21,12 @@
 using VectorTest = TestHelper;
 
 TEST_F(VectorTest, Creation) {
-    auto* a = create<Vector>(create<I32>(), 2u);
-    auto* b = create<Vector>(create<I32>(), 2u);
-    auto* c = create<Vector>(create<F32>(), 2u);
-    auto* d = create<Vector>(create<F32>(), 3u);
+    auto* a = create<Vector>(create<type::I32>(), 2u);
+    auto* b = create<Vector>(create<type::I32>(), 2u);
+    auto* c = create<Vector>(create<type::F32>(), 2u);
+    auto* d = create<Vector>(create<type::F32>(), 3u);
 
-    EXPECT_EQ(a->type(), create<I32>());
+    EXPECT_EQ(a->type(), create<type::I32>());
     EXPECT_EQ(a->Width(), 2u);
 
     EXPECT_EQ(a, b);
@@ -35,10 +35,10 @@
 }
 
 TEST_F(VectorTest, Hash) {
-    auto* a = create<Vector>(create<I32>(), 2u);
-    auto* b = create<Vector>(create<I32>(), 2u);
-    auto* c = create<Vector>(create<F32>(), 2u);
-    auto* d = create<Vector>(create<F32>(), 3u);
+    auto* a = create<Vector>(create<type::I32>(), 2u);
+    auto* b = create<Vector>(create<type::I32>(), 2u);
+    auto* c = create<Vector>(create<type::F32>(), 2u);
+    auto* d = create<Vector>(create<type::F32>(), 3u);
 
     EXPECT_EQ(a->Hash(), b->Hash());
     EXPECT_NE(a->Hash(), c->Hash());
@@ -46,19 +46,19 @@
 }
 
 TEST_F(VectorTest, Equals) {
-    auto* a = create<Vector>(create<I32>(), 2u);
-    auto* b = create<Vector>(create<I32>(), 2u);
-    auto* c = create<Vector>(create<F32>(), 2u);
-    auto* d = create<Vector>(create<F32>(), 3u);
+    auto* a = create<Vector>(create<type::I32>(), 2u);
+    auto* b = create<Vector>(create<type::I32>(), 2u);
+    auto* c = create<Vector>(create<type::F32>(), 2u);
+    auto* d = create<Vector>(create<type::F32>(), 3u);
 
     EXPECT_TRUE(a->Equals(*b));
     EXPECT_FALSE(a->Equals(*c));
     EXPECT_FALSE(a->Equals(*d));
-    EXPECT_FALSE(a->Equals(Void{}));
+    EXPECT_FALSE(a->Equals(type::Void{}));
 }
 
 TEST_F(VectorTest, FriendlyName) {
-    auto* f32 = create<F32>();
+    auto* f32 = create<type::F32>();
     auto* v = create<Vector>(f32, 3u);
     EXPECT_EQ(v->FriendlyName(Symbols()), "vec3<f32>");
 }
diff --git a/src/tint/tint.natvis b/src/tint/tint.natvis
index 4e957ff..4d2c3a3 100644
--- a/src/tint/tint.natvis
+++ b/src/tint/tint.natvis
@@ -244,11 +244,11 @@
 		<DisplayString>AbstractFloat</DisplayString>
 	</Type>
 
-	<Type Name="tint::sem::Bool">
+	<Type Name="tint::type::Bool">
 		<DisplayString>bool</DisplayString>
 	</Type>
 
-	<Type Name="tint::sem::F32">
+	<Type Name="tint::type::F32">
 		<DisplayString>f32</DisplayString>
 	</Type>
 
diff --git a/src/tint/transform/builtin_polyfill.cc b/src/tint/transform/builtin_polyfill.cc
index 757f858..3a3c070 100644
--- a/src/tint/transform/builtin_polyfill.cc
+++ b/src/tint/transform/builtin_polyfill.cc
@@ -473,7 +473,7 @@
         uint32_t width = WidthOf(ty);
 
         // Currently in WGSL parameters of insertBits must be i32, u32, vecN<i32> or vecN<u32>
-        if (!type::Type::DeepestElementOf(ty)->IsAnyOf<sem::I32, sem::U32>()) {
+        if (!type::Type::DeepestElementOf(ty)->IsAnyOf<type::I32, type::U32>()) {
             TINT_ICE(Transform, b.Diagnostics())
                 << "insertBits polyfill only support i32, u32, and vector of i32 or u32, got "
                 << b.FriendlyName(ty);
@@ -895,7 +895,7 @@
                         auto& sig = builtin->Signature();
                         auto* tex = sig.Parameter(sem::ParameterUsage::kTexture);
                         if (auto* stex = tex->Type()->As<type::SampledTexture>()) {
-                            if (stex->type()->Is<sem::F32>()) {
+                            if (stex->type()->Is<type::F32>()) {
                                 fn = builtin_polyfills.GetOrCreate(builtin, [&] {
                                     return s.textureSampleBaseClampToEdge_2d_f32();
                                 });
diff --git a/src/tint/transform/canonicalize_entry_point_io.cc b/src/tint/transform/canonicalize_entry_point_io.cc
index 8899ac7..48e2948 100644
--- a/src/tint/transform/canonicalize_entry_point_io.cc
+++ b/src/tint/transform/canonicalize_entry_point_io.cc
@@ -396,7 +396,7 @@
                 AddOutput(name, member->Type(), member->Location(), std::move(attributes),
                           ctx.dst->MemberAccessor(original_result, name));
             }
-        } else if (!inner_ret_type->Is<sem::Void>()) {
+        } else if (!inner_ret_type->Is<type::Void>()) {
             auto attributes =
                 CloneShaderIOAttributes(func_ast->return_type_attributes, do_interpolate);
 
@@ -421,7 +421,7 @@
 
         // No existing sample mask builtin was found, so create a new output value
         // using the fixed sample mask.
-        AddOutput("fixed_sample_mask", ctx.dst->create<sem::U32>(), std::nullopt,
+        AddOutput("fixed_sample_mask", ctx.dst->create<type::U32>(), std::nullopt,
                   {ctx.dst->Builtin(ast::BuiltinValue::kSampleMask)},
                   ctx.dst->Expr(u32(cfg.fixed_sample_mask)));
     }
@@ -429,7 +429,7 @@
     /// Add a point size builtin to the wrapper function output.
     void AddVertexPointSize() {
         // Create a new output value and assign it a literal 1.0 value.
-        AddOutput("vertex_point_size", ctx.dst->create<sem::F32>(), std::nullopt,
+        AddOutput("vertex_point_size", ctx.dst->create<type::F32>(), std::nullopt,
                   {ctx.dst->Builtin(ast::BuiltinValue::kPointSize)}, ctx.dst->Expr(1_f));
     }
 
@@ -576,7 +576,7 @@
         }
 
         // Exit early if there is no shader IO to handle.
-        if (func_sem->Parameters().Length() == 0 && func_sem->ReturnType()->Is<sem::Void>() &&
+        if (func_sem->Parameters().Length() == 0 && func_sem->ReturnType()->Is<type::Void>() &&
             !needs_fixed_sample_mask && !needs_vertex_point_size &&
             cfg.shader_style != ShaderStyle::kGlsl) {
             return;
@@ -604,7 +604,7 @@
 
         // Process the return type, and start building the wrapper function body.
         std::function<const ast::Type*()> wrapper_ret_type = [&] { return ctx.dst->ty.void_(); };
-        if (func_sem->ReturnType()->Is<sem::Void>()) {
+        if (func_sem->ReturnType()->Is<type::Void>()) {
             // The function call is just a statement with no result.
             wrapper_body.Push(ctx.dst->CallStmt(call_inner));
         } else {
@@ -760,7 +760,7 @@
             case ast::BuiltinValue::kInstanceIndex:
             case ast::BuiltinValue::kSampleIndex:
             case ast::BuiltinValue::kSampleMask:
-                type = ctx.dst->create<sem::I32>();
+                type = ctx.dst->create<type::I32>();
                 value = ctx.dst->Bitcast(CreateASTTypeFor(ctx, type), value);
                 break;
             default:
diff --git a/src/tint/transform/decompose_memory_access.cc b/src/tint/transform/decompose_memory_access.cc
index 7875a4e..70cf830 100644
--- a/src/tint/transform/decompose_memory_access.cc
+++ b/src/tint/transform/decompose_memory_access.cc
@@ -76,7 +76,7 @@
     const ast::Expression* Build(CloneContext& ctx) const override {
         auto* type = ctx.src->Sem().Get(expr)->Type()->UnwrapRef();
         auto* res = ctx.Clone(expr);
-        if (!type->Is<sem::U32>()) {
+        if (!type->Is<type::U32>()) {
             res = ctx.dst->Construct<u32>(res);
         }
         return res;
@@ -141,74 +141,74 @@
 };
 
 bool IntrinsicDataTypeFor(const type::Type* ty, DecomposeMemoryAccess::Intrinsic::DataType& out) {
-    if (ty->Is<sem::I32>()) {
+    if (ty->Is<type::I32>()) {
         out = DecomposeMemoryAccess::Intrinsic::DataType::kI32;
         return true;
     }
-    if (ty->Is<sem::U32>()) {
+    if (ty->Is<type::U32>()) {
         out = DecomposeMemoryAccess::Intrinsic::DataType::kU32;
         return true;
     }
-    if (ty->Is<sem::F32>()) {
+    if (ty->Is<type::F32>()) {
         out = DecomposeMemoryAccess::Intrinsic::DataType::kF32;
         return true;
     }
-    if (ty->Is<sem::F16>()) {
+    if (ty->Is<type::F16>()) {
         out = DecomposeMemoryAccess::Intrinsic::DataType::kF16;
         return true;
     }
     if (auto* vec = ty->As<sem::Vector>()) {
         switch (vec->Width()) {
             case 2:
-                if (vec->type()->Is<sem::I32>()) {
+                if (vec->type()->Is<type::I32>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec2I32;
                     return true;
                 }
-                if (vec->type()->Is<sem::U32>()) {
+                if (vec->type()->Is<type::U32>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec2U32;
                     return true;
                 }
-                if (vec->type()->Is<sem::F32>()) {
+                if (vec->type()->Is<type::F32>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec2F32;
                     return true;
                 }
-                if (vec->type()->Is<sem::F16>()) {
+                if (vec->type()->Is<type::F16>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec2F16;
                     return true;
                 }
                 break;
             case 3:
-                if (vec->type()->Is<sem::I32>()) {
+                if (vec->type()->Is<type::I32>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec3I32;
                     return true;
                 }
-                if (vec->type()->Is<sem::U32>()) {
+                if (vec->type()->Is<type::U32>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec3U32;
                     return true;
                 }
-                if (vec->type()->Is<sem::F32>()) {
+                if (vec->type()->Is<type::F32>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec3F32;
                     return true;
                 }
-                if (vec->type()->Is<sem::F16>()) {
+                if (vec->type()->Is<type::F16>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec3F16;
                     return true;
                 }
                 break;
             case 4:
-                if (vec->type()->Is<sem::I32>()) {
+                if (vec->type()->Is<type::I32>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec4I32;
                     return true;
                 }
-                if (vec->type()->Is<sem::U32>()) {
+                if (vec->type()->Is<type::U32>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec4U32;
                     return true;
                 }
-                if (vec->type()->Is<sem::F32>()) {
+                if (vec->type()->Is<type::F32>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec4F32;
                     return true;
                 }
-                if (vec->type()->Is<sem::F16>()) {
+                if (vec->type()->Is<type::F16>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec4F16;
                     return true;
                 }
diff --git a/src/tint/transform/direct_variable_access.cc b/src/tint/transform/direct_variable_access.cc
index f187ac8..78169d8 100644
--- a/src/tint/transform/direct_variable_access.cc
+++ b/src/tint/transform/direct_variable_access.cc
@@ -573,7 +573,7 @@
             if (!idx->UnwrapMaterialize()
                      ->Type()
                      ->UnwrapRef()
-                     ->IsAnyOf<sem::U32, type::AbstractInt>()) {
+                     ->IsAnyOf<type::U32, type::AbstractInt>()) {
                 expr = b.Construct(b.ty.u32(), expr);
             }
         }
diff --git a/src/tint/transform/spirv_atomic.cc b/src/tint/transform/spirv_atomic.cc
index 57fc420..8bf1836 100644
--- a/src/tint/transform/spirv_atomic.cc
+++ b/src/tint/transform/spirv_atomic.cc
@@ -201,8 +201,8 @@
     const ast::Type* AtomicTypeFor(const type::Type* ty) {
         return Switch(
             ty,  //
-            [&](const sem::I32*) { return b.ty.atomic(CreateASTTypeFor(ctx, ty)); },
-            [&](const sem::U32*) { return b.ty.atomic(CreateASTTypeFor(ctx, ty)); },
+            [&](const type::I32*) { return b.ty.atomic(CreateASTTypeFor(ctx, ty)); },
+            [&](const type::U32*) { return b.ty.atomic(CreateASTTypeFor(ctx, ty)); },
             [&](const sem::Struct* str) { return b.ty.type_name(Fork(str->Declaration()).name); },
             [&](const sem::Array* arr) -> const ast::Type* {
                 if (arr->Count()->Is<type::RuntimeArrayCount>()) {
diff --git a/src/tint/transform/std140.cc b/src/tint/transform/std140.cc
index e1cc7c5..dab3eb1 100644
--- a/src/tint/transform/std140.cc
+++ b/src/tint/transform/std140.cc
@@ -645,8 +645,8 @@
                 return "mat" + std::to_string(mat->columns()) + "x" + std::to_string(mat->rows()) +
                        "_" + ConvertSuffix(mat->type());
             },
-            [&](const sem::F32*) { return "f32"; },  //
-            [&](const sem::F16*) { return "f16"; },
+            [&](const type::F32*) { return "f32"; },  //
+            [&](const type::F16*) { return "f16"; },
             [&](Default) {
                 TINT_ICE(Transform, b.Diagnostics())
                     << "unhandled type for conversion name: " << src->FriendlyName(ty);
diff --git a/src/tint/transform/substitute_override.cc b/src/tint/transform/substitute_override.cc
index 7c2d0a2..9031f44 100644
--- a/src/tint/transform/substitute_override.cc
+++ b/src/tint/transform/substitute_override.cc
@@ -81,11 +81,11 @@
         auto value = iter->second;
         auto* ctor = Switch(
             sem->Type(),
-            [&](const sem::Bool*) { return b.Expr(!std::equal_to<double>()(value, 0.0)); },
-            [&](const sem::I32*) { return b.Expr(i32(value)); },
-            [&](const sem::U32*) { return b.Expr(u32(value)); },
-            [&](const sem::F32*) { return b.Expr(f32(value)); },
-            [&](const sem::F16*) { return b.Expr(f16(value)); });
+            [&](const type::Bool*) { return b.Expr(!std::equal_to<double>()(value, 0.0)); },
+            [&](const type::I32*) { return b.Expr(i32(value)); },
+            [&](const type::U32*) { return b.Expr(u32(value)); },
+            [&](const type::F32*) { return b.Expr(f32(value)); },
+            [&](const type::F16*) { return b.Expr(f16(value)); });
 
         if (!ctor) {
             b.Diagnostics().add_error(diag::System::Transform,
diff --git a/src/tint/transform/transform.cc b/src/tint/transform/transform.cc
index e2a537a..85448f7 100644
--- a/src/tint/transform/transform.cc
+++ b/src/tint/transform/transform.cc
@@ -74,22 +74,22 @@
 }
 
 const ast::Type* Transform::CreateASTTypeFor(CloneContext& ctx, const type::Type* ty) {
-    if (ty->Is<sem::Void>()) {
+    if (ty->Is<type::Void>()) {
         return ctx.dst->create<ast::Void>();
     }
-    if (ty->Is<sem::I32>()) {
+    if (ty->Is<type::I32>()) {
         return ctx.dst->create<ast::I32>();
     }
-    if (ty->Is<sem::U32>()) {
+    if (ty->Is<type::U32>()) {
         return ctx.dst->create<ast::U32>();
     }
-    if (ty->Is<sem::F16>()) {
+    if (ty->Is<type::F16>()) {
         return ctx.dst->create<ast::F16>();
     }
-    if (ty->Is<sem::F32>()) {
+    if (ty->Is<type::F32>()) {
         return ctx.dst->create<ast::F32>();
     }
-    if (ty->Is<sem::Bool>()) {
+    if (ty->Is<type::Bool>()) {
         return ctx.dst->create<ast::Bool>();
     }
     if (auto* m = ty->As<sem::Matrix>()) {
diff --git a/src/tint/transform/transform_test.cc b/src/tint/transform/transform_test.cc
index cb26b9f..70e0c3a 100644
--- a/src/tint/transform/transform_test.cc
+++ b/src/tint/transform/transform_test.cc
@@ -41,16 +41,16 @@
 };
 
 TEST_F(CreateASTTypeForTest, Basic) {
-    EXPECT_TRUE(create([](ProgramBuilder& b) { return b.create<sem::I32>(); })->Is<ast::I32>());
-    EXPECT_TRUE(create([](ProgramBuilder& b) { return b.create<sem::U32>(); })->Is<ast::U32>());
-    EXPECT_TRUE(create([](ProgramBuilder& b) { return b.create<sem::F32>(); })->Is<ast::F32>());
-    EXPECT_TRUE(create([](ProgramBuilder& b) { return b.create<sem::Bool>(); })->Is<ast::Bool>());
-    EXPECT_TRUE(create([](ProgramBuilder& b) { return b.create<sem::Void>(); })->Is<ast::Void>());
+    EXPECT_TRUE(create([](ProgramBuilder& b) { return b.create<type::I32>(); })->Is<ast::I32>());
+    EXPECT_TRUE(create([](ProgramBuilder& b) { return b.create<type::U32>(); })->Is<ast::U32>());
+    EXPECT_TRUE(create([](ProgramBuilder& b) { return b.create<type::F32>(); })->Is<ast::F32>());
+    EXPECT_TRUE(create([](ProgramBuilder& b) { return b.create<type::Bool>(); })->Is<ast::Bool>());
+    EXPECT_TRUE(create([](ProgramBuilder& b) { return b.create<type::Void>(); })->Is<ast::Void>());
 }
 
 TEST_F(CreateASTTypeForTest, Matrix) {
     auto* mat = create([](ProgramBuilder& b) {
-        auto* column_type = b.create<sem::Vector>(b.create<sem::F32>(), 2u);
+        auto* column_type = b.create<sem::Vector>(b.create<type::F32>(), 2u);
         return b.create<sem::Matrix>(column_type, 3u);
     });
     ASSERT_TRUE(mat->Is<ast::Matrix>());
@@ -61,7 +61,7 @@
 
 TEST_F(CreateASTTypeForTest, Vector) {
     auto* vec =
-        create([](ProgramBuilder& b) { return b.create<sem::Vector>(b.create<sem::F32>(), 2u); });
+        create([](ProgramBuilder& b) { return b.create<sem::Vector>(b.create<type::F32>(), 2u); });
     ASSERT_TRUE(vec->Is<ast::Vector>());
     ASSERT_TRUE(vec->As<ast::Vector>()->type->Is<ast::F32>());
     ASSERT_EQ(vec->As<ast::Vector>()->width, 2u);
@@ -69,7 +69,7 @@
 
 TEST_F(CreateASTTypeForTest, ArrayImplicitStride) {
     auto* arr = create([](ProgramBuilder& b) {
-        return b.create<sem::Array>(b.create<sem::F32>(), b.create<type::ConstantArrayCount>(2u),
+        return b.create<sem::Array>(b.create<type::F32>(), b.create<type::ConstantArrayCount>(2u),
                                     4u, 4u, 32u, 32u);
     });
     ASSERT_TRUE(arr->Is<ast::Array>());
@@ -83,7 +83,7 @@
 
 TEST_F(CreateASTTypeForTest, ArrayNonImplicitStride) {
     auto* arr = create([](ProgramBuilder& b) {
-        return b.create<sem::Array>(b.create<sem::F32>(), b.create<type::ConstantArrayCount>(2u),
+        return b.create<sem::Array>(b.create<type::F32>(), b.create<type::ConstantArrayCount>(2u),
                                     4u, 4u, 64u, 32u);
     });
     ASSERT_TRUE(arr->Is<ast::Array>());
diff --git a/src/tint/transform/vertex_pulling.cc b/src/tint/transform/vertex_pulling.cc
index a9b4421..d014c61 100644
--- a/src/tint/transform/vertex_pulling.cc
+++ b/src/tint/transform/vertex_pulling.cc
@@ -153,16 +153,16 @@
 AttributeWGSLType WGSLTypeOf(const type::Type* ty) {
     return Switch(
         ty,
-        [](const sem::I32*) -> AttributeWGSLType {
+        [](const type::I32*) -> AttributeWGSLType {
             return {BaseWGSLType::kI32, 1};
         },
-        [](const sem::U32*) -> AttributeWGSLType {
+        [](const type::U32*) -> AttributeWGSLType {
             return {BaseWGSLType::kU32, 1};
         },
-        [](const sem::F32*) -> AttributeWGSLType {
+        [](const type::F32*) -> AttributeWGSLType {
             return {BaseWGSLType::kF32, 1};
         },
-        [](const sem::F16*) -> AttributeWGSLType {
+        [](const type::F16*) -> AttributeWGSLType {
             return {BaseWGSLType::kF16, 1};
         },
         [](const sem::Vector* vec) -> AttributeWGSLType {
diff --git a/src/tint/transform/zero_init_workgroup_memory.cc b/src/tint/transform/zero_init_workgroup_memory.cc
index e6a3359..0ae63d6 100644
--- a/src/tint/transform/zero_init_workgroup_memory.cc
+++ b/src/tint/transform/zero_init_workgroup_memory.cc
@@ -411,7 +411,7 @@
             // Constant value could not be found. Build expression instead.
             workgroup_size_expr = [this, expr, size = workgroup_size_expr] {
                 auto* e = ctx.Clone(expr);
-                if (ctx.src->TypeOf(expr)->UnwrapRef()->Is<sem::I32>()) {
+                if (ctx.src->TypeOf(expr)->UnwrapRef()->Is<type::I32>()) {
                     e = b.Construct<u32>(e);
                 }
                 return size ? b.Mul(size(), e) : e;
diff --git a/src/tint/sem/bool.cc b/src/tint/type/bool.cc
similarity index 87%
rename from src/tint/sem/bool.cc
rename to src/tint/type/bool.cc
index 4c38335..4c3ab15 100644
--- a/src/tint/sem/bool.cc
+++ b/src/tint/type/bool.cc
@@ -1,4 +1,4 @@
-// Copyright 2020 The Tint Authors.
+// Copyright 2022 The Tint Authors.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,13 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/sem/bool.h"
+#include "src/tint/type/bool.h"
 
 #include "src/tint/program_builder.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::sem::Bool);
+TINT_INSTANTIATE_TYPEINFO(tint::type::Bool);
 
-namespace tint::sem {
+namespace tint::type {
 
 Bool::Bool()
     : Base(type::TypeFlags{
@@ -51,4 +51,4 @@
     return 4;
 }
 
-}  // namespace tint::sem
+}  // namespace tint::type
diff --git a/src/tint/sem/bool.h b/src/tint/type/bool.h
similarity index 90%
rename from src/tint/sem/bool.h
rename to src/tint/type/bool.h
index f70f6f6..900630d 100644
--- a/src/tint/sem/bool.h
+++ b/src/tint/type/bool.h
@@ -1,4 +1,4 @@
-// Copyright 2020 The Tint Authors.
+// Copyright 2022 The Tint Authors.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_SEM_BOOL_H_
-#define SRC_TINT_SEM_BOOL_H_
+#ifndef SRC_TINT_TYPE_BOOL_H_
+#define SRC_TINT_TYPE_BOOL_H_
 
 #include <string>
 
@@ -25,7 +25,7 @@
 #undef Bool
 #endif
 
-namespace tint::sem {
+namespace tint::type {
 
 /// A boolean type
 class Bool final : public Castable<Bool, type::Type> {
@@ -59,6 +59,6 @@
     uint32_t Align() const override;
 };
 
-}  // namespace tint::sem
+}  // namespace tint::type
 
-#endif  // SRC_TINT_SEM_BOOL_H_
+#endif  // SRC_TINT_TYPE_BOOL_H_
diff --git a/src/tint/sem/bool_test.cc b/src/tint/type/bool_test.cc
similarity index 89%
rename from src/tint/sem/bool_test.cc
rename to src/tint/type/bool_test.cc
index 00c862e..24b3014 100644
--- a/src/tint/sem/bool_test.cc
+++ b/src/tint/type/bool_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2020 The Tint Authors.
+// Copyright 2022 The Tint Authors.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/sem/test_helper.h"
+#include "src/tint/type/test_helper.h"
 #include "src/tint/type/texture.h"
 
-namespace tint::sem {
+namespace tint::type {
 namespace {
 
 using BoolTest = TestHelper;
@@ -45,4 +45,4 @@
 }
 
 }  // namespace
-}  // namespace tint::sem
+}  // namespace tint::type
diff --git a/src/tint/type/depth_multisampled_texture_test.cc b/src/tint/type/depth_multisampled_texture_test.cc
index 77f356f..d0257b9 100644
--- a/src/tint/type/depth_multisampled_texture_test.cc
+++ b/src/tint/type/depth_multisampled_texture_test.cc
@@ -44,7 +44,7 @@
 
     EXPECT_TRUE(a->Equals(*a));
     EXPECT_TRUE(a->Equals(*b));
-    EXPECT_FALSE(a->Equals(sem::Void{}));
+    EXPECT_FALSE(a->Equals(type::Void{}));
 }
 
 TEST_F(DepthMultisampledTextureTest, Dim) {
diff --git a/src/tint/type/depth_texture_test.cc b/src/tint/type/depth_texture_test.cc
index f817af8..e885fa6 100644
--- a/src/tint/type/depth_texture_test.cc
+++ b/src/tint/type/depth_texture_test.cc
@@ -49,7 +49,7 @@
 
     EXPECT_TRUE(a->Equals(*b));
     EXPECT_FALSE(a->Equals(*c));
-    EXPECT_FALSE(a->Equals(sem::Void{}));
+    EXPECT_FALSE(a->Equals(type::Void{}));
 }
 
 TEST_F(DepthTextureTest, IsTexture) {
diff --git a/src/tint/type/external_texture_test.cc b/src/tint/type/external_texture_test.cc
index 678b013..bbafebc 100644
--- a/src/tint/type/external_texture_test.cc
+++ b/src/tint/type/external_texture_test.cc
@@ -41,11 +41,11 @@
     auto* a = create<ExternalTexture>();
     auto* b = create<ExternalTexture>();
     EXPECT_TRUE(a->Equals(*b));
-    EXPECT_FALSE(a->Equals(sem::Void{}));
+    EXPECT_FALSE(a->Equals(type::Void{}));
 }
 
 TEST_F(ExternalTextureTest, IsTexture) {
-    sem::F32 f32;
+    type::F32 f32;
     ExternalTexture s;
     Texture* ty = &s;
     EXPECT_FALSE(ty->Is<DepthTexture>());
@@ -56,7 +56,7 @@
 }
 
 TEST_F(ExternalTextureTest, Dim) {
-    sem::F32 f32;
+    type::F32 f32;
     ExternalTexture s;
     EXPECT_EQ(s.dim(), ast::TextureDimension::k2d);
 }
diff --git a/src/tint/sem/f16.cc b/src/tint/type/f16.cc
similarity index 88%
rename from src/tint/sem/f16.cc
rename to src/tint/type/f16.cc
index f8ab347..5cb3cfd 100644
--- a/src/tint/sem/f16.cc
+++ b/src/tint/type/f16.cc
@@ -12,14 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/sem/f16.h"
+#include "src/tint/type/f16.h"
 
 #include "src/tint/program_builder.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::sem::F16);
+TINT_INSTANTIATE_TYPEINFO(tint::type::F16);
 
-namespace tint {
-namespace sem {
+namespace tint::type {
 
 F16::F16()
     : Base(type::TypeFlags{
@@ -52,5 +51,4 @@
     return 2;
 }
 
-}  // namespace sem
-}  // namespace tint
+}  // namespace tint::type
diff --git a/src/tint/sem/f16.h b/src/tint/type/f16.h
similarity index 91%
rename from src/tint/sem/f16.h
rename to src/tint/type/f16.h
index e196155..a10597b 100644
--- a/src/tint/sem/f16.h
+++ b/src/tint/type/f16.h
@@ -12,14 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_SEM_F16_H_
-#define SRC_TINT_SEM_F16_H_
+#ifndef SRC_TINT_TYPE_F16_H_
+#define SRC_TINT_TYPE_F16_H_
 
 #include <string>
 
 #include "src/tint/type/type.h"
 
-namespace tint::sem {
+namespace tint::type {
 
 /// A float 16 type
 class F16 final : public Castable<F16, type::Type> {
@@ -49,6 +49,6 @@
     uint32_t Align() const override;
 };
 
-}  // namespace tint::sem
+}  // namespace tint::type
 
-#endif  // SRC_TINT_SEM_F16_H_
+#endif  // SRC_TINT_TYPE_F16_H_
diff --git a/src/tint/sem/f16_test.cc b/src/tint/type/f16_test.cc
similarity index 92%
rename from src/tint/sem/f16_test.cc
rename to src/tint/type/f16_test.cc
index 6c774f8..4bd0529 100644
--- a/src/tint/sem/f16_test.cc
+++ b/src/tint/type/f16_test.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/sem/test_helper.h"
+#include "src/tint/type/test_helper.h"
 #include "src/tint/type/texture.h"
 
-namespace tint::sem {
+namespace tint::type {
 namespace {
 
 using F16Test = TestHelper;
@@ -45,4 +45,4 @@
 }
 
 }  // namespace
-}  // namespace tint::sem
+}  // namespace tint::type
diff --git a/src/tint/sem/f32.cc b/src/tint/type/f32.cc
similarity index 87%
rename from src/tint/sem/f32.cc
rename to src/tint/type/f32.cc
index 86c0d05..92bc4d4 100644
--- a/src/tint/sem/f32.cc
+++ b/src/tint/type/f32.cc
@@ -1,4 +1,4 @@
-// Copyright 2020 The Tint Authors.
+// Copyright 2022 The Tint Authors.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,13 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/sem/f32.h"
+#include "src/tint/type/f32.h"
 
 #include "src/tint/program_builder.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::sem::F32);
+TINT_INSTANTIATE_TYPEINFO(tint::type::F32);
 
-namespace tint::sem {
+namespace tint::type {
 
 F32::F32()
     : Base(type::TypeFlags{
@@ -51,4 +51,4 @@
     return 4;
 }
 
-}  // namespace tint::sem
+}  // namespace tint::type
diff --git a/src/tint/sem/f32.h b/src/tint/type/f32.h
similarity index 88%
rename from src/tint/sem/f32.h
rename to src/tint/type/f32.h
index 67979bc..0991c3d 100644
--- a/src/tint/sem/f32.h
+++ b/src/tint/type/f32.h
@@ -1,4 +1,4 @@
-// Copyright 2020 The Tint Authors.
+// Copyright 2022 The Tint Authors.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,14 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_SEM_F32_H_
-#define SRC_TINT_SEM_F32_H_
+#ifndef SRC_TINT_TYPE_F32_H_
+#define SRC_TINT_TYPE_F32_H_
 
 #include <string>
 
 #include "src/tint/type/type.h"
 
-namespace tint::sem {
+namespace tint::type {
 
 /// A float 32 type
 class F32 final : public Castable<F32, type::Type> {
@@ -49,6 +49,6 @@
     uint32_t Align() const override;
 };
 
-}  // namespace tint::sem
+}  // namespace tint::type
 
-#endif  // SRC_TINT_SEM_F32_H_
+#endif  // SRC_TINT_TYPE_F32_H_
diff --git a/src/tint/sem/f32_test.cc b/src/tint/type/f32_test.cc
similarity index 89%
rename from src/tint/sem/f32_test.cc
rename to src/tint/type/f32_test.cc
index 1d5a7d1..127a34b 100644
--- a/src/tint/sem/f32_test.cc
+++ b/src/tint/type/f32_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2020 The Tint Authors.
+// Copyright 2022 The Tint Authors.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/sem/test_helper.h"
+#include "src/tint/type/test_helper.h"
 #include "src/tint/type/texture.h"
 
-namespace tint::sem {
+namespace tint::type {
 namespace {
 
 using F32Test = TestHelper;
@@ -45,4 +45,4 @@
 }
 
 }  // namespace
-}  // namespace tint::sem
+}  // namespace tint::type
diff --git a/src/tint/sem/i32.cc b/src/tint/type/i32.cc
similarity index 87%
rename from src/tint/sem/i32.cc
rename to src/tint/type/i32.cc
index 0f4ccae..f657e24 100644
--- a/src/tint/sem/i32.cc
+++ b/src/tint/type/i32.cc
@@ -1,4 +1,4 @@
-// Copyright 2020 The Tint Authors.
+// Copyright 2022 The Tint Authors.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,13 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/sem/i32.h"
+#include "src/tint/type/i32.h"
 
 #include "src/tint/program_builder.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::sem::I32);
+TINT_INSTANTIATE_TYPEINFO(tint::type::I32);
 
-namespace tint::sem {
+namespace tint::type {
 
 I32::I32()
     : Base(type::TypeFlags{
@@ -51,4 +51,4 @@
     return 4;
 }
 
-}  // namespace tint::sem
+}  // namespace tint::type
diff --git a/src/tint/sem/i32.h b/src/tint/type/i32.h
similarity index 88%
rename from src/tint/sem/i32.h
rename to src/tint/type/i32.h
index 9893f2f..3057cda 100644
--- a/src/tint/sem/i32.h
+++ b/src/tint/type/i32.h
@@ -1,4 +1,4 @@
-// Copyright 2020 The Tint Authors.
+// Copyright 2022 The Tint Authors.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,14 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_SEM_I32_H_
-#define SRC_TINT_SEM_I32_H_
+#ifndef SRC_TINT_TYPE_I32_H_
+#define SRC_TINT_TYPE_I32_H_
 
 #include <string>
 
 #include "src/tint/type/type.h"
 
-namespace tint::sem {
+namespace tint::type {
 
 /// A signed int 32 type.
 class I32 final : public Castable<I32, type::Type> {
@@ -49,6 +49,6 @@
     uint32_t Align() const override;
 };
 
-}  // namespace tint::sem
+}  // namespace tint::type
 
-#endif  // SRC_TINT_SEM_I32_H_
+#endif  // SRC_TINT_TYPE_I32_H_
diff --git a/src/tint/sem/i32_test.cc b/src/tint/type/i32_test.cc
similarity index 89%
rename from src/tint/sem/i32_test.cc
rename to src/tint/type/i32_test.cc
index 6322517..7b45a03e 100644
--- a/src/tint/sem/i32_test.cc
+++ b/src/tint/type/i32_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2020 The Tint Authors.
+// Copyright 2022 The Tint Authors.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/sem/test_helper.h"
+#include "src/tint/type/test_helper.h"
 #include "src/tint/type/texture.h"
 
-namespace tint::sem {
+namespace tint::type {
 namespace {
 
 using I32Test = TestHelper;
@@ -45,4 +45,4 @@
 }
 
 }  // namespace
-}  // namespace tint::sem
+}  // namespace tint::type
diff --git a/src/tint/type/multisampled_texture_test.cc b/src/tint/type/multisampled_texture_test.cc
index 6753136..72cf496 100644
--- a/src/tint/type/multisampled_texture_test.cc
+++ b/src/tint/type/multisampled_texture_test.cc
@@ -26,38 +26,38 @@
 using MultisampledTextureTest = TestHelper;
 
 TEST_F(MultisampledTextureTest, Creation) {
-    auto* a = create<MultisampledTexture>(ast::TextureDimension::k2d, create<sem::F32>());
-    auto* b = create<MultisampledTexture>(ast::TextureDimension::k2d, create<sem::F32>());
-    auto* c = create<MultisampledTexture>(ast::TextureDimension::k3d, create<sem::F32>());
-    auto* d = create<MultisampledTexture>(ast::TextureDimension::k2d, create<sem::I32>());
+    auto* a = create<MultisampledTexture>(ast::TextureDimension::k2d, create<type::F32>());
+    auto* b = create<MultisampledTexture>(ast::TextureDimension::k2d, create<type::F32>());
+    auto* c = create<MultisampledTexture>(ast::TextureDimension::k3d, create<type::F32>());
+    auto* d = create<MultisampledTexture>(ast::TextureDimension::k2d, create<type::I32>());
     EXPECT_EQ(a, b);
     EXPECT_NE(a, c);
     EXPECT_NE(a, d);
 }
 
 TEST_F(MultisampledTextureTest, Hash) {
-    auto* a = create<MultisampledTexture>(ast::TextureDimension::k2d, create<sem::F32>());
-    auto* b = create<MultisampledTexture>(ast::TextureDimension::k2d, create<sem::F32>());
-    auto* c = create<MultisampledTexture>(ast::TextureDimension::k3d, create<sem::F32>());
-    auto* d = create<MultisampledTexture>(ast::TextureDimension::k2d, create<sem::I32>());
+    auto* a = create<MultisampledTexture>(ast::TextureDimension::k2d, create<type::F32>());
+    auto* b = create<MultisampledTexture>(ast::TextureDimension::k2d, create<type::F32>());
+    auto* c = create<MultisampledTexture>(ast::TextureDimension::k3d, create<type::F32>());
+    auto* d = create<MultisampledTexture>(ast::TextureDimension::k2d, create<type::I32>());
     EXPECT_EQ(a->Hash(), b->Hash());
     EXPECT_NE(a->Hash(), c->Hash());
     EXPECT_NE(a->Hash(), d->Hash());
 }
 
 TEST_F(MultisampledTextureTest, Equals) {
-    auto* a = create<MultisampledTexture>(ast::TextureDimension::k2d, create<sem::F32>());
-    auto* b = create<MultisampledTexture>(ast::TextureDimension::k2d, create<sem::F32>());
-    auto* c = create<MultisampledTexture>(ast::TextureDimension::k3d, create<sem::F32>());
-    auto* d = create<MultisampledTexture>(ast::TextureDimension::k2d, create<sem::I32>());
+    auto* a = create<MultisampledTexture>(ast::TextureDimension::k2d, create<type::F32>());
+    auto* b = create<MultisampledTexture>(ast::TextureDimension::k2d, create<type::F32>());
+    auto* c = create<MultisampledTexture>(ast::TextureDimension::k3d, create<type::F32>());
+    auto* d = create<MultisampledTexture>(ast::TextureDimension::k2d, create<type::I32>());
     EXPECT_TRUE(a->Equals(*b));
     EXPECT_FALSE(a->Equals(*c));
     EXPECT_FALSE(a->Equals(*d));
-    EXPECT_FALSE(a->Equals(sem::Void{}));
+    EXPECT_FALSE(a->Equals(type::Void{}));
 }
 
 TEST_F(MultisampledTextureTest, IsTexture) {
-    sem::F32 f32;
+    type::F32 f32;
     MultisampledTexture s(ast::TextureDimension::kCube, &f32);
     Texture* ty = &s;
     EXPECT_FALSE(ty->Is<DepthTexture>());
@@ -68,19 +68,19 @@
 }
 
 TEST_F(MultisampledTextureTest, Dim) {
-    sem::F32 f32;
+    type::F32 f32;
     MultisampledTexture s(ast::TextureDimension::k3d, &f32);
     EXPECT_EQ(s.dim(), ast::TextureDimension::k3d);
 }
 
 TEST_F(MultisampledTextureTest, Type) {
-    sem::F32 f32;
+    type::F32 f32;
     MultisampledTexture s(ast::TextureDimension::k3d, &f32);
     EXPECT_EQ(s.type(), &f32);
 }
 
 TEST_F(MultisampledTextureTest, FriendlyName) {
-    sem::F32 f32;
+    type::F32 f32;
     MultisampledTexture s(ast::TextureDimension::k3d, &f32);
     EXPECT_EQ(s.FriendlyName(Symbols()), "texture_multisampled_3d<f32>");
 }
diff --git a/src/tint/type/sampled_texture_test.cc b/src/tint/type/sampled_texture_test.cc
index e45fb7c..4f327ea 100644
--- a/src/tint/type/sampled_texture_test.cc
+++ b/src/tint/type/sampled_texture_test.cc
@@ -25,12 +25,12 @@
 using SampledTextureTest = TestHelper;
 
 TEST_F(SampledTextureTest, Creation) {
-    auto* a = create<SampledTexture>(ast::TextureDimension::kCube, create<sem::F32>());
-    auto* b = create<SampledTexture>(ast::TextureDimension::kCube, create<sem::F32>());
-    auto* c = create<SampledTexture>(ast::TextureDimension::k2d, create<sem::F32>());
-    auto* d = create<SampledTexture>(ast::TextureDimension::kCube, create<sem::I32>());
+    auto* a = create<SampledTexture>(ast::TextureDimension::kCube, create<type::F32>());
+    auto* b = create<SampledTexture>(ast::TextureDimension::kCube, create<type::F32>());
+    auto* c = create<SampledTexture>(ast::TextureDimension::k2d, create<type::F32>());
+    auto* d = create<SampledTexture>(ast::TextureDimension::kCube, create<type::I32>());
 
-    EXPECT_TRUE(a->type()->Is<sem::F32>());
+    EXPECT_TRUE(a->type()->Is<type::F32>());
     EXPECT_EQ(a->dim(), ast::TextureDimension::kCube);
 
     EXPECT_EQ(a, b);
@@ -39,10 +39,10 @@
 }
 
 TEST_F(SampledTextureTest, Hash) {
-    auto* a = create<SampledTexture>(ast::TextureDimension::kCube, create<sem::F32>());
-    auto* b = create<SampledTexture>(ast::TextureDimension::kCube, create<sem::F32>());
-    auto* c = create<SampledTexture>(ast::TextureDimension::k2d, create<sem::F32>());
-    auto* d = create<SampledTexture>(ast::TextureDimension::kCube, create<sem::I32>());
+    auto* a = create<SampledTexture>(ast::TextureDimension::kCube, create<type::F32>());
+    auto* b = create<SampledTexture>(ast::TextureDimension::kCube, create<type::F32>());
+    auto* c = create<SampledTexture>(ast::TextureDimension::k2d, create<type::F32>());
+    auto* d = create<SampledTexture>(ast::TextureDimension::kCube, create<type::I32>());
 
     EXPECT_EQ(a->Hash(), b->Hash());
     EXPECT_NE(a->Hash(), c->Hash());
@@ -50,19 +50,19 @@
 }
 
 TEST_F(SampledTextureTest, Equals) {
-    auto* a = create<SampledTexture>(ast::TextureDimension::kCube, create<sem::F32>());
-    auto* b = create<SampledTexture>(ast::TextureDimension::kCube, create<sem::F32>());
-    auto* c = create<SampledTexture>(ast::TextureDimension::k2d, create<sem::F32>());
-    auto* d = create<SampledTexture>(ast::TextureDimension::kCube, create<sem::I32>());
+    auto* a = create<SampledTexture>(ast::TextureDimension::kCube, create<type::F32>());
+    auto* b = create<SampledTexture>(ast::TextureDimension::kCube, create<type::F32>());
+    auto* c = create<SampledTexture>(ast::TextureDimension::k2d, create<type::F32>());
+    auto* d = create<SampledTexture>(ast::TextureDimension::kCube, create<type::I32>());
 
     EXPECT_TRUE(a->Equals(*b));
     EXPECT_FALSE(a->Equals(*c));
     EXPECT_FALSE(a->Equals(*d));
-    EXPECT_FALSE(a->Equals(sem::Void{}));
+    EXPECT_FALSE(a->Equals(type::Void{}));
 }
 
 TEST_F(SampledTextureTest, IsTexture) {
-    sem::F32 f32;
+    type::F32 f32;
     SampledTexture s(ast::TextureDimension::kCube, &f32);
     Texture* ty = &s;
     EXPECT_FALSE(ty->Is<DepthTexture>());
@@ -72,19 +72,19 @@
 }
 
 TEST_F(SampledTextureTest, Dim) {
-    sem::F32 f32;
+    type::F32 f32;
     SampledTexture s(ast::TextureDimension::k3d, &f32);
     EXPECT_EQ(s.dim(), ast::TextureDimension::k3d);
 }
 
 TEST_F(SampledTextureTest, Type) {
-    sem::F32 f32;
+    type::F32 f32;
     SampledTexture s(ast::TextureDimension::k3d, &f32);
     EXPECT_EQ(s.type(), &f32);
 }
 
 TEST_F(SampledTextureTest, FriendlyName) {
-    sem::F32 f32;
+    type::F32 f32;
     SampledTexture s(ast::TextureDimension::k3d, &f32);
     EXPECT_EQ(s.FriendlyName(Symbols()), "texture_3d<f32>");
 }
diff --git a/src/tint/type/sampler_test.cc b/src/tint/type/sampler_test.cc
index 6d0e188..038efb5 100644
--- a/src/tint/type/sampler_test.cc
+++ b/src/tint/type/sampler_test.cc
@@ -52,7 +52,7 @@
 
     EXPECT_TRUE(a->Equals(*b));
     EXPECT_FALSE(a->Equals(*c));
-    EXPECT_FALSE(a->Equals(sem::Void{}));
+    EXPECT_FALSE(a->Equals(type::Void{}));
 }
 
 TEST_F(SamplerTest, FriendlyNameSampler) {
diff --git a/src/tint/type/storage_texture.cc b/src/tint/type/storage_texture.cc
index b922284..03d340e 100644
--- a/src/tint/type/storage_texture.cc
+++ b/src/tint/type/storage_texture.cc
@@ -55,7 +55,7 @@
         case ast::TexelFormat::kRg32Uint:
         case ast::TexelFormat::kRgba16Uint:
         case ast::TexelFormat::kRgba32Uint: {
-            return type_mgr.Get<sem::U32>();
+            return type_mgr.Get<type::U32>();
         }
 
         case ast::TexelFormat::kR32Sint:
@@ -63,7 +63,7 @@
         case ast::TexelFormat::kRg32Sint:
         case ast::TexelFormat::kRgba16Sint:
         case ast::TexelFormat::kRgba32Sint: {
-            return type_mgr.Get<sem::I32>();
+            return type_mgr.Get<type::I32>();
         }
 
         case ast::TexelFormat::kRgba8Unorm:
@@ -72,7 +72,7 @@
         case ast::TexelFormat::kRg32Float:
         case ast::TexelFormat::kRgba16Float:
         case ast::TexelFormat::kRgba32Float: {
-            return type_mgr.Get<sem::F32>();
+            return type_mgr.Get<type::F32>();
         }
 
         case ast::TexelFormat::kUndefined:
diff --git a/src/tint/type/storage_texture_test.cc b/src/tint/type/storage_texture_test.cc
index 55becae..a237d71 100644
--- a/src/tint/type/storage_texture_test.cc
+++ b/src/tint/type/storage_texture_test.cc
@@ -41,7 +41,7 @@
     auto* e =
         Create(ast::TextureDimension::kCube, ast::TexelFormat::kRgba32Float, ast::Access::kRead);
 
-    EXPECT_TRUE(a->type()->Is<sem::F32>());
+    EXPECT_TRUE(a->type()->Is<type::F32>());
     EXPECT_EQ(a->dim(), ast::TextureDimension::kCube);
 
     EXPECT_EQ(a, b);
@@ -84,7 +84,7 @@
     EXPECT_FALSE(a->Equals(*c));
     EXPECT_FALSE(a->Equals(*d));
     EXPECT_FALSE(a->Equals(*e));
-    EXPECT_FALSE(a->Equals(sem::Void{}));
+    EXPECT_FALSE(a->Equals(type::Void{}));
 }
 
 TEST_F(StorageTextureTest, Dim) {
@@ -114,7 +114,7 @@
     ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
     ASSERT_TRUE(s->Is<Texture>());
     ASSERT_TRUE(s->Is<StorageTexture>());
-    EXPECT_TRUE(s->As<StorageTexture>()->type()->Is<sem::F32>());
+    EXPECT_TRUE(s->As<StorageTexture>()->type()->Is<type::F32>());
 }
 
 TEST_F(StorageTextureTest, U32) {
@@ -128,7 +128,7 @@
     ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
     ASSERT_TRUE(s->Is<Texture>());
     ASSERT_TRUE(s->Is<StorageTexture>());
-    EXPECT_TRUE(s->As<StorageTexture>()->type()->Is<sem::U32>());
+    EXPECT_TRUE(s->As<StorageTexture>()->type()->Is<type::U32>());
 }
 
 TEST_F(StorageTextureTest, I32) {
@@ -142,7 +142,7 @@
     ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
     ASSERT_TRUE(s->Is<Texture>());
     ASSERT_TRUE(s->Is<StorageTexture>());
-    EXPECT_TRUE(s->As<StorageTexture>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(s->As<StorageTexture>()->type()->Is<type::I32>());
 }
 
 }  // namespace
diff --git a/src/tint/type/texture_test.cc b/src/tint/type/texture_test.cc
index 1c3abd7..c7da4f5 100644
--- a/src/tint/type/texture_test.cc
+++ b/src/tint/type/texture_test.cc
@@ -24,7 +24,7 @@
 
 TEST_P(TextureTypeDimTest, DimMustMatch) {
     // Check that the dim() query returns the right dimensionality.
-    sem::F32 f32;
+    type::F32 f32;
     // TextureType is an abstract class, so use concrete class
     // SampledTexture in its stead.
     SampledTexture st(GetParam(), &f32);
diff --git a/src/tint/type/type.cc b/src/tint/type/type.cc
index a416947..61bb3dd 100644
--- a/src/tint/type/type.cc
+++ b/src/tint/type/type.cc
@@ -15,20 +15,20 @@
 #include "src/tint/type/type.h"
 
 #include "src/tint/sem/array.h"
-#include "src/tint/sem/bool.h"
-#include "src/tint/sem/f16.h"
-#include "src/tint/sem/f32.h"
-#include "src/tint/sem/i32.h"
 #include "src/tint/sem/matrix.h"
 #include "src/tint/sem/pointer.h"
 #include "src/tint/sem/reference.h"
 #include "src/tint/sem/struct.h"
-#include "src/tint/sem/u32.h"
 #include "src/tint/sem/vector.h"
 #include "src/tint/type/abstract_float.h"
 #include "src/tint/type/abstract_int.h"
+#include "src/tint/type/bool.h"
+#include "src/tint/type/f16.h"
+#include "src/tint/type/f32.h"
+#include "src/tint/type/i32.h"
 #include "src/tint/type/sampler.h"
 #include "src/tint/type/texture.h"
+#include "src/tint/type/u32.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::Type);
 
@@ -69,15 +69,15 @@
 }
 
 bool Type::is_scalar() const {
-    return IsAnyOf<sem::F16, sem::F32, sem::U32, sem::I32, type::AbstractNumeric, sem::Bool>();
+    return IsAnyOf<type::F16, type::F32, type::U32, type::I32, type::AbstractNumeric, type::Bool>();
 }
 
 bool Type::is_numeric_scalar() const {
-    return IsAnyOf<sem::F16, sem::F32, sem::U32, sem::I32, type::AbstractNumeric>();
+    return IsAnyOf<type::F16, type::F32, type::U32, type::I32, type::AbstractNumeric>();
 }
 
 bool Type::is_float_scalar() const {
-    return IsAnyOf<sem::F16, sem::F32, type::AbstractNumeric>();
+    return IsAnyOf<type::F16, type::F32, type::AbstractNumeric>();
 }
 
 bool Type::is_float_matrix() const {
@@ -103,32 +103,32 @@
 }
 
 bool Type::is_integer_scalar() const {
-    return IsAnyOf<sem::U32, sem::I32>();
+    return IsAnyOf<type::U32, type::I32>();
 }
 
 bool Type::is_signed_integer_scalar() const {
-    return IsAnyOf<sem::I32, type::AbstractInt>();
+    return IsAnyOf<type::I32, type::AbstractInt>();
 }
 
 bool Type::is_unsigned_integer_scalar() const {
-    return Is<sem::U32>();
+    return Is<type::U32>();
 }
 
 bool Type::is_signed_integer_vector() const {
     return Is(
-        [](const sem::Vector* v) { return v->type()->IsAnyOf<sem::I32, type::AbstractInt>(); });
+        [](const sem::Vector* v) { return v->type()->IsAnyOf<type::I32, type::AbstractInt>(); });
 }
 
 bool Type::is_unsigned_integer_vector() const {
-    return Is([](const sem::Vector* v) { return v->type()->Is<sem::U32>(); });
+    return Is([](const sem::Vector* v) { return v->type()->Is<type::U32>(); });
 }
 
 bool Type::is_unsigned_integer_scalar_or_vector() const {
-    return Is<sem::U32>() || is_unsigned_integer_vector();
+    return Is<type::U32>() || is_unsigned_integer_vector();
 }
 
 bool Type::is_signed_integer_scalar_or_vector() const {
-    return IsAnyOf<sem::I32, type::AbstractInt>() || is_signed_integer_vector();
+    return IsAnyOf<type::I32, type::AbstractInt>() || is_signed_integer_vector();
 }
 
 bool Type::is_integer_scalar_or_vector() const {
@@ -152,11 +152,11 @@
 }
 
 bool Type::is_bool_vector() const {
-    return Is([](const sem::Vector* v) { return v->type()->Is<sem::Bool>(); });
+    return Is([](const sem::Vector* v) { return v->type()->Is<type::Bool>(); });
 }
 
 bool Type::is_bool_scalar_or_vector() const {
-    return Is<sem::Bool>() || is_bool_vector();
+    return Is<type::Bool>() || is_bool_vector();
 }
 
 bool Type::is_numeric_vector() const {
@@ -200,19 +200,19 @@
         from,
         [&](const type::AbstractFloat*) {
             return Switch(
-                to,                                  //
-                [&](const sem::F32*) { return 1; },  //
-                [&](const sem::F16*) { return 2; },  //
+                to,                                   //
+                [&](const type::F32*) { return 1; },  //
+                [&](const type::F16*) { return 2; },  //
                 [&](Default) { return kNoConversion; });
         },
         [&](const type::AbstractInt*) {
             return Switch(
                 to,                                             //
-                [&](const sem::I32*) { return 3; },             //
-                [&](const sem::U32*) { return 4; },             //
+                [&](const type::I32*) { return 3; },            //
+                [&](const type::U32*) { return 4; },            //
                 [&](const type::AbstractFloat*) { return 5; },  //
-                [&](const sem::F32*) { return 6; },             //
-                [&](const sem::F16*) { return 7; },             //
+                [&](const type::F32*) { return 6; },            //
+                [&](const type::F16*) { return 7; },            //
                 [&](Default) { return kNoConversion; });
         },
         [&](const sem::Vector* from_vec) {
diff --git a/src/tint/type/type_manager_test.cc b/src/tint/type/type_manager_test.cc
index 76312bd..11c3645 100644
--- a/src/tint/type/type_manager_test.cc
+++ b/src/tint/type/type_manager_test.cc
@@ -15,8 +15,8 @@
 #include "src/tint/type/type_manager.h"
 
 #include "gtest/gtest.h"
-#include "src/tint/sem/i32.h"
-#include "src/tint/sem/u32.h"
+#include "src/tint/type/i32.h"
+#include "src/tint/type/u32.h"
 
 namespace tint::type {
 namespace {
@@ -35,51 +35,51 @@
 
 TEST_F(TypeManagerTest, GetUnregistered) {
     TypeManager tm;
-    auto* t = tm.Get<sem::I32>();
+    auto* t = tm.Get<type::I32>();
     ASSERT_NE(t, nullptr);
-    EXPECT_TRUE(t->Is<sem::I32>());
+    EXPECT_TRUE(t->Is<type::I32>());
 }
 
 TEST_F(TypeManagerTest, GetSameTypeReturnsSamePtr) {
     TypeManager tm;
-    auto* t = tm.Get<sem::I32>();
+    auto* t = tm.Get<type::I32>();
     ASSERT_NE(t, nullptr);
-    EXPECT_TRUE(t->Is<sem::I32>());
+    EXPECT_TRUE(t->Is<type::I32>());
 
-    auto* t2 = tm.Get<sem::I32>();
+    auto* t2 = tm.Get<type::I32>();
     EXPECT_EQ(t, t2);
 }
 
 TEST_F(TypeManagerTest, GetDifferentTypeReturnsDifferentPtr) {
     TypeManager tm;
-    type::Type* t = tm.Get<sem::I32>();
+    type::Type* t = tm.Get<type::I32>();
     ASSERT_NE(t, nullptr);
-    EXPECT_TRUE(t->Is<sem::I32>());
+    EXPECT_TRUE(t->Is<type::I32>());
 
-    type::Type* t2 = tm.Get<sem::U32>();
+    type::Type* t2 = tm.Get<type::U32>();
     ASSERT_NE(t2, nullptr);
     EXPECT_NE(t, t2);
-    EXPECT_TRUE(t2->Is<sem::U32>());
+    EXPECT_TRUE(t2->Is<type::U32>());
 }
 
 TEST_F(TypeManagerTest, Find) {
     TypeManager tm;
-    auto* created = tm.Get<sem::I32>();
+    auto* created = tm.Get<type::I32>();
 
-    EXPECT_EQ(tm.Find<sem::U32>(), nullptr);
-    EXPECT_EQ(tm.Find<sem::I32>(), created);
+    EXPECT_EQ(tm.Find<type::U32>(), nullptr);
+    EXPECT_EQ(tm.Find<type::I32>(), created);
 }
 
 TEST_F(TypeManagerTest, WrapDoesntAffectInner) {
     TypeManager inner;
     TypeManager outer = TypeManager::Wrap(inner);
 
-    inner.Get<sem::I32>();
+    inner.Get<type::I32>();
 
     EXPECT_EQ(count(inner), 1u);
     EXPECT_EQ(count(outer), 0u);
 
-    outer.Get<sem::U32>();
+    outer.Get<type::U32>();
 
     EXPECT_EQ(count(inner), 1u);
     EXPECT_EQ(count(outer), 1u);
diff --git a/src/tint/type/type_test.cc b/src/tint/type/type_test.cc
index 9036f89..4b08300 100644
--- a/src/tint/type/type_test.cc
+++ b/src/tint/type/type_test.cc
@@ -12,11 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/sem/f16.h"
 #include "src/tint/sem/reference.h"
 #include "src/tint/type/abstract_float.h"
 #include "src/tint/type/abstract_int.h"
 #include "src/tint/type/array_count.h"
+#include "src/tint/type/f16.h"
 #include "src/tint/type/test_helper.h"
 
 namespace tint::type {
@@ -25,10 +25,10 @@
 struct TypeTest : public TestHelper {
     const type::AbstractFloat* af = create<type::AbstractFloat>();
     const type::AbstractInt* ai = create<type::AbstractInt>();
-    const sem::F32* f32 = create<sem::F32>();
-    const sem::F16* f16 = create<sem::F16>();
-    const sem::I32* i32 = create<sem::I32>();
-    const sem::U32* u32 = create<sem::U32>();
+    const type::F32* f32 = create<type::F32>();
+    const type::F16* f16 = create<type::F16>();
+    const type::I32* i32 = create<type::I32>();
+    const type::U32* u32 = create<type::U32>();
     const sem::Vector* vec2_f32 = create<sem::Vector>(f32, 2u);
     const sem::Vector* vec3_f32 = create<sem::Vector>(f32, 3u);
     const sem::Vector* vec3_f16 = create<sem::Vector>(f16, 3u);
diff --git a/src/tint/sem/u32.cc b/src/tint/type/u32.cc
similarity index 87%
rename from src/tint/sem/u32.cc
rename to src/tint/type/u32.cc
index 6b15150..54b487e 100644
--- a/src/tint/sem/u32.cc
+++ b/src/tint/type/u32.cc
@@ -1,4 +1,4 @@
-// Copyright 2020 The Tint Authors.
+// Copyright 2022 The Tint Authors.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,13 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/sem/u32.h"
+#include "src/tint/type/u32.h"
 
 #include "src/tint/program_builder.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::sem::U32);
+TINT_INSTANTIATE_TYPEINFO(tint::type::U32);
 
-namespace tint::sem {
+namespace tint::type {
 
 U32::U32()
     : Base(type::TypeFlags{
@@ -51,4 +51,4 @@
     return 4;
 }
 
-}  // namespace tint::sem
+}  // namespace tint::type
diff --git a/src/tint/sem/u32.h b/src/tint/type/u32.h
similarity index 88%
rename from src/tint/sem/u32.h
rename to src/tint/type/u32.h
index 5f6ca0a..bbbc33f 100644
--- a/src/tint/sem/u32.h
+++ b/src/tint/type/u32.h
@@ -1,4 +1,4 @@
-// Copyright 2020 The Tint Authors.
+// Copyright 2022 The Tint Authors.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,14 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_SEM_U32_H_
-#define SRC_TINT_SEM_U32_H_
+#ifndef SRC_TINT_TYPE_U32_H_
+#define SRC_TINT_TYPE_U32_H_
 
 #include <string>
 
 #include "src/tint/type/type.h"
 
-namespace tint::sem {
+namespace tint::type {
 
 /// A unsigned int 32 type.
 class U32 final : public Castable<U32, type::Type> {
@@ -49,6 +49,6 @@
     uint32_t Align() const override;
 };
 
-}  // namespace tint::sem
+}  // namespace tint::type
 
-#endif  // SRC_TINT_SEM_U32_H_
+#endif  // SRC_TINT_TYPE_U32_H_
diff --git a/src/tint/sem/u32_test.cc b/src/tint/type/u32_test.cc
similarity index 89%
rename from src/tint/sem/u32_test.cc
rename to src/tint/type/u32_test.cc
index c3ca0e5..784b6d6 100644
--- a/src/tint/sem/u32_test.cc
+++ b/src/tint/type/u32_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2020 The Tint Authors.
+// Copyright 2022 The Tint Authors.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/sem/test_helper.h"
+#include "src/tint/type/test_helper.h"
 #include "src/tint/type/texture.h"
 
-namespace tint::sem {
+namespace tint::type {
 namespace {
 
 using U32Test = TestHelper;
@@ -45,4 +45,4 @@
 }
 
 }  // namespace
-}  // namespace tint::sem
+}  // namespace tint::type
diff --git a/src/tint/sem/void.cc b/src/tint/type/void.cc
similarity index 85%
rename from src/tint/sem/void.cc
rename to src/tint/type/void.cc
index bc8dbfb..2b8bb17 100644
--- a/src/tint/sem/void.cc
+++ b/src/tint/type/void.cc
@@ -1,4 +1,4 @@
-// Copyright 2020 The Tint Authors.
+// Copyright 2022 The Tint Authors.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,13 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/sem/void.h"
+#include "src/tint/type/void.h"
 
 #include "src/tint/program_builder.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::sem::Void);
+TINT_INSTANTIATE_TYPEINFO(tint::type::Void);
 
-namespace tint::sem {
+namespace tint::type {
 
 Void::Void() : Base(type::TypeFlags{}) {}
 
@@ -38,4 +38,4 @@
     return "void";
 }
 
-}  // namespace tint::sem
+}  // namespace tint::type
diff --git a/src/tint/sem/void.h b/src/tint/type/void.h
similarity index 87%
rename from src/tint/sem/void.h
rename to src/tint/type/void.h
index d5d0408..e533c86 100644
--- a/src/tint/sem/void.h
+++ b/src/tint/type/void.h
@@ -1,4 +1,4 @@
-// Copyright 2020 The Tint Authors.
+// Copyright 2022 The Tint Authors.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,14 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_SEM_VOID_H_
-#define SRC_TINT_SEM_VOID_H_
+#ifndef SRC_TINT_TYPE_VOID_H_
+#define SRC_TINT_TYPE_VOID_H_
 
 #include <string>
 
 #include "src/tint/type/type.h"
 
-namespace tint::sem {
+namespace tint::type {
 
 /// A void type
 class Void final : public Castable<Void, type::Type> {
@@ -43,6 +43,6 @@
     std::string FriendlyName(const SymbolTable& symbols) const override;
 };
 
-}  // namespace tint::sem
+}  // namespace tint::type
 
-#endif  // SRC_TINT_SEM_VOID_H_
+#endif  // SRC_TINT_TYPE_VOID_H_
diff --git a/src/tint/writer/append_vector.cc b/src/tint/writer/append_vector.cc
index c3a094a..97bae38 100644
--- a/src/tint/writer/append_vector.cc
+++ b/src/tint/writer/append_vector.cc
@@ -46,13 +46,13 @@
 
 const sem::Expression* Zero(ProgramBuilder& b, const type::Type* ty, const sem::Statement* stmt) {
     const ast::Expression* expr = nullptr;
-    if (ty->Is<sem::I32>()) {
+    if (ty->Is<type::I32>()) {
         expr = b.Expr(0_i);
-    } else if (ty->Is<sem::U32>()) {
+    } else if (ty->Is<type::U32>()) {
         expr = b.Expr(0_u);
-    } else if (ty->Is<sem::F32>()) {
+    } else if (ty->Is<type::F32>()) {
         expr = b.Expr(0_f);
-    } else if (ty->Is<sem::Bool>()) {
+    } else if (ty->Is<type::Bool>()) {
         expr = b.Expr(false);
     } else {
         TINT_UNREACHABLE(Writer, b.Diagnostics())
@@ -85,13 +85,13 @@
     }
 
     const ast::Type* packed_el_ast_ty = nullptr;
-    if (packed_el_sem_ty->Is<sem::I32>()) {
+    if (packed_el_sem_ty->Is<type::I32>()) {
         packed_el_ast_ty = b->create<ast::I32>();
-    } else if (packed_el_sem_ty->Is<sem::U32>()) {
+    } else if (packed_el_sem_ty->Is<type::U32>()) {
         packed_el_ast_ty = b->create<ast::U32>();
-    } else if (packed_el_sem_ty->Is<sem::F32>()) {
+    } else if (packed_el_sem_ty->Is<type::F32>()) {
         packed_el_ast_ty = b->create<ast::F32>();
-    } else if (packed_el_sem_ty->Is<sem::Bool>()) {
+    } else if (packed_el_sem_ty->Is<type::Bool>()) {
         packed_el_ast_ty = b->create<ast::Bool>();
     } else {
         TINT_UNREACHABLE(Writer, b->Diagnostics())
diff --git a/src/tint/writer/append_vector_test.cc b/src/tint/writer/append_vector_test.cc
index 08c1d1c..1164f54 100644
--- a/src/tint/writer/append_vector_test.cc
+++ b/src/tint/writer/append_vector_test.cc
@@ -57,13 +57,13 @@
     ASSERT_NE(ctor, nullptr);
     ASSERT_TRUE(ctor->ReturnType()->Is<sem::Vector>());
     EXPECT_EQ(ctor->ReturnType()->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(ctor->ReturnType()->As<sem::Vector>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->ReturnType()->As<sem::Vector>()->type()->Is<type::I32>());
     EXPECT_EQ(ctor->ReturnType(), call->Type());
 
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::I32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::I32>());
-    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::I32>());
 }
 
 // AppendVector(vec2<i32>(1, 2), 3u) -> vec3<i32>(1, 2, i32(3u))
@@ -101,13 +101,13 @@
     ASSERT_NE(ctor, nullptr);
     ASSERT_TRUE(ctor->ReturnType()->Is<sem::Vector>());
     EXPECT_EQ(ctor->ReturnType()->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(ctor->ReturnType()->As<sem::Vector>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->ReturnType()->As<sem::Vector>()->type()->Is<type::I32>());
     EXPECT_EQ(ctor->ReturnType(), call->Type());
 
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::I32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::I32>());
-    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::I32>());
 }
 
 // AppendVector(vec2<i32>(vec2<u32>(1u, 2u)), 3u) ->
@@ -152,12 +152,12 @@
     ASSERT_NE(ctor, nullptr);
     ASSERT_TRUE(ctor->ReturnType()->Is<sem::Vector>());
     EXPECT_EQ(ctor->ReturnType()->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(ctor->ReturnType()->As<sem::Vector>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->ReturnType()->As<sem::Vector>()->type()->Is<type::I32>());
     EXPECT_EQ(ctor->ReturnType(), call->Type());
 
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
     EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
 }
 
 // AppendVector(vec2<i32>(1, 2), 3.0f) -> vec3<i32>(1, 2, i32(3.0f))
@@ -195,13 +195,13 @@
     ASSERT_NE(ctor, nullptr);
     ASSERT_TRUE(ctor->ReturnType()->Is<sem::Vector>());
     EXPECT_EQ(ctor->ReturnType()->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(ctor->ReturnType()->As<sem::Vector>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->ReturnType()->As<sem::Vector>()->type()->Is<type::I32>());
     EXPECT_EQ(ctor->ReturnType(), call->Type());
 
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::I32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::I32>());
-    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::I32>());
 }
 
 // AppendVector(vec3<i32>(1, 2, 3), 4) -> vec4<i32>(1, 2, 3, 4)
@@ -238,14 +238,14 @@
     ASSERT_NE(ctor, nullptr);
     ASSERT_TRUE(ctor->ReturnType()->Is<sem::Vector>());
     EXPECT_EQ(ctor->ReturnType()->As<sem::Vector>()->Width(), 4u);
-    EXPECT_TRUE(ctor->ReturnType()->As<sem::Vector>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->ReturnType()->As<sem::Vector>()->type()->Is<type::I32>());
     EXPECT_EQ(ctor->ReturnType(), call->Type());
 
     ASSERT_EQ(ctor->Parameters().Length(), 4u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::I32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::I32>());
-    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<sem::I32>());
-    EXPECT_TRUE(ctor->Parameters()[3]->Type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[3]->Type()->Is<type::I32>());
 }
 
 // AppendVector(vec_12, 3) -> vec3<i32>(vec_12, 3)
@@ -276,12 +276,12 @@
     ASSERT_NE(ctor, nullptr);
     ASSERT_TRUE(ctor->ReturnType()->Is<sem::Vector>());
     EXPECT_EQ(ctor->ReturnType()->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(ctor->ReturnType()->As<sem::Vector>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->ReturnType()->As<sem::Vector>()->type()->Is<type::I32>());
     EXPECT_EQ(ctor->ReturnType(), call->Type());
 
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
     EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
 }
 
 // AppendVector(1, 2, scalar_3) -> vec3<i32>(1, 2, scalar_3)
@@ -316,13 +316,13 @@
     ASSERT_NE(ctor, nullptr);
     ASSERT_TRUE(ctor->ReturnType()->Is<sem::Vector>());
     EXPECT_EQ(ctor->ReturnType()->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(ctor->ReturnType()->As<sem::Vector>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->ReturnType()->As<sem::Vector>()->type()->Is<type::I32>());
     EXPECT_EQ(ctor->ReturnType(), call->Type());
 
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::I32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::I32>());
-    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::I32>());
 }
 
 // AppendVector(vec_12, scalar_3) -> vec3<i32>(vec_12, scalar_3)
@@ -354,12 +354,12 @@
     ASSERT_NE(ctor, nullptr);
     ASSERT_TRUE(ctor->ReturnType()->Is<sem::Vector>());
     EXPECT_EQ(ctor->ReturnType()->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(ctor->ReturnType()->As<sem::Vector>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->ReturnType()->As<sem::Vector>()->type()->Is<type::I32>());
     EXPECT_EQ(ctor->ReturnType(), call->Type());
 
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
     EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
 }
 
 // AppendVector(vec_12, scalar_3) -> vec3<i32>(vec_12, i32(scalar_3))
@@ -395,12 +395,12 @@
     ASSERT_NE(ctor, nullptr);
     ASSERT_TRUE(ctor->ReturnType()->Is<sem::Vector>());
     EXPECT_EQ(ctor->ReturnType()->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(ctor->ReturnType()->As<sem::Vector>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->ReturnType()->As<sem::Vector>()->type()->Is<type::I32>());
     EXPECT_EQ(ctor->ReturnType(), call->Type());
 
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
     EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
 }
 
 // AppendVector(vec_12, scalar_3) -> vec3<bool>(vec_12, scalar_3)
@@ -432,12 +432,12 @@
     ASSERT_NE(ctor, nullptr);
     ASSERT_TRUE(ctor->ReturnType()->Is<sem::Vector>());
     EXPECT_EQ(ctor->ReturnType()->As<sem::Vector>()->Width(), 3u);
-    EXPECT_TRUE(ctor->ReturnType()->As<sem::Vector>()->type()->Is<sem::Bool>());
+    EXPECT_TRUE(ctor->ReturnType()->As<sem::Vector>()->type()->Is<type::Bool>());
     EXPECT_EQ(ctor->ReturnType(), call->Type());
 
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
     EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::Vector>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::Bool>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::Bool>());
 }
 
 // AppendVector(vec3<i32>(), 4) -> vec3<bool>(0, 0, 0, 4)
@@ -473,14 +473,14 @@
     ASSERT_NE(ctor, nullptr);
     ASSERT_TRUE(ctor->ReturnType()->Is<sem::Vector>());
     EXPECT_EQ(ctor->ReturnType()->As<sem::Vector>()->Width(), 4u);
-    EXPECT_TRUE(ctor->ReturnType()->As<sem::Vector>()->type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->ReturnType()->As<sem::Vector>()->type()->Is<type::I32>());
     EXPECT_EQ(ctor->ReturnType(), call->Type());
 
     ASSERT_EQ(ctor->Parameters().Length(), 4u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<sem::I32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<sem::I32>());
-    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<sem::I32>());
-    EXPECT_TRUE(ctor->Parameters()[3]->Type()->Is<sem::I32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[3]->Type()->Is<type::I32>());
 }
 
 }  // namespace
diff --git a/src/tint/writer/glsl/generator_impl.cc b/src/tint/writer/glsl/generator_impl.cc
index 00f6490..ea43943 100644
--- a/src/tint/writer/glsl/generator_impl.cc
+++ b/src/tint/writer/glsl/generator_impl.cc
@@ -941,7 +941,7 @@
                     return false;
                 }
                 out << ", 0";
-                if (builtin->ReturnType()->Is<sem::U32>()) {
+                if (builtin->ReturnType()->Is<type::U32>()) {
                     out << "u";
                 }
             }
@@ -1280,7 +1280,7 @@
                                     const ast::CallExpression* expr,
                                     const sem::Builtin* builtin) {
     auto* return_elem_type = type::Type::DeepestElementOf(builtin->ReturnType());
-    const std::string suffix = Is<sem::F16>(return_elem_type) ? "hf" : "f";
+    const std::string suffix = Is<type::F16>(return_elem_type) ? "hf" : "f";
     return CallBuiltinHelper(out, expr, builtin,
                              [&](TextBuffer* b, const std::vector<std::string>& params) {
                                  line(b) << "return " << params[0] << " * " << std::setprecision(20)
@@ -1293,7 +1293,7 @@
                                     const ast::CallExpression* expr,
                                     const sem::Builtin* builtin) {
     auto* return_elem_type = type::Type::DeepestElementOf(builtin->ReturnType());
-    const std::string suffix = Is<sem::F16>(return_elem_type) ? "hf" : "f";
+    const std::string suffix = Is<type::F16>(return_elem_type) ? "hf" : "f";
     return CallBuiltinHelper(out, expr, builtin,
                              [&](TextBuffer* b, const std::vector<std::string>& params) {
                                  line(b) << "return " << params[0] << " * " << std::setprecision(20)
@@ -1351,7 +1351,7 @@
 
 const ast::Expression* GeneratorImpl::CreateF32Zero(const sem::Statement* stmt) {
     auto* zero = builder_.Expr(0_f);
-    auto* f32 = builder_.create<sem::F32>();
+    auto* f32 = builder_.create<type::F32>();
     auto* sem_zero = builder_.create<sem::Expression>(zero, f32, sem::EvaluationStage::kRuntime,
                                                       stmt, /* constant_value */ nullptr,
                                                       /* has_side_effects */ false);
@@ -1658,7 +1658,7 @@
 
     out << ")";
 
-    if (builtin->ReturnType()->Is<sem::Void>()) {
+    if (builtin->ReturnType()->Is<type::Void>()) {
         return true;
     }
     // If the builtin return type does not match the number of elements of the
@@ -2297,23 +2297,23 @@
 bool GeneratorImpl::EmitConstant(std::ostream& out, const sem::Constant* constant) {
     return Switch(
         constant->Type(),  //
-        [&](const sem::Bool*) {
+        [&](const type::Bool*) {
             out << (constant->As<AInt>() ? "true" : "false");
             return true;
         },
-        [&](const sem::F32*) {
+        [&](const type::F32*) {
             PrintF32(out, constant->As<float>());
             return true;
         },
-        [&](const sem::F16*) {
+        [&](const type::F16*) {
             PrintF16(out, constant->As<float>());
             return true;
         },
-        [&](const sem::I32*) {
+        [&](const type::I32*) {
             out << constant->As<AInt>();
             return true;
         },
-        [&](const sem::U32*) {
+        [&](const type::U32*) {
             out << constant->As<AInt>() << "u";
             return true;
         },
@@ -2436,15 +2436,15 @@
 }
 
 bool GeneratorImpl::EmitZeroValue(std::ostream& out, const type::Type* type) {
-    if (type->Is<sem::Bool>()) {
+    if (type->Is<type::Bool>()) {
         out << "false";
-    } else if (type->Is<sem::F32>()) {
+    } else if (type->Is<type::F32>()) {
         out << "0.0f";
-    } else if (type->Is<sem::F16>()) {
+    } else if (type->Is<type::F16>()) {
         out << "0.0hf";
-    } else if (type->Is<sem::I32>()) {
+    } else if (type->Is<type::I32>()) {
         out << "0";
-    } else if (type->Is<sem::U32>()) {
+    } else if (type->Is<type::U32>()) {
         out << "0u";
     } else if (auto* vec = type->As<sem::Vector>()) {
         if (!EmitType(out, type, ast::AddressSpace::kNone, ast::Access::kReadWrite, "")) {
@@ -2871,17 +2871,17 @@
                 out << "[]";
             }
         }
-    } else if (type->Is<sem::Bool>()) {
+    } else if (type->Is<type::Bool>()) {
         out << "bool";
-    } else if (type->Is<sem::F32>()) {
+    } else if (type->Is<type::F32>()) {
         out << "float";
-    } else if (type->Is<sem::F16>()) {
+    } else if (type->Is<type::F16>()) {
         out << "float16_t";
-    } else if (type->Is<sem::I32>()) {
+    } else if (type->Is<type::I32>()) {
         out << "int";
     } else if (auto* mat = type->As<sem::Matrix>()) {
-        TINT_ASSERT(Writer, (mat->type()->IsAnyOf<sem::F32, sem::F16>()));
-        if (mat->type()->Is<sem::F16>()) {
+        TINT_ASSERT(Writer, (mat->type()->IsAnyOf<type::F32, type::F16>()));
+        if (mat->type()->Is<type::F16>()) {
             out << "f16";
         }
         out << "mat" << mat->columns();
@@ -2917,10 +2917,10 @@
                         : storage ? storage->type()
                         : ms      ? ms->type()
                                   : nullptr;
-        if (!subtype || subtype->Is<sem::F32>()) {
-        } else if (subtype->Is<sem::I32>()) {
+        if (!subtype || subtype->Is<type::F32>()) {
+        } else if (subtype->Is<type::I32>()) {
             out << "i";
-        } else if (subtype->Is<sem::U32>()) {
+        } else if (subtype->Is<type::U32>()) {
             out << "u";
         } else {
             TINT_ICE(Writer, diagnostics_) << "Unsupported texture type";
@@ -2956,19 +2956,19 @@
         if (tex->Is<type::DepthTexture>()) {
             out << "Shadow";
         }
-    } else if (type->Is<sem::U32>()) {
+    } else if (type->Is<type::U32>()) {
         out << "uint";
     } else if (auto* vec = type->As<sem::Vector>()) {
         auto width = vec->Width();
-        if (vec->type()->Is<sem::F32>() && width >= 1 && width <= 4) {
+        if (vec->type()->Is<type::F32>() && width >= 1 && width <= 4) {
             out << "vec" << width;
-        } else if (vec->type()->Is<sem::F16>() && width >= 1 && width <= 4) {
+        } else if (vec->type()->Is<type::F16>() && width >= 1 && width <= 4) {
             out << "f16vec" << width;
-        } else if (vec->type()->Is<sem::I32>() && width >= 1 && width <= 4) {
+        } else if (vec->type()->Is<type::I32>() && width >= 1 && width <= 4) {
             out << "ivec" << width;
-        } else if (vec->type()->Is<sem::U32>() && width >= 1 && width <= 4) {
+        } else if (vec->type()->Is<type::U32>() && width >= 1 && width <= 4) {
             out << "uvec" << width;
-        } else if (vec->type()->Is<sem::Bool>() && width >= 1 && width <= 4) {
+        } else if (vec->type()->Is<type::Bool>() && width >= 1 && width <= 4) {
             out << "bvec" << width;
         } else {
             out << "vector<";
@@ -2981,7 +2981,7 @@
         if (!EmitType(out, atomic->Type(), address_space, access, name)) {
             return false;
         }
-    } else if (type->Is<sem::Void>()) {
+    } else if (type->Is<type::Void>()) {
         out << "void";
     } else {
         diagnostics_.add_error(diag::System::Writer, "unknown type in EmitType");
@@ -3206,8 +3206,8 @@
 }
 
 type::Type* GeneratorImpl::BoolTypeToUint(const type::Type* type) {
-    auto* u32 = builder_.create<sem::U32>();
-    if (type->Is<sem::Bool>()) {
+    auto* u32 = builder_.create<type::U32>();
+    if (type->Is<type::Bool>()) {
         return u32;
     } else if (auto* vec = type->As<sem::Vector>()) {
         return builder_.create<sem::Vector>(u32, vec->Width());
diff --git a/src/tint/writer/glsl/generator_impl_type_test.cc b/src/tint/writer/glsl/generator_impl_type_test.cc
index 726b834..7adf274 100644
--- a/src/tint/writer/glsl/generator_impl_type_test.cc
+++ b/src/tint/writer/glsl/generator_impl_type_test.cc
@@ -84,7 +84,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Type, EmitType_Bool) {
-    auto* bool_ = create<sem::Bool>();
+    auto* bool_ = create<type::Bool>();
 
     GeneratorImpl& gen = Build();
 
@@ -95,7 +95,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Type, EmitType_F32) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
 
     GeneratorImpl& gen = Build();
 
@@ -108,7 +108,7 @@
 TEST_F(GlslGeneratorImplTest_Type, EmitType_F16) {
     Enable(ast::Extension::kF16);
 
-    auto* f16 = create<sem::F16>();
+    auto* f16 = create<type::F16>();
 
     GeneratorImpl& gen = Build();
 
@@ -119,7 +119,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Type, EmitType_I32) {
-    auto* i32 = create<sem::I32>();
+    auto* i32 = create<type::I32>();
 
     GeneratorImpl& gen = Build();
 
@@ -130,7 +130,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Type, EmitType_Matrix_F32) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* vec3 = create<sem::Vector>(f32, 3u);
     auto* mat2x3 = create<sem::Matrix>(vec3, 2u);
 
@@ -145,7 +145,7 @@
 TEST_F(GlslGeneratorImplTest_Type, EmitType_Matrix_F16) {
     Enable(ast::Extension::kF16);
 
-    auto* f16 = create<sem::F16>();
+    auto* f16 = create<type::F16>();
     auto* vec3 = create<sem::Vector>(f16, 3u);
     auto* mat2x3 = create<sem::Matrix>(vec3, 2u);
 
@@ -231,7 +231,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Type, EmitType_U32) {
-    auto* u32 = create<sem::U32>();
+    auto* u32 = create<type::U32>();
 
     GeneratorImpl& gen = Build();
 
@@ -242,7 +242,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Type, EmitType_Vector_F32) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* vec3 = create<sem::Vector>(f32, 3u);
 
     GeneratorImpl& gen = Build();
@@ -256,7 +256,7 @@
 TEST_F(GlslGeneratorImplTest_Type, EmitType_Vector_F16) {
     Enable(ast::Extension::kF16);
 
-    auto* f16 = create<sem::F16>();
+    auto* f16 = create<type::F16>();
     auto* vec3 = create<sem::Vector>(f16, 3u);
 
     GeneratorImpl& gen = Build();
@@ -268,7 +268,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Type, EmitType_Void) {
-    auto* void_ = create<sem::Void>();
+    auto* void_ = create<type::Void>();
 
     GeneratorImpl& gen = Build();
 
@@ -494,7 +494,7 @@
                              }));
 
 TEST_F(GlslGeneratorImplTest_Type, EmitMultisampledTexture) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* s = create<type::MultisampledTexture>(ast::TextureDimension::k2d, f32);
 
     GeneratorImpl& gen = Build();
diff --git a/src/tint/writer/hlsl/generator_impl.cc b/src/tint/writer/hlsl/generator_impl.cc
index e989bfc..565f97a 100644
--- a/src/tint/writer/hlsl/generator_impl.cc
+++ b/src/tint/writer/hlsl/generator_impl.cc
@@ -1116,7 +1116,7 @@
     bool scalar_offset_constant = false;
 
     if (auto* val = offset_arg->ConstantValue()) {
-        TINT_ASSERT(Writer, val->Type()->Is<sem::U32>());
+        TINT_ASSERT(Writer, val->Type()->Is<type::U32>());
         scalar_offset_bytes = static_cast<uint32_t>(std::get<AInt>(val->Value()));
         scalar_offset_index = scalar_offset_bytes / 4;  // bytes -> scalar index
         scalar_offset_constant = true;
@@ -1775,7 +1775,7 @@
                                             const sem::Builtin* builtin) {
     std::string result = UniqueIdentifier("atomic_result");
 
-    if (!builtin->ReturnType()->Is<sem::Void>()) {
+    if (!builtin->ReturnType()->Is<type::Void>()) {
         auto pre = line();
         if (!EmitTypeAndName(pre, builtin->ReturnType(), ast::AddressSpace::kNone,
                              ast::Access::kUndefined, result)) {
@@ -2021,7 +2021,7 @@
             }
 
             std::string member_type;
-            if (Is<sem::F16>(type::Type::DeepestElementOf(ty))) {
+            if (Is<type::F16>(type::Type::DeepestElementOf(ty))) {
                 member_type = width.empty() ? "float16_t" : ("vector<float16_t, " + width + ">");
             } else {
                 member_type = "float" + width;
@@ -2539,7 +2539,7 @@
     }
 
     auto emit_vector_appended_with_i32_zero = [&](const ast::Expression* vector) {
-        auto* i32 = builder_.create<sem::I32>();
+        auto* i32 = builder_.create<type::I32>();
         auto* zero = builder_.Expr(0_i);
         auto* stmt = builder_.Sem().Get(vector)->Stmt();
         builder_.Sem().Add(
@@ -2915,7 +2915,7 @@
         out << ") {";
     }
 
-    if (sem->DiscardStatement() && !sem->ReturnType()->Is<sem::Void>()) {
+    if (sem->DiscardStatement() && !sem->ReturnType()->Is<type::Void>()) {
         // BUG(crbug.com/tint/1081): work around non-void functions with discard
         // failing compilation sometimes
         if (!EmitFunctionBodyWithDiscard(func)) {
@@ -2939,7 +2939,7 @@
     // there is always an (unused) return statement.
 
     auto* sem = builder_.Sem().Get(func);
-    TINT_ASSERT(Writer, sem->DiscardStatement() && !sem->ReturnType()->Is<sem::Void>());
+    TINT_ASSERT(Writer, sem->DiscardStatement() && !sem->ReturnType()->Is<type::Void>());
 
     ScopedIndent si(this);
     line() << "if (true) {";
@@ -3267,26 +3267,26 @@
                                  bool is_variable_initializer) {
     return Switch(
         constant->Type(),  //
-        [&](const sem::Bool*) {
+        [&](const type::Bool*) {
             out << (constant->As<AInt>() ? "true" : "false");
             return true;
         },
-        [&](const sem::F32*) {
+        [&](const type::F32*) {
             PrintF32(out, constant->As<float>());
             return true;
         },
-        [&](const sem::F16*) {
+        [&](const type::F16*) {
             // emit a f16 scalar with explicit float16_t type declaration.
             out << "float16_t(";
             PrintF16(out, constant->As<float>());
             out << ")";
             return true;
         },
-        [&](const sem::I32*) {
+        [&](const type::I32*) {
             out << constant->As<AInt>();
             return true;
         },
-        [&](const sem::U32*) {
+        [&](const type::U32*) {
             out << constant->As<AInt>() << "u";
             return true;
         },
@@ -3459,23 +3459,23 @@
 bool GeneratorImpl::EmitValue(std::ostream& out, const type::Type* type, int value) {
     return Switch(
         type,
-        [&](const sem::Bool*) {
+        [&](const type::Bool*) {
             out << (value == 0 ? "false" : "true");
             return true;
         },
-        [&](const sem::F32*) {
+        [&](const type::F32*) {
             out << value << ".0f";
             return true;
         },
-        [&](const sem::F16*) {
+        [&](const type::F16*) {
             out << "float16_t(" << value << ".0h)";
             return true;
         },
-        [&](const sem::I32*) {
+        [&](const type::I32*) {
             out << value;
             return true;
         },
-        [&](const sem::U32*) {
+        [&](const type::U32*) {
             out << value << "u";
             return true;
         },
@@ -3954,24 +3954,24 @@
             }
             return true;
         },
-        [&](const sem::Bool*) {
+        [&](const type::Bool*) {
             out << "bool";
             return true;
         },
-        [&](const sem::F32*) {
+        [&](const type::F32*) {
             out << "float";
             return true;
         },
-        [&](const sem::F16*) {
+        [&](const type::F16*) {
             out << "float16_t";
             return true;
         },
-        [&](const sem::I32*) {
+        [&](const type::I32*) {
             out << "int";
             return true;
         },
         [&](const sem::Matrix* mat) {
-            if (mat->type()->Is<sem::F16>()) {
+            if (mat->type()->Is<type::F16>()) {
                 // Use matrix<type, N, M> for f16 matrix
                 out << "matrix<";
                 if (!EmitType(out, mat->type(), address_space, access, "")) {
@@ -4066,11 +4066,11 @@
             } else if (sampled || ms) {
                 auto* subtype = sampled ? sampled->type() : ms->type();
                 out << "<";
-                if (subtype->Is<sem::F32>()) {
+                if (subtype->Is<type::F32>()) {
                     out << "float4";
-                } else if (subtype->Is<sem::I32>()) {
+                } else if (subtype->Is<type::I32>()) {
                     out << "int4";
-                } else if (subtype->Is<sem::U32>()) {
+                } else if (subtype->Is<type::U32>()) {
                     out << "uint4";
                 } else {
                     TINT_ICE(Writer, diagnostics_) << "Unsupported multisampled texture type";
@@ -4080,19 +4080,19 @@
             }
             return true;
         },
-        [&](const sem::U32*) {
+        [&](const type::U32*) {
             out << "uint";
             return true;
         },
         [&](const sem::Vector* vec) {
             auto width = vec->Width();
-            if (vec->type()->Is<sem::F32>() && width >= 1 && width <= 4) {
+            if (vec->type()->Is<type::F32>() && width >= 1 && width <= 4) {
                 out << "float" << width;
-            } else if (vec->type()->Is<sem::I32>() && width >= 1 && width <= 4) {
+            } else if (vec->type()->Is<type::I32>() && width >= 1 && width <= 4) {
                 out << "int" << width;
-            } else if (vec->type()->Is<sem::U32>() && width >= 1 && width <= 4) {
+            } else if (vec->type()->Is<type::U32>() && width >= 1 && width <= 4) {
                 out << "uint" << width;
-            } else if (vec->type()->Is<sem::Bool>() && width >= 1 && width <= 4) {
+            } else if (vec->type()->Is<type::Bool>() && width >= 1 && width <= 4) {
                 out << "bool" << width;
             } else {
                 // For example, use "vector<float16_t, N>" for f16 vector.
@@ -4107,7 +4107,7 @@
         [&](const sem::Atomic* atomic) {
             return EmitType(out, atomic->Type(), address_space, access, name);
         },
-        [&](const sem::Void*) {
+        [&](const type::Void*) {
             out << "void";
             return true;
         },
diff --git a/src/tint/writer/hlsl/generator_impl_type_test.cc b/src/tint/writer/hlsl/generator_impl_type_test.cc
index b113205..ed85b48 100644
--- a/src/tint/writer/hlsl/generator_impl_type_test.cc
+++ b/src/tint/writer/hlsl/generator_impl_type_test.cc
@@ -84,7 +84,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Type, EmitType_Bool) {
-    auto* bool_ = create<sem::Bool>();
+    auto* bool_ = create<type::Bool>();
 
     GeneratorImpl& gen = Build();
 
@@ -95,7 +95,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Type, EmitType_F16) {
-    auto* f16 = create<sem::F16>();
+    auto* f16 = create<type::F16>();
 
     GeneratorImpl& gen = Build();
 
@@ -106,7 +106,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Type, EmitType_F32) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
 
     GeneratorImpl& gen = Build();
 
@@ -117,7 +117,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Type, EmitType_I32) {
-    auto* i32 = create<sem::I32>();
+    auto* i32 = create<type::I32>();
 
     GeneratorImpl& gen = Build();
 
@@ -128,7 +128,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Type, EmitType_Matrix_F16) {
-    auto* f16 = create<sem::F16>();
+    auto* f16 = create<type::F16>();
     auto* vec3 = create<sem::Vector>(f16, 3u);
     auto* mat2x3 = create<sem::Matrix>(vec3, 2u);
 
@@ -141,7 +141,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Type, EmitType_Matrix_F32) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* vec3 = create<sem::Vector>(f32, 3u);
     auto* mat2x3 = create<sem::Matrix>(vec3, 2u);
 
@@ -239,7 +239,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Type, EmitType_U32) {
-    auto* u32 = create<sem::U32>();
+    auto* u32 = create<type::U32>();
 
     GeneratorImpl& gen = Build();
 
@@ -250,7 +250,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Type, EmitType_Vector) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* vec3 = create<sem::Vector>(f32, 3u);
 
     GeneratorImpl& gen = Build();
@@ -262,7 +262,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Type, EmitType_Void) {
-    auto* void_ = create<sem::Void>();
+    auto* void_ = create<type::Void>();
 
     GeneratorImpl& gen = Build();
 
@@ -493,7 +493,7 @@
                              }));
 
 TEST_F(HlslGeneratorImplTest_Type, EmitMultisampledTexture) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* s = create<type::MultisampledTexture>(ast::TextureDimension::k2d, f32);
 
     GeneratorImpl& gen = Build();
diff --git a/src/tint/writer/msl/generator_impl.cc b/src/tint/writer/msl/generator_impl.cc
index 4126fe0..7b19a26 100644
--- a/src/tint/writer/msl/generator_impl.cc
+++ b/src/tint/writer/msl/generator_impl.cc
@@ -33,13 +33,9 @@
 #include "src/tint/ast/void.h"
 #include "src/tint/sem/array.h"
 #include "src/tint/sem/atomic.h"
-#include "src/tint/sem/bool.h"
 #include "src/tint/sem/call.h"
 #include "src/tint/sem/constant.h"
-#include "src/tint/sem/f16.h"
-#include "src/tint/sem/f32.h"
 #include "src/tint/sem/function.h"
-#include "src/tint/sem/i32.h"
 #include "src/tint/sem/matrix.h"
 #include "src/tint/sem/member_accessor_expression.h"
 #include "src/tint/sem/module.h"
@@ -49,10 +45,8 @@
 #include "src/tint/sem/switch_statement.h"
 #include "src/tint/sem/type_conversion.h"
 #include "src/tint/sem/type_initializer.h"
-#include "src/tint/sem/u32.h"
 #include "src/tint/sem/variable.h"
 #include "src/tint/sem/vector.h"
-#include "src/tint/sem/void.h"
 #include "src/tint/transform/array_length_from_uniform.h"
 #include "src/tint/transform/builtin_polyfill.h"
 #include "src/tint/transform/canonicalize_entry_point_io.h"
@@ -70,11 +64,17 @@
 #include "src/tint/transform/unshadow.h"
 #include "src/tint/transform/vectorize_scalar_matrix_initializers.h"
 #include "src/tint/transform/zero_init_workgroup_memory.h"
+#include "src/tint/type/bool.h"
 #include "src/tint/type/depth_multisampled_texture.h"
 #include "src/tint/type/depth_texture.h"
+#include "src/tint/type/f16.h"
+#include "src/tint/type/f32.h"
+#include "src/tint/type/i32.h"
 #include "src/tint/type/multisampled_texture.h"
 #include "src/tint/type/sampled_texture.h"
 #include "src/tint/type/storage_texture.h"
+#include "src/tint/type/u32.h"
+#include "src/tint/type/void.h"
 #include "src/tint/utils/defer.h"
 #include "src/tint/utils/map.h"
 #include "src/tint/utils/scoped_assignment.h"
@@ -494,18 +494,18 @@
 
     auto signed_type_of = [&](const type::Type* ty) -> const type::Type* {
         if (ty->is_integer_scalar()) {
-            return builder_.create<sem::I32>();
+            return builder_.create<type::I32>();
         } else if (auto* v = ty->As<sem::Vector>()) {
-            return builder_.create<sem::Vector>(builder_.create<sem::I32>(), v->Width());
+            return builder_.create<sem::Vector>(builder_.create<type::I32>(), v->Width());
         }
         return {};
     };
 
     auto unsigned_type_of = [&](const type::Type* ty) -> const type::Type* {
         if (ty->is_integer_scalar()) {
-            return builder_.create<sem::U32>();
+            return builder_.create<type::U32>();
         } else if (auto* v = ty->As<sem::Vector>()) {
-            return builder_.create<sem::Vector>(builder_.create<sem::U32>(), v->Width());
+            return builder_.create<sem::Vector>(builder_.create<type::U32>(), v->Width());
         }
         return {};
     };
@@ -584,7 +584,7 @@
     }
 
     // Handle '&' and '|' of booleans.
-    if ((expr->IsAnd() || expr->IsOr()) && lhs_type->Is<sem::Bool>()) {
+    if ((expr->IsAnd() || expr->IsOr()) && lhs_type->Is<type::Bool>()) {
         out << "bool";
         ScopedParen sp(out);
         if (!EmitExpression(out, expr->lhs)) {
@@ -1612,23 +1612,23 @@
 bool GeneratorImpl::EmitZeroValue(std::ostream& out, const type::Type* type) {
     return Switch(
         type,
-        [&](const sem::Bool*) {
+        [&](const type::Bool*) {
             out << "false";
             return true;
         },
-        [&](const sem::F16*) {
+        [&](const type::F16*) {
             out << "0.0h";
             return true;
         },
-        [&](const sem::F32*) {
+        [&](const type::F32*) {
             out << "0.0f";
             return true;
         },
-        [&](const sem::I32*) {
+        [&](const type::I32*) {
             out << "0";
             return true;
         },
-        [&](const sem::U32*) {
+        [&](const type::U32*) {
             out << "0u";
             return true;
         },
@@ -1661,23 +1661,23 @@
 bool GeneratorImpl::EmitConstant(std::ostream& out, const sem::Constant* constant) {
     return Switch(
         constant->Type(),  //
-        [&](const sem::Bool*) {
+        [&](const type::Bool*) {
             out << (constant->As<AInt>() ? "true" : "false");
             return true;
         },
-        [&](const sem::F32*) {
+        [&](const type::F32*) {
             PrintF32(out, constant->As<float>());
             return true;
         },
-        [&](const sem::F16*) {
+        [&](const type::F16*) {
             PrintF16(out, constant->As<float>());
             return true;
         },
-        [&](const sem::I32*) {
+        [&](const type::I32*) {
             PrintI32(out, constant->As<int32_t>());
             return true;
         },
-        [&](const sem::U32*) {
+        [&](const type::U32*) {
             out << constant->As<AInt>() << "u";
             return true;
         },
@@ -2524,11 +2524,11 @@
     return Switch(
         type,
         [&](const sem::Atomic* atomic) {
-            if (atomic->Type()->Is<sem::I32>()) {
+            if (atomic->Type()->Is<type::I32>()) {
                 out << "atomic_int";
                 return true;
             }
-            if (atomic->Type()->Is<sem::U32>()) {
+            if (atomic->Type()->Is<type::U32>()) {
                 out << "atomic_uint";
                 return true;
             }
@@ -2557,19 +2557,19 @@
             out << ">";
             return true;
         },
-        [&](const sem::Bool*) {
+        [&](const type::Bool*) {
             out << "bool";
             return true;
         },
-        [&](const sem::F16*) {
+        [&](const type::F16*) {
             out << "half";
             return true;
         },
-        [&](const sem::F32*) {
+        [&](const type::F32*) {
             out << "float";
             return true;
         },
-        [&](const sem::I32*) {
+        [&](const type::I32*) {
             out << "int";
             return true;
         },
@@ -2695,7 +2695,7 @@
                     return false;
                 });
         },
-        [&](const sem::U32*) {
+        [&](const type::U32*) {
             out << "uint";
             return true;
         },
@@ -2706,7 +2706,7 @@
             out << vec->Width();
             return true;
         },
-        [&](const sem::Void*) {
+        [&](const type::Void*) {
             out << "void";
             return true;
         },
@@ -3085,16 +3085,16 @@
 
         // https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf
         // 2.1 Scalar Data Types
-        [&](const sem::U32*) {
+        [&](const type::U32*) {
             return SizeAndAlign{4, 4};
         },
-        [&](const sem::I32*) {
+        [&](const type::I32*) {
             return SizeAndAlign{4, 4};
         },
-        [&](const sem::F32*) {
+        [&](const type::F32*) {
             return SizeAndAlign{4, 4};
         },
-        [&](const sem::F16*) {
+        [&](const type::F16*) {
             return SizeAndAlign{2, 2};
         },
 
@@ -3102,7 +3102,7 @@
             auto num_els = vec->Width();
             auto* el_ty = vec->type();
             SizeAndAlign el_size_align = MslPackedTypeSizeAndAlign(el_ty);
-            if (el_ty->IsAnyOf<sem::U32, sem::I32, sem::F32, sem::F16>()) {
+            if (el_ty->IsAnyOf<type::U32, type::I32, type::F32, type::F16>()) {
                 // Use a packed_vec type for 3-element vectors only.
                 if (num_els == 3) {
                     // https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf
@@ -3127,7 +3127,7 @@
             auto rows = mat->rows();
             auto* el_ty = mat->type();
             // Metal only support half and float matrix.
-            if (el_ty->IsAnyOf<sem::F32, sem::F16>()) {
+            if (el_ty->IsAnyOf<type::F32, type::F16>()) {
                 static constexpr SizeAndAlign table_f32[] = {
                     /* float2x2 */ {16, 8},
                     /* float2x3 */ {32, 16},
@@ -3151,7 +3151,7 @@
                     /* half4x4 */ {32, 8},
                 };
                 if (cols >= 2 && cols <= 4 && rows >= 2 && rows <= 4) {
-                    if (el_ty->Is<sem::F32>()) {
+                    if (el_ty->Is<type::F32>()) {
                         return table_f32[(3 * (cols - 2)) + (rows - 2)];
                     } else {
                         return table_f16[(3 * (cols - 2)) + (rows - 2)];
diff --git a/src/tint/writer/msl/generator_impl_type_test.cc b/src/tint/writer/msl/generator_impl_type_test.cc
index 0ea3bba..c7d62e0 100644
--- a/src/tint/writer/msl/generator_impl_type_test.cc
+++ b/src/tint/writer/msl/generator_impl_type_test.cc
@@ -146,7 +146,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_Bool) {
-    auto* bool_ = create<sem::Bool>();
+    auto* bool_ = create<type::Bool>();
 
     GeneratorImpl& gen = Build();
 
@@ -156,7 +156,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_F32) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
 
     GeneratorImpl& gen = Build();
 
@@ -166,7 +166,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_F16) {
-    auto* f16 = create<sem::F16>();
+    auto* f16 = create<type::F16>();
 
     GeneratorImpl& gen = Build();
 
@@ -176,7 +176,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_I32) {
-    auto* i32 = create<sem::I32>();
+    auto* i32 = create<type::I32>();
 
     GeneratorImpl& gen = Build();
 
@@ -186,7 +186,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_Matrix_F32) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* vec3 = create<sem::Vector>(f32, 3u);
     auto* mat2x3 = create<sem::Matrix>(vec3, 2u);
 
@@ -198,7 +198,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_Matrix_F16) {
-    auto* f16 = create<sem::F16>();
+    auto* f16 = create<type::F16>();
     auto* vec3 = create<sem::Vector>(f16, 3u);
     auto* mat2x3 = create<sem::Matrix>(vec3, 2u);
 
@@ -210,7 +210,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_Pointer) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* p = create<sem::Pointer>(f32, ast::AddressSpace::kWorkgroup, ast::Access::kReadWrite);
 
     GeneratorImpl& gen = Build();
@@ -699,7 +699,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_U32) {
-    auto* u32 = create<sem::U32>();
+    auto* u32 = create<type::U32>();
 
     GeneratorImpl& gen = Build();
 
@@ -709,7 +709,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_Vector) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* vec3 = create<sem::Vector>(f32, 3u);
 
     GeneratorImpl& gen = Build();
@@ -720,7 +720,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_Void) {
-    auto* void_ = create<sem::Void>();
+    auto* void_ = create<type::Void>();
 
     GeneratorImpl& gen = Build();
 
@@ -803,7 +803,7 @@
 TEST_P(MslSampledtexturesTest, Emit) {
     auto params = GetParam();
 
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* s = create<type::SampledTexture>(params.dim, f32);
 
     GeneratorImpl& gen = Build();
@@ -825,7 +825,7 @@
                        "texturecube_array<float, access::sample>"}));
 
 TEST_F(MslGeneratorImplTest, Emit_TypeMultisampledTexture) {
-    auto* u32 = create<sem::U32>();
+    auto* u32 = create<type::U32>();
     auto* ms = create<type::MultisampledTexture>(ast::TextureDimension::k2d, u32);
 
     GeneratorImpl& gen = Build();
diff --git a/src/tint/writer/spirv/builder.cc b/src/tint/writer/spirv/builder.cc
index caa575f..3b9b177 100644
--- a/src/tint/writer/spirv/builder.cc
+++ b/src/tint/writer/spirv/builder.cc
@@ -631,7 +631,7 @@
     }
 
     if (InsideBasicBlock()) {
-        if (func->ReturnType()->Is<sem::Void>()) {
+        if (func->ReturnType()->Is<type::Void>()) {
             push_function_inst(spv::Op::OpReturn, {});
         } else {
             auto zero = GenerateConstantNullIfNeeded(func->ReturnType());
@@ -1484,20 +1484,20 @@
     auto* from_type = TypeOf(from_expr)->UnwrapRef();
 
     spv::Op op = spv::Op::OpNop;
-    if ((from_type->Is<sem::I32>() && to_type->is_float_scalar()) ||
+    if ((from_type->Is<type::I32>() && to_type->is_float_scalar()) ||
         (from_type->is_signed_integer_vector() && to_type->is_float_vector())) {
         op = spv::Op::OpConvertSToF;
-    } else if ((from_type->Is<sem::U32>() && to_type->is_float_scalar()) ||
+    } else if ((from_type->Is<type::U32>() && to_type->is_float_scalar()) ||
                (from_type->is_unsigned_integer_vector() && to_type->is_float_vector())) {
         op = spv::Op::OpConvertUToF;
-    } else if ((from_type->is_float_scalar() && to_type->Is<sem::I32>()) ||
+    } else if ((from_type->is_float_scalar() && to_type->Is<type::I32>()) ||
                (from_type->is_float_vector() && to_type->is_signed_integer_vector())) {
         op = spv::Op::OpConvertFToS;
-    } else if ((from_type->is_float_scalar() && to_type->Is<sem::U32>()) ||
+    } else if ((from_type->is_float_scalar() && to_type->Is<type::U32>()) ||
                (from_type->is_float_vector() && to_type->is_unsigned_integer_vector())) {
         op = spv::Op::OpConvertFToU;
-    } else if (from_type
-                   ->IsAnyOf<sem::Bool, sem::F32, sem::I32, sem::U32, sem::F16, sem::Vector>() &&
+    } else if (from_type->IsAnyOf<type::Bool, type::F32, type::I32, type::U32, type::F16,
+                                  sem::Vector>() &&
                from_type == to_type) {
         // Identity initializer for scalar and vector types
         return val_id;
@@ -1509,13 +1509,13 @@
         // and to_type being the same floating point scalar or vector type, i.e. identity
         // initializer, is already handled in the previous else-if clause.
         op = spv::Op::OpFConvert;
-    } else if ((from_type->Is<sem::I32>() && to_type->Is<sem::U32>()) ||
-               (from_type->Is<sem::U32>() && to_type->Is<sem::I32>()) ||
+    } else if ((from_type->Is<type::I32>() && to_type->Is<type::U32>()) ||
+               (from_type->Is<type::U32>() && to_type->Is<type::I32>()) ||
                (from_type->is_signed_integer_vector() && to_type->is_unsigned_integer_vector()) ||
                (from_type->is_unsigned_integer_vector() &&
                 to_type->is_integer_scalar_or_vector())) {
         op = spv::Op::OpBitcast;
-    } else if ((from_type->is_numeric_scalar() && to_type->Is<sem::Bool>()) ||
+    } else if ((from_type->is_numeric_scalar() && to_type->Is<type::Bool>()) ||
                (from_type->is_numeric_vector() && to_type->is_bool_vector())) {
         // Convert scalar (vector) to bool (vector)
 
@@ -1536,16 +1536,16 @@
         const auto* to_elem_type = elem_type_of(to_type);
         uint32_t one_id;
         uint32_t zero_id;
-        if (to_elem_type->Is<sem::F32>()) {
+        if (to_elem_type->Is<type::F32>()) {
             zero_id = GenerateConstantIfNeeded(ScalarConstant::F32(0));
             one_id = GenerateConstantIfNeeded(ScalarConstant::F32(1));
-        } else if (to_elem_type->Is<sem::F16>()) {
+        } else if (to_elem_type->Is<type::F16>()) {
             zero_id = GenerateConstantIfNeeded(ScalarConstant::F16(0));
             one_id = GenerateConstantIfNeeded(ScalarConstant::F16(1));
-        } else if (to_elem_type->Is<sem::U32>()) {
+        } else if (to_elem_type->Is<type::U32>()) {
             zero_id = GenerateConstantIfNeeded(ScalarConstant::U32(0));
             one_id = GenerateConstantIfNeeded(ScalarConstant::U32(1));
-        } else if (to_elem_type->Is<sem::I32>()) {
+        } else if (to_elem_type->Is<type::I32>()) {
             zero_id = GenerateConstantIfNeeded(ScalarConstant::I32(0));
             one_id = GenerateConstantIfNeeded(ScalarConstant::I32(1));
         } else {
@@ -1680,23 +1680,23 @@
 
     return Switch(
         ty,  //
-        [&](const sem::Bool*) {
+        [&](const type::Bool*) {
             bool val = constant->As<bool>();
             return GenerateConstantIfNeeded(ScalarConstant::Bool(val));
         },
-        [&](const sem::F32*) {
+        [&](const type::F32*) {
             auto val = constant->As<f32>();
             return GenerateConstantIfNeeded(ScalarConstant::F32(val.value));
         },
-        [&](const sem::F16*) {
+        [&](const type::F16*) {
             auto val = constant->As<f16>();
             return GenerateConstantIfNeeded(ScalarConstant::F16(val.value));
         },
-        [&](const sem::I32*) {
+        [&](const type::I32*) {
             auto val = constant->As<i32>();
             return GenerateConstantIfNeeded(ScalarConstant::I32(val.value));
         },
-        [&](const sem::U32*) {
+        [&](const type::U32*) {
             auto val = constant->As<u32>();
             return GenerateConstantIfNeeded(ScalarConstant::U32(val.value));
         },
@@ -1727,23 +1727,23 @@
 
     switch (constant.kind) {
         case ScalarConstant::Kind::kU32: {
-            type_id = GenerateTypeIfNeeded(builder_.create<sem::U32>());
+            type_id = GenerateTypeIfNeeded(builder_.create<type::U32>());
             break;
         }
         case ScalarConstant::Kind::kI32: {
-            type_id = GenerateTypeIfNeeded(builder_.create<sem::I32>());
+            type_id = GenerateTypeIfNeeded(builder_.create<type::I32>());
             break;
         }
         case ScalarConstant::Kind::kF32: {
-            type_id = GenerateTypeIfNeeded(builder_.create<sem::F32>());
+            type_id = GenerateTypeIfNeeded(builder_.create<type::F32>());
             break;
         }
         case ScalarConstant::Kind::kF16: {
-            type_id = GenerateTypeIfNeeded(builder_.create<sem::F16>());
+            type_id = GenerateTypeIfNeeded(builder_.create<type::F16>());
             break;
         }
         case ScalarConstant::Kind::kBool: {
-            type_id = GenerateTypeIfNeeded(builder_.create<sem::Bool>());
+            type_id = GenerateTypeIfNeeded(builder_.create<type::Bool>());
             break;
         }
     }
@@ -2349,14 +2349,14 @@
 
     switch (builtin->Type()) {
         case BuiltinType::kAny:
-            if (builtin->Parameters()[0]->Type()->Is<sem::Bool>()) {
+            if (builtin->Parameters()[0]->Type()->Is<type::Bool>()) {
                 // any(v: bool) just resolves to v.
                 return get_arg_as_value_id(0);
             }
             op = spv::Op::OpAny;
             break;
         case BuiltinType::kAll:
-            if (builtin->Parameters()[0]->Type()->Is<sem::Bool>()) {
+            if (builtin->Parameters()[0]->Type()->Is<type::Bool>()) {
                 // all(v: bool) just resolves to v.
                 return get_arg_as_value_id(0);
             }
@@ -2525,7 +2525,7 @@
             // TODO(jrprice): If we're targeting SPIR-V 1.4, we don't need to do this.
             auto* result_vector_type = builtin->ReturnType()->As<sem::Vector>();
             if (result_vector_type && builtin->Parameters()[2]->Type()->is_scalar()) {
-                auto* bool_vec_ty = builder_.create<sem::Vector>(builder_.create<sem::Bool>(),
+                auto* bool_vec_ty = builder_.create<sem::Vector>(builder_.create<type::Bool>(),
                                                                  result_vector_type->Width());
                 if (!GenerateTypeIfNeeded(bool_vec_ty)) {
                     return 0;
@@ -2686,7 +2686,7 @@
     // to calling append_result_type_and_id_to_spirv_params().
     auto append_result_type_and_id_to_spirv_params_for_read = [&]() {
         if (texture_type->IsAnyOf<type::DepthTexture, type::DepthMultisampledTexture>()) {
-            auto* f32 = builder_.create<sem::F32>();
+            auto* f32 = builder_.create<type::F32>();
             auto* spirv_result_type = builder_.create<sem::Vector>(f32, 4u);
             auto spirv_result = result_op();
             post_emission = [=] {
@@ -2940,10 +2940,10 @@
                 return false;
             }
             auto level = Operand(0u);
-            if (arg(Usage::kLevel)->Type()->UnwrapRef()->IsAnyOf<sem::I32, sem::U32>()) {
+            if (arg(Usage::kLevel)->Type()->UnwrapRef()->IsAnyOf<type::I32, type::U32>()) {
                 // Depth textures have i32 or u32 parameters for the level, but SPIR-V expects f32.
                 // Cast.
-                auto f32_type_id = GenerateTypeIfNeeded(builder_.create<sem::F32>());
+                auto f32_type_id = GenerateTypeIfNeeded(builder_.create<type::F32>());
                 if (f32_type_id == 0) {
                     return 0;
                 }
@@ -3068,7 +3068,7 @@
                                     const sem::Builtin* builtin,
                                     Operand result_type,
                                     Operand result_id) {
-    auto is_value_signed = [&] { return builtin->Parameters()[1]->Type()->Is<sem::I32>(); };
+    auto is_value_signed = [&] { return builtin->Parameters()[1]->Type()->Is<type::I32>(); };
 
     auto address_space = builtin->Parameters()[0]->Type()->As<sem::Pointer>()->AddressSpace();
 
@@ -3219,7 +3219,7 @@
                 return false;
             }
 
-            auto* bool_sem_ty = builder_.create<sem::Bool>();
+            auto* bool_sem_ty = builder_.create<type::Bool>();
             auto bool_type = GenerateTypeIfNeeded(bool_sem_ty);
             if (bool_type == 0) {
                 return false;
@@ -3282,7 +3282,7 @@
     // Using anything other than 0 is problematic on various Vulkan drivers.
     if (auto* depthTextureType = texture_type->As<type::DepthTexture>()) {
         texture_type = builder_.create<type::SampledTexture>(depthTextureType->dim(),
-                                                             builder_.create<sem::F32>());
+                                                             builder_.create<type::F32>());
     }
 
     uint32_t sampled_image_type_id =
@@ -3647,10 +3647,10 @@
     // Using anything other than 0 is problematic on various Vulkan drivers.
     if (auto* depthTextureType = type->As<type::DepthTexture>()) {
         type = builder_.create<type::SampledTexture>(depthTextureType->dim(),
-                                                     builder_.create<sem::F32>());
+                                                     builder_.create<type::F32>());
     } else if (auto* multisampledDepthTextureType = type->As<type::DepthMultisampledTexture>()) {
         type = builder_.create<type::MultisampledTexture>(multisampledDepthTextureType->dim(),
-                                                          builder_.create<sem::F32>());
+                                                          builder_.create<type::F32>());
     }
 
     // Pointers and references with differing accesses should not result in a
@@ -3676,19 +3676,19 @@
             [&](const sem::Array* arr) {  //
                 return GenerateArrayType(arr, result);
             },
-            [&](const sem::Bool*) {
+            [&](const type::Bool*) {
                 push_type(spv::Op::OpTypeBool, {result});
                 return true;
             },
-            [&](const sem::F32*) {
+            [&](const type::F32*) {
                 push_type(spv::Op::OpTypeFloat, {result, Operand(32u)});
                 return true;
             },
-            [&](const sem::F16*) {
+            [&](const type::F16*) {
                 push_type(spv::Op::OpTypeFloat, {result, Operand(16u)});
                 return true;
             },
-            [&](const sem::I32*) {
+            [&](const type::I32*) {
                 push_type(spv::Op::OpTypeInt, {result, Operand(32u), Operand(1u)});
                 return true;
             },
@@ -3704,14 +3704,14 @@
             [&](const sem::Struct* str) {  //
                 return GenerateStructType(str, result);
             },
-            [&](const sem::U32*) {
+            [&](const type::U32*) {
                 push_type(spv::Op::OpTypeInt, {result, Operand(32u), Operand(0u)});
                 return true;
             },
             [&](const sem::Vector* vec) {  //
                 return GenerateVectorType(vec, result);
             },
-            [&](const sem::Void*) {
+            [&](const type::Void*) {
                 push_type(spv::Op::OpTypeVoid, {result});
                 return true;
             },
@@ -3812,10 +3812,10 @@
     uint32_t type_id = Switch(
         texture,
         [&](const type::DepthTexture*) {
-            return GenerateTypeIfNeeded(builder_.create<sem::F32>());
+            return GenerateTypeIfNeeded(builder_.create<type::F32>());
         },
         [&](const type::DepthMultisampledTexture*) {
-            return GenerateTypeIfNeeded(builder_.create<sem::F32>());
+            return GenerateTypeIfNeeded(builder_.create<type::F32>());
         },
         [&](const type::SampledTexture* t) { return GenerateTypeIfNeeded(t->type()); },
         [&](const type::MultisampledTexture* t) { return GenerateTypeIfNeeded(t->type()); },
diff --git a/src/tint/writer/spirv/builder_entry_point_test.cc b/src/tint/writer/spirv/builder_entry_point_test.cc
index 4cdebf2..3527ea9 100644
--- a/src/tint/writer/spirv/builder_entry_point_test.cc
+++ b/src/tint/writer/spirv/builder_entry_point_test.cc
@@ -23,8 +23,8 @@
 #include "src/tint/ast/stage_attribute.h"
 #include "src/tint/ast/variable.h"
 #include "src/tint/program.h"
-#include "src/tint/sem/f32.h"
 #include "src/tint/sem/vector.h"
+#include "src/tint/type/f32.h"
 #include "src/tint/writer/spirv/builder.h"
 #include "src/tint/writer/spirv/spv_dump.h"
 #include "src/tint/writer/spirv/test_helper.h"
diff --git a/src/tint/writer/spirv/builder_type_test.cc b/src/tint/writer/spirv/builder_type_test.cc
index 74d6cbc..ca0aa47 100644
--- a/src/tint/writer/spirv/builder_type_test.cc
+++ b/src/tint/writer/spirv/builder_type_test.cc
@@ -114,7 +114,7 @@
 }
 
 TEST_F(BuilderTest_Type, GenerateBool) {
-    auto* bool_ = create<sem::Bool>();
+    auto* bool_ = create<type::Bool>();
 
     spirv::Builder& b = Build();
 
@@ -128,8 +128,8 @@
 }
 
 TEST_F(BuilderTest_Type, ReturnsGeneratedBool) {
-    auto* bool_ = create<sem::Bool>();
-    auto* i32 = create<sem::I32>();
+    auto* bool_ = create<type::Bool>();
+    auto* i32 = create<type::I32>();
 
     spirv::Builder& b = Build();
 
@@ -142,7 +142,7 @@
 }
 
 TEST_F(BuilderTest_Type, GenerateF32) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
 
     spirv::Builder& b = Build();
 
@@ -156,8 +156,8 @@
 }
 
 TEST_F(BuilderTest_Type, ReturnsGeneratedF32) {
-    auto* f32 = create<sem::F32>();
-    auto* i32 = create<sem::I32>();
+    auto* f32 = create<type::F32>();
+    auto* i32 = create<type::I32>();
 
     spirv::Builder& b = Build();
 
@@ -170,7 +170,7 @@
 }
 
 TEST_F(BuilderTest_Type, GenerateF16) {
-    auto* f16 = create<sem::F16>();
+    auto* f16 = create<type::F16>();
 
     spirv::Builder& b = Build();
 
@@ -184,8 +184,8 @@
 }
 
 TEST_F(BuilderTest_Type, ReturnsGeneratedF16) {
-    auto* f16 = create<sem::F16>();
-    auto* i32 = create<sem::I32>();
+    auto* f16 = create<type::F16>();
+    auto* i32 = create<type::I32>();
 
     spirv::Builder& b = Build();
 
@@ -198,7 +198,7 @@
 }
 
 TEST_F(BuilderTest_Type, GenerateI32) {
-    auto* i32 = create<sem::I32>();
+    auto* i32 = create<type::I32>();
 
     spirv::Builder& b = Build();
 
@@ -212,8 +212,8 @@
 }
 
 TEST_F(BuilderTest_Type, ReturnsGeneratedI32) {
-    auto* f32 = create<sem::F32>();
-    auto* i32 = create<sem::I32>();
+    auto* f32 = create<type::F32>();
+    auto* i32 = create<type::I32>();
 
     spirv::Builder& b = Build();
 
@@ -226,7 +226,7 @@
 }
 
 TEST_F(BuilderTest_Type, GenerateMatrix) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* vec3 = create<sem::Vector>(f32, 3u);
     auto* mat2x3 = create<sem::Matrix>(vec3, 2u);
 
@@ -244,7 +244,7 @@
 }
 
 TEST_F(BuilderTest_Type, ReturnsGeneratedMatrix) {
-    auto* i32 = create<sem::I32>();
+    auto* i32 = create<type::I32>();
     auto* col = create<sem::Vector>(i32, 4u);
     auto* mat = create<sem::Matrix>(col, 3u);
 
@@ -259,7 +259,7 @@
 }
 
 TEST_F(BuilderTest_Type, GenerateF16Matrix) {
-    auto* f16 = create<sem::F16>();
+    auto* f16 = create<type::F16>();
     auto* vec3 = create<sem::Vector>(f16, 3u);
     auto* mat2x3 = create<sem::Matrix>(vec3, 2u);
 
@@ -277,7 +277,7 @@
 }
 
 TEST_F(BuilderTest_Type, ReturnsGeneratedF16Matrix) {
-    auto* f16 = create<sem::F16>();
+    auto* f16 = create<type::F16>();
     auto* col = create<sem::Vector>(f16, 4u);
     auto* mat = create<sem::Matrix>(col, 3u);
 
@@ -292,7 +292,7 @@
 }
 
 TEST_F(BuilderTest_Type, GeneratePtr) {
-    auto* i32 = create<sem::I32>();
+    auto* i32 = create<type::I32>();
     auto* ptr = create<sem::Pointer>(i32, ast::AddressSpace::kOut, ast::Access::kReadWrite);
 
     spirv::Builder& b = Build();
@@ -307,7 +307,7 @@
 }
 
 TEST_F(BuilderTest_Type, ReturnsGeneratedPtr) {
-    auto* i32 = create<sem::I32>();
+    auto* i32 = create<type::I32>();
     auto* ptr = create<sem::Pointer>(i32, ast::AddressSpace::kOut, ast::Access::kReadWrite);
 
     spirv::Builder& b = Build();
@@ -517,7 +517,7 @@
 }
 
 TEST_F(BuilderTest_Type, GenerateU32) {
-    auto* u32 = create<sem::U32>();
+    auto* u32 = create<type::U32>();
 
     spirv::Builder& b = Build();
 
@@ -531,8 +531,8 @@
 }
 
 TEST_F(BuilderTest_Type, ReturnsGeneratedU32) {
-    auto* u32 = create<sem::U32>();
-    auto* f32 = create<sem::F32>();
+    auto* u32 = create<type::U32>();
+    auto* f32 = create<type::F32>();
 
     spirv::Builder& b = Build();
 
@@ -545,7 +545,7 @@
 }
 
 TEST_F(BuilderTest_Type, GenerateVector) {
-    auto* vec = create<sem::Vector>(create<sem::F32>(), 3u);
+    auto* vec = create<sem::Vector>(create<type::F32>(), 3u);
 
     spirv::Builder& b = Build();
 
@@ -560,7 +560,7 @@
 }
 
 TEST_F(BuilderTest_Type, ReturnsGeneratedVector) {
-    auto* i32 = create<sem::I32>();
+    auto* i32 = create<type::I32>();
     auto* vec = create<sem::Vector>(i32, 3u);
 
     spirv::Builder& b = Build();
@@ -574,7 +574,7 @@
 }
 
 TEST_F(BuilderTest_Type, GenerateVoid) {
-    auto* void_ = create<sem::Void>();
+    auto* void_ = create<type::Void>();
 
     spirv::Builder& b = Build();
 
@@ -588,8 +588,8 @@
 }
 
 TEST_F(BuilderTest_Type, ReturnsGeneratedVoid) {
-    auto* void_ = create<sem::Void>();
-    auto* i32 = create<sem::I32>();
+    auto* void_ = create<type::Void>();
+    auto* i32 = create<type::I32>();
 
     spirv::Builder& b = Build();
 
@@ -691,7 +691,7 @@
 }
 
 TEST_F(BuilderTest_Type, MultisampledTexture_Generate_2d_i32) {
-    auto* i32 = create<sem::I32>();
+    auto* i32 = create<type::I32>();
     auto* ms = create<type::MultisampledTexture>(ast::TextureDimension::k2d, i32);
 
     spirv::Builder& b = Build();
@@ -704,7 +704,7 @@
 }
 
 TEST_F(BuilderTest_Type, MultisampledTexture_Generate_2d_u32) {
-    auto* u32 = create<sem::U32>();
+    auto* u32 = create<type::U32>();
     auto* ms = create<type::MultisampledTexture>(ast::TextureDimension::k2d, u32);
 
     spirv::Builder& b = Build();
@@ -718,7 +718,7 @@
 }
 
 TEST_F(BuilderTest_Type, MultisampledTexture_Generate_2d_f32) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* ms = create<type::MultisampledTexture>(ast::TextureDimension::k2d, f32);
 
     spirv::Builder& b = Build();
@@ -732,7 +732,7 @@
 }
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_1d_i32) {
-    auto* s = create<type::SampledTexture>(ast::TextureDimension::k1d, create<sem::I32>());
+    auto* s = create<type::SampledTexture>(ast::TextureDimension::k1d, create<type::I32>());
 
     spirv::Builder& b = Build();
 
@@ -749,7 +749,7 @@
 }
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_1d_u32) {
-    auto* u32 = create<sem::U32>();
+    auto* u32 = create<type::U32>();
     auto* s = create<type::SampledTexture>(ast::TextureDimension::k1d, u32);
 
     spirv::Builder& b = Build();
@@ -767,7 +767,7 @@
 }
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_1d_f32) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* s = create<type::SampledTexture>(ast::TextureDimension::k1d, f32);
 
     spirv::Builder& b = Build();
@@ -785,7 +785,7 @@
 }
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_2d) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* s = create<type::SampledTexture>(ast::TextureDimension::k2d, f32);
 
     spirv::Builder& b = Build();
@@ -799,7 +799,7 @@
 }
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_2d_array) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* s = create<type::SampledTexture>(ast::TextureDimension::k2dArray, f32);
 
     spirv::Builder& b = Build();
@@ -813,7 +813,7 @@
 }
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_3d) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* s = create<type::SampledTexture>(ast::TextureDimension::k3d, f32);
 
     spirv::Builder& b = Build();
@@ -827,7 +827,7 @@
 }
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_Cube) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* s = create<type::SampledTexture>(ast::TextureDimension::kCube, f32);
 
     spirv::Builder& b = Build();
@@ -842,7 +842,7 @@
 }
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_CubeArray) {
-    auto* f32 = create<sem::F32>();
+    auto* f32 = create<type::F32>();
     auto* s = create<type::SampledTexture>(ast::TextureDimension::kCubeArray, f32);
 
     spirv::Builder& b = Build();