diff --git a/src/tint/cmd/generate_external_texture_bindings.cc b/src/tint/cmd/generate_external_texture_bindings.cc
index d9ddb73..891435e 100644
--- a/src/tint/cmd/generate_external_texture_bindings.cc
+++ b/src/tint/cmd/generate_external_texture_bindings.cc
@@ -39,7 +39,7 @@
                 auto& n = group_to_next_binding_number[bp->group];
                 n = std::max(n, bp->binding + 1);
 
-                if (sem_var->Type()->UnwrapRef()->Is<type::ExternalTexture>()) {
+                if (sem_var->Type()->UnwrapRef()->Is<core::type::ExternalTexture>()) {
                     ext_tex_bps.emplace_back(*bp);
                 }
             }
diff --git a/src/tint/cmd/info.cc b/src/tint/cmd/info.cc
index 34593f2..76a9f3d 100644
--- a/src/tint/cmd/info.cc
+++ b/src/tint/cmd/info.cc
@@ -224,10 +224,10 @@
 
     bool struct_first = true;
     for (const auto* ty : program->Types()) {
-        if (!ty->Is<tint::type::Struct>()) {
+        if (!ty->Is<tint::core::type::Struct>()) {
             continue;
         }
-        const auto* s = ty->As<tint::type::Struct>();
+        const auto* s = ty->As<tint::core::type::Struct>();
 
         if (!struct_first) {
             std::cout << ",";
@@ -291,7 +291,7 @@
 
     bool has_struct = false;
     for (const auto* ty : program->Types()) {
-        if (!ty->Is<tint::type::Struct>()) {
+        if (!ty->Is<tint::core::type::Struct>()) {
             continue;
         }
         has_struct = true;
@@ -301,10 +301,10 @@
     if (has_struct) {
         std::cout << "Structures" << std::endl;
         for (const auto* ty : program->Types()) {
-            if (!ty->Is<tint::type::Struct>()) {
+            if (!ty->Is<tint::core::type::Struct>()) {
                 continue;
             }
-            const auto* s = ty->As<tint::type::Struct>();
+            const auto* s = ty->As<tint::core::type::Struct>();
             std::cout << s->Layout() << std::endl << std::endl;
         }
     }
diff --git a/src/tint/fuzzers/tint_ast_clone_fuzzer.cc b/src/tint/fuzzers/tint_ast_clone_fuzzer.cc
index 7b5f870..cb571ed 100644
--- a/src/tint/fuzzers/tint_ast_clone_fuzzer.cc
+++ b/src/tint/fuzzers/tint_ast_clone_fuzzer.cc
@@ -74,7 +74,7 @@
     for (auto* src_node : src.ASTNodes().Objects()) {
         src_nodes.emplace(src_node);
     }
-    std::unordered_set<const tint::type::Type*> src_types;
+    std::unordered_set<const tint::core::type::Type*> src_types;
     for (auto* src_type : src.Types()) {
         src_types.emplace(src_type);
     }
diff --git a/src/tint/fuzzers/tint_ast_fuzzer/mutation_finders/change_unary_operators.cc b/src/tint/fuzzers/tint_ast_fuzzer/mutation_finders/change_unary_operators.cc
index 6e2a4c6..39f1e131 100644
--- a/src/tint/fuzzers/tint_ast_fuzzer/mutation_finders/change_unary_operators.cc
+++ b/src/tint/fuzzers/tint_ast_fuzzer/mutation_finders/change_unary_operators.cc
@@ -42,8 +42,9 @@
 
         // Get the type of the unary expression.
         const auto* type = program.Sem().Get(unary_expr)->Type();
-        const auto* basic_type =
-            type->Is<type::Reference>() ? type->As<type::Reference>()->StoreType() : type;
+        const auto* basic_type = type->Is<core::type::Reference>()
+                                     ? type->As<core::type::Reference>()->StoreType()
+                                     : type;
 
         // Only signed integer or vector of signed integer can be mutated.
         if (!basic_type->is_signed_integer_scalar_or_vector()) {
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 6b554ef..ae07736 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
@@ -24,7 +24,7 @@
 
 namespace {
 
-bool IsSuitableForShift(const type::Type* lhs_type, const type::Type* rhs_type) {
+bool IsSuitableForShift(const core::type::Type* lhs_type, const core::type::Type* rhs_type) {
     // `a << b` requires b to be an unsigned scalar or vector, and `a` to be an
     // integer scalar or vector with the same width as `b`. Similar for `a >> b`.
 
@@ -37,8 +37,8 @@
     return false;
 }
 
-bool CanReplaceAddSubtractWith(const type::Type* lhs_type,
-                               const type::Type* rhs_type,
+bool CanReplaceAddSubtractWith(const core::type::Type* lhs_type,
+                               const core::type::Type* rhs_type,
                                core::BinaryOp new_operator) {
     // The program is assumed to be well-typed, so this method determines when
     // 'new_operator' can be used as a type-preserving replacement in an '+' or
@@ -71,8 +71,8 @@
     }
 }
 
-bool CanReplaceMultiplyWith(const type::Type* lhs_type,
-                            const type::Type* rhs_type,
+bool CanReplaceMultiplyWith(const core::type::Type* lhs_type,
+                            const core::type::Type* rhs_type,
                             core::BinaryOp new_operator) {
     // The program is assumed to be well-typed, so this method determines when
     // 'new_operator' can be used as a type-preserving replacement in a '*'
@@ -107,8 +107,8 @@
     }
 }
 
-bool CanReplaceDivideOrModuloWith(const type::Type* lhs_type,
-                                  const type::Type* rhs_type,
+bool CanReplaceDivideOrModuloWith(const core::type::Type* lhs_type,
+                                  const core::type::Type* rhs_type,
                                   core::BinaryOp new_operator) {
     // The program is assumed to be well-typed, so this method determines when
     // 'new_operator' can be used as a type-preserving replacement in a '/'
@@ -149,8 +149,8 @@
     }
 }
 
-bool CanReplaceAndOrWith(const type::Type* lhs_type,
-                         const type::Type* rhs_type,
+bool CanReplaceAndOrWith(const core::type::Type* lhs_type,
+                         const core::type::Type* rhs_type,
                          core::BinaryOp new_operator) {
     switch (new_operator) {
         case core::BinaryOp::kAnd:
@@ -173,7 +173,7 @@
         case core::BinaryOp::kLogicalOr:
             // '&' and '|' can be applied to booleans, and for boolean scalar
             // scalar contexts, their logical counterparts work.
-            return lhs_type->Is<type::Bool>();
+            return lhs_type->Is<core::type::Bool>();
         case core::BinaryOp::kEqual:
         case core::BinaryOp::kNotEqual:
             // '&' and '|' can be applied to booleans, and in these contexts equality
@@ -184,8 +184,8 @@
     }
 }
 
-bool CanReplaceXorWith(const type::Type* lhs_type,
-                       const type::Type* rhs_type,
+bool CanReplaceXorWith(const core::type::Type* lhs_type,
+                       const core::type::Type* rhs_type,
                        core::BinaryOp new_operator) {
     switch (new_operator) {
         case core::BinaryOp::kAdd:
@@ -207,8 +207,8 @@
     }
 }
 
-bool CanReplaceShiftLeftShiftRightWith(const type::Type* lhs_type,
-                                       const type::Type* rhs_type,
+bool CanReplaceShiftLeftShiftRightWith(const core::type::Type* lhs_type,
+                                       const core::type::Type* rhs_type,
                                        core::BinaryOp new_operator) {
     switch (new_operator) {
         case core::BinaryOp::kShiftLeft:
@@ -232,7 +232,7 @@
     }
 }
 
-bool CanReplaceEqualNotEqualWith(const type::Type* lhs_type, core::BinaryOp new_operator) {
+bool CanReplaceEqualNotEqualWith(const core::type::Type* lhs_type, core::BinaryOp new_operator) {
     switch (new_operator) {
         case core::BinaryOp::kEqual:
         case core::BinaryOp::kNotEqual:
@@ -249,7 +249,7 @@
         case core::BinaryOp::kLogicalOr:
             // An equality comparison between boolean scalars can be turned into a
             // logical operation.
-            return lhs_type->Is<type::Bool>();
+            return lhs_type->Is<core::type::Bool>();
         case core::BinaryOp::kAnd:
         case core::BinaryOp::kOr:
             // An equality comparison between boolean scalars or vectors can be turned
@@ -301,10 +301,12 @@
     const auto* rhs_type = program.Sem().GetVal(binary_expr.rhs)->Type();
 
     // If these are reference types, unwrap them to get the pointee type.
-    const type::Type* lhs_basic_type =
-        lhs_type->Is<type::Reference>() ? lhs_type->As<type::Reference>()->StoreType() : lhs_type;
-    const type::Type* rhs_basic_type =
-        rhs_type->Is<type::Reference>() ? rhs_type->As<type::Reference>()->StoreType() : rhs_type;
+    const core::type::Type* lhs_basic_type =
+        lhs_type->Is<core::type::Reference>() ? lhs_type->As<core::type::Reference>()->StoreType()
+                                              : lhs_type;
+    const core::type::Type* rhs_basic_type =
+        rhs_type->Is<core::type::Reference>() ? rhs_type->As<core::type::Reference>()->StoreType()
+                                              : rhs_type;
 
     switch (binary_expr.op) {
         case core::BinaryOp::kAdd:
diff --git a/src/tint/fuzzers/tint_ast_fuzzer/mutations/change_unary_operator.cc b/src/tint/fuzzers/tint_ast_fuzzer/mutations/change_unary_operator.cc
index e17661a..838125c 100644
--- a/src/tint/fuzzers/tint_ast_fuzzer/mutations/change_unary_operator.cc
+++ b/src/tint/fuzzers/tint_ast_fuzzer/mutations/change_unary_operator.cc
@@ -48,7 +48,7 @@
     // Get the type of the unary expression.
     const auto* type = program.Sem().Get(unary_expr_node)->Type();
     const auto* basic_type =
-        type->Is<type::Reference>() ? type->As<type::Reference>()->StoreType() : type;
+        type->Is<core::type::Reference>() ? type->As<core::type::Reference>()->StoreType() : type;
 
     // Only signed integer or vector of signed integer has more than 1
     // unary operators to change between.
diff --git a/src/tint/fuzzers/tint_common_fuzzer.cc b/src/tint/fuzzers/tint_common_fuzzer.cc
index 7be9578..d7d4ace 100644
--- a/src/tint/fuzzers/tint_common_fuzzer.cc
+++ b/src/tint/fuzzers/tint_common_fuzzer.cc
@@ -246,7 +246,7 @@
                     auto& n = group_to_next_binding_number[bp->group];
                     n = std::max(n, bp->binding + 1);
 
-                    if (sem_var->Type()->UnwrapRef()->Is<type::ExternalTexture>()) {
+                    if (sem_var->Type()->UnwrapRef()->Is<core::type::ExternalTexture>()) {
                         ext_tex_bps.emplace_back(*bp);
                     }
                 }
diff --git a/src/tint/lang/core/constant/clone_context.h b/src/tint/lang/core/constant/clone_context.h
index 1556613..3a61e7e 100644
--- a/src/tint/lang/core/constant/clone_context.h
+++ b/src/tint/lang/core/constant/clone_context.h
@@ -27,7 +27,7 @@
 /// Context information for cloning of constants
 struct CloneContext {
     /// The context for cloning type information
-    type::CloneContext type_ctx;
+    core::type::CloneContext type_ctx;
 
     /// Destination information
     constant::Manager& dst;
diff --git a/src/tint/lang/core/constant/composite.cc b/src/tint/lang/core/constant/composite.cc
index 05f4604..d13ba7d 100644
--- a/src/tint/lang/core/constant/composite.cc
+++ b/src/tint/lang/core/constant/composite.cc
@@ -22,7 +22,7 @@
 
 namespace tint::core::constant {
 
-Composite::Composite(const type::Type* t, VectorRef<const Value*> els, bool all_0, bool any_0)
+Composite::Composite(const core::type::Type* t, VectorRef<const Value*> els, bool all_0, bool any_0)
     : type(t), elements(std::move(els)), all_zero(all_0), any_zero(any_0), hash(CalcHash()) {
     TINT_ASSERT(!elements.IsEmpty());
 }
diff --git a/src/tint/lang/core/constant/composite.h b/src/tint/lang/core/constant/composite.h
index 6af48f8..b749c70 100644
--- a/src/tint/lang/core/constant/composite.h
+++ b/src/tint/lang/core/constant/composite.h
@@ -35,11 +35,11 @@
     /// @param els the composite elements
     /// @param all_0 true if all elements are 0
     /// @param any_0 true if any element is 0
-    Composite(const type::Type* t, VectorRef<const Value*> els, bool all_0, bool any_0);
+    Composite(const core::type::Type* t, VectorRef<const Value*> els, bool all_0, bool any_0);
     ~Composite() override;
 
     /// @copydoc Value::Type()
-    const type::Type* Type() const override { return type; }
+    const core::type::Type* Type() const override { return type; }
 
     /// @copydoc Value::Index()
     const Value* Index(size_t i) const override {
@@ -64,7 +64,7 @@
     const Composite* Clone(CloneContext& ctx) const override;
 
     /// The composite type
-    type::Type const* const type;
+    core::type::Type const* const type;
     /// The composite elements
     const Vector<const Value*, 4> elements;
     /// True if all elements are zero
diff --git a/src/tint/lang/core/constant/composite_test.cc b/src/tint/lang/core/constant/composite_test.cc
index 5ffeb63..2f2bb10 100644
--- a/src/tint/lang/core/constant/composite_test.cc
+++ b/src/tint/lang/core/constant/composite_test.cc
@@ -25,7 +25,7 @@
 using ConstantTest_Composite = TestHelper;
 
 TEST_F(ConstantTest_Composite, AllZero) {
-    auto* vec3f = create<type::Vector>(create<type::F32>(), 3u);
+    auto* vec3f = create<core::type::Vector>(create<core::type::F32>(), 3u);
 
     auto* fPos0 = constants.Get(0_f);
     auto* fNeg0 = constants.Get(-0_f);
@@ -41,7 +41,7 @@
 }
 
 TEST_F(ConstantTest_Composite, AnyZero) {
-    auto* vec3f = create<type::Vector>(create<type::F32>(), 3u);
+    auto* vec3f = create<core::type::Vector>(create<core::type::F32>(), 3u);
 
     auto* fPos0 = constants.Get(0_f);
     auto* fNeg0 = constants.Get(-0_f);
@@ -57,7 +57,7 @@
 }
 
 TEST_F(ConstantTest_Composite, Index) {
-    auto* vec3f = create<type::Vector>(create<type::F32>(), 3u);
+    auto* vec3f = create<core::type::Vector>(create<core::type::F32>(), 3u);
 
     auto* fPos0 = constants.Get(0_f);
     auto* fPos1 = constants.Get(1_f);
@@ -75,7 +75,7 @@
 }
 
 TEST_F(ConstantTest_Composite, Clone) {
-    auto* vec3f = create<type::Vector>(create<type::F32>(), 3u);
+    auto* vec3f = create<core::type::Vector>(create<core::type::F32>(), 3u);
 
     auto* fPos0 = constants.Get(0_f);
     auto* fPos1 = constants.Get(1_f);
@@ -83,11 +83,11 @@
     auto* composite = constants.Composite(vec3f, Vector{fPos1, fPos0});
 
     constant::Manager mgr;
-    constant::CloneContext ctx{type::CloneContext{{nullptr}, {nullptr, &mgr.types}}, mgr};
+    constant::CloneContext ctx{core::type::CloneContext{{nullptr}, {nullptr, &mgr.types}}, mgr};
 
     auto* r = composite->As<Composite>()->Clone(ctx);
     ASSERT_NE(r, nullptr);
-    EXPECT_TRUE(r->type->Is<type::Vector>());
+    EXPECT_TRUE(r->type->Is<core::type::Vector>());
     EXPECT_FALSE(r->all_zero);
     EXPECT_TRUE(r->any_zero);
     ASSERT_EQ(r->elements.Length(), 2u);
diff --git a/src/tint/lang/core/constant/eval.cc b/src/tint/lang/core/constant/eval.cc
index 5ef8af3..daac5a9 100644
--- a/src/tint/lang/core/constant/eval.cc
+++ b/src/tint/lang/core/constant/eval.cc
@@ -63,8 +63,8 @@
 auto Dispatch_iu32(F&& f, CONSTANTS&&... cs) {
     return Switch(
         First(cs...)->Type(),  //
-        [&](const type::I32*) { return f(cs->template ValueAs<i32>()...); },
-        [&](const type::U32*) { return f(cs->template ValueAs<u32>()...); });
+        [&](const core::type::I32*) { return f(cs->template ValueAs<i32>()...); },
+        [&](const core::type::U32*) { return f(cs->template ValueAs<u32>()...); });
 }
 
 /// Helper that calls `f` passing in the value of all `cs`.
@@ -73,9 +73,9 @@
 auto Dispatch_ia_iu32(F&& f, CONSTANTS&&... cs) {
     return Switch(
         First(cs...)->Type(),  //
-        [&](const type::AbstractInt*) { return f(cs->template ValueAs<AInt>()...); },
-        [&](const type::I32*) { return f(cs->template ValueAs<i32>()...); },
-        [&](const type::U32*) { return f(cs->template ValueAs<u32>()...); });
+        [&](const core::type::AbstractInt*) { return f(cs->template ValueAs<AInt>()...); },
+        [&](const core::type::I32*) { return f(cs->template ValueAs<i32>()...); },
+        [&](const core::type::U32*) { return f(cs->template ValueAs<u32>()...); });
 }
 
 /// Helper that calls `f` passing in the value of all `cs`.
@@ -84,10 +84,10 @@
 auto Dispatch_ia_iu32_bool(F&& f, CONSTANTS&&... cs) {
     return Switch(
         First(cs...)->Type(),  //
-        [&](const type::AbstractInt*) { return f(cs->template ValueAs<AInt>()...); },
-        [&](const type::I32*) { return f(cs->template ValueAs<i32>()...); },
-        [&](const type::U32*) { return f(cs->template ValueAs<u32>()...); },
-        [&](const type::Bool*) { return f(cs->template ValueAs<bool>()...); });
+        [&](const core::type::AbstractInt*) { return f(cs->template ValueAs<AInt>()...); },
+        [&](const core::type::I32*) { return f(cs->template ValueAs<i32>()...); },
+        [&](const core::type::U32*) { return f(cs->template ValueAs<u32>()...); },
+        [&](const core::type::Bool*) { return f(cs->template ValueAs<bool>()...); });
 }
 
 /// Helper that calls `f` passing in the value of all `cs`.
@@ -96,11 +96,11 @@
 auto Dispatch_fia_fi32_f16(F&& f, CONSTANTS&&... cs) {
     return Switch(
         First(cs...)->Type(),  //
-        [&](const type::AbstractInt*) { return f(cs->template ValueAs<AInt>()...); },
-        [&](const type::AbstractFloat*) { return f(cs->template ValueAs<AFloat>()...); },
-        [&](const type::F32*) { return f(cs->template ValueAs<f32>()...); },
-        [&](const type::I32*) { return f(cs->template ValueAs<i32>()...); },
-        [&](const type::F16*) { return f(cs->template ValueAs<f16>()...); });
+        [&](const core::type::AbstractInt*) { return f(cs->template ValueAs<AInt>()...); },
+        [&](const core::type::AbstractFloat*) { return f(cs->template ValueAs<AFloat>()...); },
+        [&](const core::type::F32*) { return f(cs->template ValueAs<f32>()...); },
+        [&](const core::type::I32*) { return f(cs->template ValueAs<i32>()...); },
+        [&](const core::type::F16*) { return f(cs->template ValueAs<f16>()...); });
 }
 
 /// Helper that calls `f` passing in the value of all `cs`.
@@ -109,12 +109,12 @@
 auto Dispatch_fia_fiu32_f16(F&& f, CONSTANTS&&... cs) {
     return Switch(
         First(cs...)->Type(),  //
-        [&](const type::AbstractInt*) { return f(cs->template ValueAs<AInt>()...); },
-        [&](const type::AbstractFloat*) { return f(cs->template ValueAs<AFloat>()...); },
-        [&](const type::F32*) { return f(cs->template ValueAs<f32>()...); },
-        [&](const type::I32*) { return f(cs->template ValueAs<i32>()...); },
-        [&](const type::U32*) { return f(cs->template ValueAs<u32>()...); },
-        [&](const type::F16*) { return f(cs->template ValueAs<f16>()...); });
+        [&](const core::type::AbstractInt*) { return f(cs->template ValueAs<AInt>()...); },
+        [&](const core::type::AbstractFloat*) { return f(cs->template ValueAs<AFloat>()...); },
+        [&](const core::type::F32*) { return f(cs->template ValueAs<f32>()...); },
+        [&](const core::type::I32*) { return f(cs->template ValueAs<i32>()...); },
+        [&](const core::type::U32*) { return f(cs->template ValueAs<u32>()...); },
+        [&](const core::type::F16*) { return f(cs->template ValueAs<f16>()...); });
 }
 
 /// Helper that calls `f` passing in the value of all `cs`.
@@ -123,13 +123,13 @@
 auto Dispatch_fia_fiu32_f16_bool(F&& f, CONSTANTS&&... cs) {
     return Switch(
         First(cs...)->Type(),  //
-        [&](const type::AbstractInt*) { return f(cs->template ValueAs<AInt>()...); },
-        [&](const type::AbstractFloat*) { return f(cs->template ValueAs<AFloat>()...); },
-        [&](const type::F32*) { return f(cs->template ValueAs<f32>()...); },
-        [&](const type::I32*) { return f(cs->template ValueAs<i32>()...); },
-        [&](const type::U32*) { return f(cs->template ValueAs<u32>()...); },
-        [&](const type::F16*) { return f(cs->template ValueAs<f16>()...); },
-        [&](const type::Bool*) { return f(cs->template ValueAs<bool>()...); });
+        [&](const core::type::AbstractInt*) { return f(cs->template ValueAs<AInt>()...); },
+        [&](const core::type::AbstractFloat*) { return f(cs->template ValueAs<AFloat>()...); },
+        [&](const core::type::F32*) { return f(cs->template ValueAs<f32>()...); },
+        [&](const core::type::I32*) { return f(cs->template ValueAs<i32>()...); },
+        [&](const core::type::U32*) { return f(cs->template ValueAs<u32>()...); },
+        [&](const core::type::F16*) { return f(cs->template ValueAs<f16>()...); },
+        [&](const core::type::Bool*) { return f(cs->template ValueAs<bool>()...); });
 }
 
 /// Helper that calls `f` passing in the value of all `cs`.
@@ -138,9 +138,9 @@
 auto Dispatch_fa_f32_f16(F&& f, CONSTANTS&&... cs) {
     return Switch(
         First(cs...)->Type(),  //
-        [&](const type::AbstractFloat*) { return f(cs->template ValueAs<AFloat>()...); },
-        [&](const type::F32*) { return f(cs->template ValueAs<f32>()...); },
-        [&](const type::F16*) { return f(cs->template ValueAs<f16>()...); });
+        [&](const core::type::AbstractFloat*) { return f(cs->template ValueAs<AFloat>()...); },
+        [&](const core::type::F32*) { return f(cs->template ValueAs<f32>()...); },
+        [&](const core::type::F16*) { return f(cs->template ValueAs<f16>()...); });
 }
 
 /// Helper that calls `f` passing in the value of all `cs`.
@@ -151,23 +151,23 @@
 }
 
 /// 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
+/// of the C++ type that corresponds to the core::type::Type `type`. For example, calling
 /// `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
 /// return the zero-initialized value of the return type for `f`.
 template <typename F>
-auto ZeroTypeDispatch(const type::Type* type, F&& f) {
+auto ZeroTypeDispatch(const core::type::Type* type, F&& f) {
     return Switch(
-        type,                                                      //
-        [&](const type::AbstractInt*) { return f(AInt(0)); },      //
-        [&](const type::AbstractFloat*) { return f(AFloat(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)); });
+        type,                                                            //
+        [&](const core::type::AbstractInt*) { return f(AInt(0)); },      //
+        [&](const core::type::AbstractFloat*) { return f(AFloat(0)); },  //
+        [&](const core::type::I32*) { return f(i32(0)); },               //
+        [&](const core::type::U32*) { return f(u32(0)); },               //
+        [&](const core::type::F32*) { return f(f32(0)); },               //
+        [&](const core::type::F16*) { return f(f16(0)); },               //
+        [&](const core::type::Bool*) { return f(static_cast<bool>(0)); });
 }
 
 template <typename NumberT>
@@ -240,7 +240,7 @@
 /// @returns the converted scalar, or nullptr on error.
 template <typename T>
 const ScalarBase* ScalarConvert(const Scalar<T>* scalar,
-                                const type::Type* target_ty,
+                                const core::type::Type* target_ty,
                                 ConvertContext& ctx) {
     TINT_BEGIN_DISABLE_WARNING(UNREACHABLE_CODE);
     if (target_ty == scalar->type) {
@@ -317,19 +317,19 @@
 /// Converts the constant value to the target type.
 /// @returns the converted value, or nullptr on error.
 const Value* ConvertInternal(const Value* root_value,
-                             const type::Type* root_target_ty,
+                             const core::type::Type* root_target_ty,
                              ConvertContext& ctx) {
     struct ActionConvert {
         const Value* value = nullptr;
-        const type::Type* target_ty = nullptr;
+        const core::type::Type* target_ty = nullptr;
     };
     struct ActionBuildSplat {
         size_t count = 0;
-        const type::Type* type = nullptr;
+        const core::type::Type* type = nullptr;
     };
     struct ActionBuildComposite {
         size_t count = 0;
-        const type::Type* type = nullptr;
+        const core::type::Type* type = nullptr;
     };
     using Action = std::variant<ActionConvert, ActionBuildSplat, ActionBuildComposite>;
 
@@ -398,8 +398,8 @@
                 return true;
             },
             [&](const Splat* splat) {
-                const type::Type* target_el_ty = nullptr;
-                if (auto* str = convert->target_ty->As<type::Struct>()) {
+                const core::type::Type* target_el_ty = nullptr;
+                if (auto* str = convert->target_ty->As<core::type::Struct>()) {
                     // Structure conversion.
                     auto members = str->Members();
                     target_el_ty = members[0]->Type();
@@ -429,7 +429,7 @@
                 // Build the new composite from the converted element types.
                 pending.Push(ActionBuildComposite{el_count, convert->target_ty});
 
-                if (auto* str = convert->target_ty->As<type::Struct>()) {
+                if (auto* str = convert->target_ty->As<core::type::Struct>()) {
                     if (TINT_UNLIKELY(str->Members().Length() != el_count)) {
                         TINT_ICE()
                             << "const-eval conversion of structure has mismatched element counts";
@@ -464,7 +464,7 @@
 /// Implementation of TransformElements
 template <typename F, typename... CONSTANTS>
 Eval::Result TransformElements(Manager& mgr,
-                               const type::Type* composite_ty,
+                               const core::type::Type* composite_ty,
                                F&& f,
                                size_t index,
                                CONSTANTS&&... cs) {
@@ -503,7 +503,7 @@
 /// the most deeply nested aggregate type will be passed in.
 template <typename F, typename... CONSTANTS>
 Eval::Result TransformElements(Manager& mgr,
-                               const type::Type* composite_ty,
+                               const core::type::Type* composite_ty,
                                F&& f,
                                CONSTANTS&&... cs) {
     return detail::TransformElements(mgr, composite_ty, f, 0, cs...);
@@ -515,7 +515,7 @@
 /// vector-scalar, scalar-vector.
 template <typename F>
 Eval::Result TransformBinaryElements(Manager& mgr,
-                                     const type::Type* composite_ty,
+                                     const core::type::Type* composite_ty,
                                      F&& f,
                                      const Value* c0,
                                      const Value* c1) {
@@ -553,9 +553,9 @@
     : mgr(manager), diags(diagnostics), use_runtime_semantics_(use_runtime_semantics) {}
 
 template <typename T>
-Eval::Result Eval::CreateScalar(const Source& source, const type::Type* t, T v) {
+Eval::Result Eval::CreateScalar(const Source& source, const core::type::Type* t, T v) {
     static_assert(IsNumber<T> || std::is_same_v<T, bool>, "T must be a Number or bool");
-    TINT_ASSERT(t->Is<type::Scalar>());
+    TINT_ASSERT(t->Is<core::type::Scalar>());
 
     if constexpr (IsFloatingPoint<T>) {
         if (!std::isfinite(v.value)) {
@@ -570,18 +570,18 @@
     return mgr.Get<Scalar<T>>(t, v);
 }
 
-const Value* Eval::ZeroValue(const type::Type* type) {
+const Value* Eval::ZeroValue(const core::type::Type* type) {
     return Switch(
         type,  //
-        [&](const type::Vector* v) -> const Value* {
+        [&](const core::type::Vector* v) -> const Value* {
             auto* zero_el = ZeroValue(v->type());
             return mgr.Splat(type, zero_el, v->Width());
         },
-        [&](const type::Matrix* m) -> const Value* {
+        [&](const core::type::Matrix* m) -> const Value* {
             auto* zero_el = ZeroValue(m->ColumnType());
             return mgr.Splat(type, zero_el, m->columns());
         },
-        [&](const type::Array* a) -> const Value* {
+        [&](const core::type::Array* a) -> const Value* {
             if (auto n = a->ConstantCount()) {
                 if (auto* zero_el = ZeroValue(a->ElemType())) {
                     return mgr.Splat(type, zero_el, n.value());
@@ -589,8 +589,8 @@
             }
             return nullptr;
         },
-        [&](const type::Struct* s) -> const Value* {
-            Hashmap<const type::Type*, const Value*, 8> zero_by_type;
+        [&](const core::type::Struct* s) -> const Value* {
+            Hashmap<const core::type::Type*, const Value*, 8> zero_by_type;
             Vector<const Value*, 4> zeros;
             zeros.Reserve(s->Members().Length());
             for (auto* member : s->Members()) {
@@ -1047,7 +1047,7 @@
     return NumberT{std::sqrt(v)};
 }
 
-auto Eval::SqrtFunc(const Source& source, const type::Type* elem_ty) {
+auto Eval::SqrtFunc(const Source& source, const core::type::Type* elem_ty) {
     return [=](auto v) -> Eval::Result {
         if (auto r = Sqrt(source, v)) {
             return CreateScalar(source, elem_ty, r.Get());
@@ -1069,7 +1069,7 @@
     return NumberT{std::min(std::max(e, low), high)};
 }
 
-auto Eval::ClampFunc(const Source& source, const type::Type* elem_ty) {
+auto Eval::ClampFunc(const Source& source, const core::type::Type* elem_ty) {
     return [=](auto e, auto low, auto high) -> Eval::Result {
         if (auto r = Clamp(source, e, low, high)) {
             return CreateScalar(source, elem_ty, r.Get());
@@ -1078,7 +1078,7 @@
     };
 }
 
-auto Eval::AddFunc(const Source& source, const type::Type* elem_ty) {
+auto Eval::AddFunc(const Source& source, const core::type::Type* elem_ty) {
     return [=](auto a1, auto a2) -> Eval::Result {
         if (auto r = Add(source, a1, a2)) {
             return CreateScalar(source, elem_ty, r.Get());
@@ -1087,7 +1087,7 @@
     };
 }
 
-auto Eval::SubFunc(const Source& source, const type::Type* elem_ty) {
+auto Eval::SubFunc(const Source& source, const core::type::Type* elem_ty) {
     return [=](auto a1, auto a2) -> Eval::Result {
         if (auto r = Sub(source, a1, a2)) {
             return CreateScalar(source, elem_ty, r.Get());
@@ -1096,7 +1096,7 @@
     };
 }
 
-auto Eval::MulFunc(const Source& source, const type::Type* elem_ty) {
+auto Eval::MulFunc(const Source& source, const core::type::Type* elem_ty) {
     return [=](auto a1, auto a2) -> Eval::Result {
         if (auto r = Mul(source, a1, a2)) {
             return CreateScalar(source, elem_ty, r.Get());
@@ -1105,7 +1105,7 @@
     };
 }
 
-auto Eval::DivFunc(const Source& source, const type::Type* elem_ty) {
+auto Eval::DivFunc(const Source& source, const core::type::Type* elem_ty) {
     return [=](auto a1, auto a2) -> Eval::Result {
         if (auto r = Div(source, a1, a2)) {
             return CreateScalar(source, elem_ty, r.Get());
@@ -1114,7 +1114,7 @@
     };
 }
 
-auto Eval::ModFunc(const Source& source, const type::Type* elem_ty) {
+auto Eval::ModFunc(const Source& source, const core::type::Type* elem_ty) {
     return [=](auto a1, auto a2) -> Eval::Result {
         if (auto r = Mod(source, a1, a2)) {
             return CreateScalar(source, elem_ty, r.Get());
@@ -1123,7 +1123,7 @@
     };
 }
 
-auto Eval::Dot2Func(const Source& source, const type::Type* elem_ty) {
+auto Eval::Dot2Func(const Source& source, const core::type::Type* elem_ty) {
     return [=](auto a1, auto a2, auto b1, auto b2) -> Eval::Result {
         if (auto r = Dot2(source, a1, a2, b1, b2)) {
             return CreateScalar(source, elem_ty, r.Get());
@@ -1132,7 +1132,7 @@
     };
 }
 
-auto Eval::Dot3Func(const Source& source, const type::Type* elem_ty) {
+auto Eval::Dot3Func(const Source& source, const core::type::Type* elem_ty) {
     return [=](auto a1, auto a2, auto a3, auto b1, auto b2, auto b3) -> Eval::Result {
         if (auto r = Dot3(source, a1, a2, a3, b1, b2, b3)) {
             return CreateScalar(source, elem_ty, r.Get());
@@ -1141,7 +1141,7 @@
     };
 }
 
-auto Eval::Dot4Func(const Source& source, const type::Type* elem_ty) {
+auto Eval::Dot4Func(const Source& source, const core::type::Type* elem_ty) {
     return [=](auto a1, auto a2, auto a3, auto a4, auto b1, auto b2, auto b3,
                auto b4) -> Eval::Result {
         if (auto r = Dot4(source, a1, a2, a3, a4, b1, b2, b3, b4)) {
@@ -1152,7 +1152,7 @@
 }
 
 Eval::Result Eval::Dot(const Source& source, const Value* v1, const Value* v2) {
-    auto* vec_ty = v1->Type()->As<type::Vector>();
+    auto* vec_ty = v1->Type()->As<core::type::Vector>();
     TINT_ASSERT(vec_ty);
     auto* elem_ty = vec_ty->type();
     switch (vec_ty->Width()) {
@@ -1176,8 +1176,8 @@
     return Failure;
 }
 
-Eval::Result Eval::Length(const Source& source, const type::Type* ty, const Value* c0) {
-    auto* vec_ty = c0->Type()->As<type::Vector>();
+Eval::Result Eval::Length(const Source& source, const core::type::Type* ty, const Value* c0) {
+    auto* vec_ty = c0->Type()->As<core::type::Vector>();
     // Evaluates to the absolute value of e if T is scalar.
     if (vec_ty == nullptr) {
         auto create = [&](auto e) {
@@ -1196,7 +1196,7 @@
 }
 
 Eval::Result Eval::Mul(const Source& source,
-                       const type::Type* ty,
+                       const core::type::Type* ty,
                        const Value* v1,
                        const Value* v2) {
     auto transform = [&](const Value* c0, const Value* c1) {
@@ -1206,7 +1206,7 @@
 }
 
 Eval::Result Eval::Sub(const Source& source,
-                       const type::Type* ty,
+                       const core::type::Type* ty,
                        const Value* v1,
                        const Value* v2) {
     auto transform = [&](const Value* c0, const Value* c1) {
@@ -1215,7 +1215,7 @@
     return TransformBinaryElements(mgr, ty, transform, v1, v2);
 }
 
-auto Eval::Det2Func(const Source& source, const type::Type* elem_ty) {
+auto Eval::Det2Func(const Source& source, const core::type::Type* elem_ty) {
     return [=](auto a, auto b, auto c, auto d) -> Eval::Result {
         if (auto r = Det2(source, a, b, c, d)) {
             return CreateScalar(source, elem_ty, r.Get());
@@ -1224,7 +1224,7 @@
     };
 }
 
-auto Eval::Det3Func(const Source& source, const type::Type* elem_ty) {
+auto Eval::Det3Func(const Source& source, const core::type::Type* elem_ty) {
     return [=](auto a, auto b, auto c, auto d, auto e, auto f, auto g, auto h,
                auto i) -> Eval::Result {
         if (auto r = Det3(source, a, b, c, d, e, f, g, h, i)) {
@@ -1234,7 +1234,7 @@
     };
 }
 
-auto Eval::Det4Func(const Source& source, const type::Type* elem_ty) {
+auto Eval::Det4Func(const Source& source, const core::type::Type* elem_ty) {
     return [=](auto a, auto b, auto c, auto d, auto e, auto f, auto g, auto h, auto i, auto j,
                auto k, auto l, auto m, auto n, auto o, auto p) -> Eval::Result {
         if (auto r = Det4(source, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)) {
@@ -1244,7 +1244,7 @@
     };
 }
 
-Eval::Result Eval::ArrayOrStructCtor(const type::Type* ty, VectorRef<const Value*> args) {
+Eval::Result Eval::ArrayOrStructCtor(const core::type::Type* ty, VectorRef<const Value*> args) {
     if (args.IsEmpty()) {
         return ZeroValue(ty);
     }
@@ -1258,7 +1258,9 @@
     return mgr.Composite(ty, std::move(args));
 }
 
-Eval::Result Eval::Conv(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::Conv(const core::type::Type* ty,
+                        VectorRef<const Value*> args,
+                        const Source& source) {
     auto* el_ty = ty->Elements(ty).type;
     if (!el_ty) {
         return nullptr;
@@ -1271,26 +1273,32 @@
     return Convert(ty, args[0], source);
 }
 
-Eval::Result Eval::Zero(const type::Type* ty, VectorRef<const Value*>, const Source&) {
+Eval::Result Eval::Zero(const core::type::Type* ty, VectorRef<const Value*>, const Source&) {
     return ZeroValue(ty);
 }
 
-Eval::Result Eval::Identity(const type::Type*, VectorRef<const Value*> args, const Source&) {
+Eval::Result Eval::Identity(const core::type::Type*, VectorRef<const Value*> args, const Source&) {
     return args[0];
 }
 
-Eval::Result Eval::VecSplat(const type::Type* ty, VectorRef<const Value*> args, const Source&) {
+Eval::Result Eval::VecSplat(const core::type::Type* ty,
+                            VectorRef<const Value*> args,
+                            const Source&) {
     if (auto* arg = args[0]) {
-        return mgr.Splat(ty, arg, static_cast<const type::Vector*>(ty)->Width());
+        return mgr.Splat(ty, arg, static_cast<const core::type::Vector*>(ty)->Width());
     }
     return nullptr;
 }
 
-Eval::Result Eval::VecInitS(const type::Type* ty, VectorRef<const Value*> args, const Source&) {
+Eval::Result Eval::VecInitS(const core::type::Type* ty,
+                            VectorRef<const Value*> args,
+                            const Source&) {
     return mgr.Composite(ty, args);
 }
 
-Eval::Result Eval::VecInitM(const type::Type* ty, VectorRef<const Value*> args, const Source&) {
+Eval::Result Eval::VecInitM(const core::type::Type* ty,
+                            VectorRef<const Value*> args,
+                            const Source&) {
     Vector<const Value*, 4> els;
     for (auto* arg : args) {
         auto* val = arg;
@@ -1298,7 +1306,7 @@
             return nullptr;
         }
         auto* arg_ty = arg->Type();
-        if (auto* arg_vec = arg_ty->As<type::Vector>()) {
+        if (auto* arg_vec = arg_ty->As<core::type::Vector>()) {
             // Extract out vector elements.
             for (uint32_t j = 0; j < arg_vec->Width(); j++) {
                 auto* el = val->Index(j);
@@ -1314,8 +1322,10 @@
     return mgr.Composite(ty, std::move(els));
 }
 
-Eval::Result Eval::MatInitS(const type::Type* ty, VectorRef<const Value*> args, const Source&) {
-    auto* m = static_cast<const type::Matrix*>(ty);
+Eval::Result Eval::MatInitS(const core::type::Type* ty,
+                            VectorRef<const Value*> args,
+                            const Source&) {
+    auto* m = static_cast<const core::type::Matrix*>(ty);
 
     Vector<const Value*, 4> els;
     for (uint32_t c = 0; c < m->columns(); c++) {
@@ -1329,12 +1339,14 @@
     return mgr.Composite(ty, std::move(els));
 }
 
-Eval::Result Eval::MatInitV(const type::Type* ty, VectorRef<const Value*> args, const Source&) {
+Eval::Result Eval::MatInitV(const core::type::Type* ty,
+                            VectorRef<const Value*> args,
+                            const Source&) {
     return mgr.Composite(ty, args);
 }
 
 Eval::Result Eval::Index(const Value* obj_val,
-                         const type::Type* obj_ty,
+                         const core::type::Type* obj_ty,
                          const Value* idx_val,
                          const Source& idx_source) {
     auto el = obj_ty->UnwrapRef()->Elements();
@@ -1356,7 +1368,9 @@
     return obj_val ? obj_val->Index(static_cast<size_t>(idx)) : nullptr;
 }
 
-Eval::Result Eval::Swizzle(const type::Type* ty, const Value* object, VectorRef<uint32_t> indices) {
+Eval::Result Eval::Swizzle(const core::type::Type* ty,
+                           const Value* object,
+                           VectorRef<uint32_t> indices) {
     if (indices.Length() == 1) {
         return object->Index(static_cast<size_t>(indices[0]));
     }
@@ -1365,7 +1379,7 @@
     return mgr.Composite(ty, std::move(values));
 }
 
-Eval::Result Eval::Bitcast(const type::Type* ty, const Value* value, const Source& source) {
+Eval::Result Eval::Bitcast(const core::type::Type* ty, const Value* value, const Source& source) {
     // Target type
     auto dst_elements = ty->Elements(ty->DeepestElement(), 1u);
     auto dst_el_ty = dst_elements.type;
@@ -1382,7 +1396,8 @@
     buffer.Reserve(total_bitwidth);
 
     // Ensure elements are of 32-bit or 16-bit numerical scalar type.
-    TINT_ASSERT((src_el_ty->IsAnyOf<type::F32, type::I32, type::U32, type::F16>()));
+    TINT_ASSERT(
+        (src_el_ty->IsAnyOf<core::type::F32, core::type::I32, core::type::U32, core::type::F16>()));
     // Pushes bits from source value into the buffer.
     auto push_src_element_bits = [&](const Value* element) {
         auto push_32_bits = [&](uint32_t v) {
@@ -1397,19 +1412,19 @@
         };
         Switch(
             src_el_ty,
-            [&](const type::U32*) {  //
+            [&](const core::type::U32*) {  //
                 uint32_t r = element->ValueAs<u32>();
                 push_32_bits(r);
             },
-            [&](const type::I32*) {  //
+            [&](const core::type::I32*) {  //
                 uint32_t r = tint::Bitcast<u32>(element->ValueAs<i32>());
                 push_32_bits(r);
             },
-            [&](const type::F32*) {  //
+            [&](const core::type::F32*) {  //
                 uint32_t r = tint::Bitcast<u32>(element->ValueAs<f32>());
                 push_32_bits(r);
             },
-            [&](const type::F16*) {  //
+            [&](const core::type::F16*) {  //
                 uint16_t r = element->ValueAs<f16>().BitsRepresentation();
                 push_16_bits(r);
             });
@@ -1441,28 +1456,28 @@
 
         return Switch(
             dst_el_ty,
-            [&](const type::U32*) {  //
+            [&](const core::type::U32*) {  //
                 auto r = CreateScalar(source, dst_el_ty, u32(v));
                 if (r) {
                     els.Push(r.Get());
                 }
                 return r;
             },
-            [&](const type::I32*) {  //
+            [&](const core::type::I32*) {  //
                 auto r = CreateScalar(source, dst_el_ty, tint::Bitcast<i32>(v));
                 if (r) {
                     els.Push(r.Get());
                 }
                 return r;
             },
-            [&](const type::F32*) {  //
+            [&](const core::type::F32*) {  //
                 auto r = CreateScalar(source, dst_el_ty, tint::Bitcast<f32>(v));
                 if (r) {
                     els.Push(r.Get());
                 }
                 return r;
             },
-            [&](const type::F16*) {  //
+            [&](const core::type::F16*) {  //
                 auto r = CreateScalar(source, dst_el_ty, f16::FromBits(static_cast<uint16_t>(v)));
                 if (r) {
                     els.Push(r.Get());
@@ -1484,7 +1499,7 @@
     return mgr.Composite(ty, std::move(els));
 }
 
-Eval::Result Eval::Complement(const type::Type* ty,
+Eval::Result Eval::Complement(const core::type::Type* ty,
                               VectorRef<const Value*> args,
                               const Source& source) {
     auto transform = [&](const Value* c) {
@@ -1496,7 +1511,7 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::UnaryMinus(const type::Type* ty,
+Eval::Result Eval::UnaryMinus(const core::type::Type* ty,
                               VectorRef<const Value*> args,
                               const Source& source) {
     auto transform = [&](const Value* c) {
@@ -1521,7 +1536,9 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::Not(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::Not(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source) {
     auto transform = [&](const Value* c) {
         auto create = [&](auto i) { return CreateScalar(source, c->Type(), decltype(i)(!i)); };
         return Dispatch_bool(create, c);
@@ -1529,7 +1546,9 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::Plus(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::Plus(const core::type::Type* ty,
+                        VectorRef<const Value*> args,
+                        const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1) {
         return Dispatch_fia_fiu32_f16(AddFunc(source, c0->Type()), c0, c1);
     };
@@ -1537,21 +1556,23 @@
     return TransformBinaryElements(mgr, ty, transform, args[0], args[1]);
 }
 
-Eval::Result Eval::Minus(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::Minus(const core::type::Type* ty,
+                         VectorRef<const Value*> args,
+                         const Source& source) {
     return Sub(source, ty, args[0], args[1]);
 }
 
-Eval::Result Eval::Multiply(const type::Type* ty,
+Eval::Result Eval::Multiply(const core::type::Type* ty,
                             VectorRef<const Value*> args,
                             const Source& source) {
     return Mul(source, ty, args[0], args[1]);
 }
 
-Eval::Result Eval::MultiplyMatVec(const type::Type* ty,
+Eval::Result Eval::MultiplyMatVec(const core::type::Type* ty,
                                   VectorRef<const Value*> args,
                                   const Source& source) {
-    auto* mat_ty = args[0]->Type()->As<type::Matrix>();
-    auto* vec_ty = args[1]->Type()->As<type::Vector>();
+    auto* mat_ty = args[0]->Type()->As<core::type::Matrix>();
+    auto* vec_ty = args[1]->Type()->As<core::type::Vector>();
     auto* elem_ty = vec_ty->type();
 
     auto dot = [&](const Value* m, size_t row, const Value* v) {
@@ -1597,11 +1618,11 @@
     }
     return mgr.Composite(ty, result);
 }
-Eval::Result Eval::MultiplyVecMat(const type::Type* ty,
+Eval::Result Eval::MultiplyVecMat(const core::type::Type* ty,
                                   VectorRef<const Value*> args,
                                   const Source& source) {
-    auto* vec_ty = args[0]->Type()->As<type::Vector>();
-    auto* mat_ty = args[1]->Type()->As<type::Matrix>();
+    auto* vec_ty = args[0]->Type()->As<core::type::Vector>();
+    auto* mat_ty = args[1]->Type()->As<core::type::Matrix>();
     auto* elem_ty = vec_ty->type();
 
     auto dot = [&](const Value* v, const Value* m, size_t col) {
@@ -1648,13 +1669,13 @@
     return mgr.Composite(ty, result);
 }
 
-Eval::Result Eval::MultiplyMatMat(const type::Type* ty,
+Eval::Result Eval::MultiplyMatMat(const core::type::Type* ty,
                                   VectorRef<const Value*> args,
                                   const Source& source) {
     auto* mat1 = args[0];
     auto* mat2 = args[1];
-    auto* mat1_ty = mat1->Type()->As<type::Matrix>();
-    auto* mat2_ty = mat2->Type()->As<type::Matrix>();
+    auto* mat1_ty = mat1->Type()->As<core::type::Matrix>();
+    auto* mat2_ty = mat2->Type()->As<core::type::Matrix>();
     auto* elem_ty = mat1_ty->type();
 
     auto dot = [&](const Value* m1, size_t row, const Value* m2, size_t col) {
@@ -1706,13 +1727,13 @@
         }
 
         // Add column vector to matrix
-        auto* col_vec_ty = ty->As<type::Matrix>()->ColumnType();
+        auto* col_vec_ty = ty->As<core::type::Matrix>()->ColumnType();
         result_mat.Push(mgr.Composite(col_vec_ty, col_vec));
     }
     return mgr.Composite(ty, result_mat);
 }
 
-Eval::Result Eval::Divide(const type::Type* ty,
+Eval::Result Eval::Divide(const core::type::Type* ty,
                           VectorRef<const Value*> args,
                           const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1) {
@@ -1722,7 +1743,7 @@
     return TransformBinaryElements(mgr, ty, transform, args[0], args[1]);
 }
 
-Eval::Result Eval::Modulo(const type::Type* ty,
+Eval::Result Eval::Modulo(const core::type::Type* ty,
                           VectorRef<const Value*> args,
                           const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1) {
@@ -1732,7 +1753,9 @@
     return TransformBinaryElements(mgr, ty, transform, args[0], args[1]);
 }
 
-Eval::Result Eval::Equal(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::Equal(const core::type::Type* ty,
+                         VectorRef<const Value*> args,
+                         const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1) {
         auto create = [&](auto i, auto j) -> Eval::Result {
             return CreateScalar(source, ty->DeepestElement(), i == j);
@@ -1743,7 +1766,7 @@
     return TransformElements(mgr, ty, transform, args[0], args[1]);
 }
 
-Eval::Result Eval::NotEqual(const type::Type* ty,
+Eval::Result Eval::NotEqual(const core::type::Type* ty,
                             VectorRef<const Value*> args,
                             const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1) {
@@ -1756,7 +1779,7 @@
     return TransformElements(mgr, ty, transform, args[0], args[1]);
 }
 
-Eval::Result Eval::LessThan(const type::Type* ty,
+Eval::Result Eval::LessThan(const core::type::Type* ty,
                             VectorRef<const Value*> args,
                             const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1) {
@@ -1769,7 +1792,7 @@
     return TransformElements(mgr, ty, transform, args[0], args[1]);
 }
 
-Eval::Result Eval::GreaterThan(const type::Type* ty,
+Eval::Result Eval::GreaterThan(const core::type::Type* ty,
                                VectorRef<const Value*> args,
                                const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1) {
@@ -1782,7 +1805,7 @@
     return TransformElements(mgr, ty, transform, args[0], args[1]);
 }
 
-Eval::Result Eval::LessThanEqual(const type::Type* ty,
+Eval::Result Eval::LessThanEqual(const core::type::Type* ty,
                                  VectorRef<const Value*> args,
                                  const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1) {
@@ -1795,7 +1818,7 @@
     return TransformElements(mgr, ty, transform, args[0], args[1]);
 }
 
-Eval::Result Eval::GreaterThanEqual(const type::Type* ty,
+Eval::Result Eval::GreaterThanEqual(const core::type::Type* ty,
                                     VectorRef<const Value*> args,
                                     const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1) {
@@ -1808,7 +1831,7 @@
     return TransformElements(mgr, ty, transform, args[0], args[1]);
 }
 
-Eval::Result Eval::LogicalAnd(const type::Type* ty,
+Eval::Result Eval::LogicalAnd(const core::type::Type* ty,
                               VectorRef<const Value*> args,
                               const Source& source) {
     // Due to short-circuiting, this function is only called if lhs is true, so we only return the
@@ -1817,7 +1840,7 @@
     return CreateScalar(source, ty, args[1]->ValueAs<bool>());
 }
 
-Eval::Result Eval::LogicalOr(const type::Type* ty,
+Eval::Result Eval::LogicalOr(const core::type::Type* ty,
                              VectorRef<const Value*> args,
                              const Source& source) {
     // Due to short-circuiting, this function is only called if lhs is false, so we only only return
@@ -1826,7 +1849,9 @@
     return CreateScalar(source, ty, args[1]->ValueAs<bool>());
 }
 
-Eval::Result Eval::And(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::And(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1) {
         auto create = [&](auto i, auto j) -> Eval::Result {
             using T = decltype(i);
@@ -1844,7 +1869,9 @@
     return TransformElements(mgr, ty, transform, args[0], args[1]);
 }
 
-Eval::Result Eval::Or(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::Or(const core::type::Type* ty,
+                      VectorRef<const Value*> args,
+                      const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1) {
         auto create = [&](auto i, auto j) -> Eval::Result {
             using T = decltype(i);
@@ -1862,7 +1889,9 @@
     return TransformElements(mgr, ty, transform, args[0], args[1]);
 }
 
-Eval::Result Eval::Xor(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::Xor(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1) {
         auto create = [&](auto i, auto j) -> Eval::Result {
             return CreateScalar(source, ty->DeepestElement(), decltype(i){i ^ j});
@@ -1873,7 +1902,7 @@
     return TransformElements(mgr, ty, transform, args[0], args[1]);
 }
 
-Eval::Result Eval::ShiftLeft(const type::Type* ty,
+Eval::Result Eval::ShiftLeft(const core::type::Type* ty,
                              VectorRef<const Value*> args,
                              const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1) {
@@ -1962,7 +1991,7 @@
         return Dispatch_ia_iu32(create, c0, c1);
     };
 
-    if (TINT_UNLIKELY(!args[1]->Type()->DeepestElement()->Is<type::U32>())) {
+    if (TINT_UNLIKELY(!args[1]->Type()->DeepestElement()->Is<core::type::U32>())) {
         TINT_ICE() << "Element type of rhs of ShiftLeft must be a u32";
         return Failure;
     }
@@ -1970,7 +1999,7 @@
     return TransformElements(mgr, ty, transform, args[0], args[1]);
 }
 
-Eval::Result Eval::ShiftRight(const type::Type* ty,
+Eval::Result Eval::ShiftRight(const core::type::Type* ty,
                               VectorRef<const Value*> args,
                               const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1) {
@@ -2029,7 +2058,7 @@
         return Dispatch_ia_iu32(create, c0, c1);
     };
 
-    if (TINT_UNLIKELY(!args[1]->Type()->DeepestElement()->Is<type::U32>())) {
+    if (TINT_UNLIKELY(!args[1]->Type()->DeepestElement()->Is<core::type::U32>())) {
         TINT_ICE() << "Element type of rhs of ShiftLeft must be a u32";
         return Failure;
     }
@@ -2037,7 +2066,9 @@
     return TransformElements(mgr, ty, transform, args[0], args[1]);
 }
 
-Eval::Result Eval::abs(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::abs(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source) {
     auto transform = [&](const Value* c0) {
         auto create = [&](auto e) {
             using NumberT = decltype(e);
@@ -2060,7 +2091,9 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::acos(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::acos(const core::type::Type* ty,
+                        VectorRef<const Value*> args,
+                        const Source& source) {
     auto transform = [&](const Value* c0) {
         auto create = [&](auto i) -> Eval::Result {
             using NumberT = decltype(i);
@@ -2080,7 +2113,9 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::acosh(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::acosh(const core::type::Type* ty,
+                         VectorRef<const Value*> args,
+                         const Source& source) {
     auto transform = [&](const Value* c0) {
         auto create = [&](auto i) -> Eval::Result {
             using NumberT = decltype(i);
@@ -2100,15 +2135,21 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::all(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::all(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source) {
     return CreateScalar(source, ty, !args[0]->AnyZero());
 }
 
-Eval::Result Eval::any(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::any(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source) {
     return CreateScalar(source, ty, !args[0]->AllZero());
 }
 
-Eval::Result Eval::asin(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::asin(const core::type::Type* ty,
+                        VectorRef<const Value*> args,
+                        const Source& source) {
     auto transform = [&](const Value* c0) {
         auto create = [&](auto i) -> Eval::Result {
             using NumberT = decltype(i);
@@ -2128,7 +2169,9 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::asinh(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::asinh(const core::type::Type* ty,
+                         VectorRef<const Value*> args,
+                         const Source& source) {
     auto transform = [&](const Value* c0) {
         auto create = [&](auto i) {
             return CreateScalar(source, c0->Type(), decltype(i)(std::asinh(i.value)));
@@ -2139,7 +2182,9 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::atan(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::atan(const core::type::Type* ty,
+                        VectorRef<const Value*> args,
+                        const Source& source) {
     auto transform = [&](const Value* c0) {
         auto create = [&](auto i) {
             return CreateScalar(source, c0->Type(), decltype(i)(std::atan(i.value)));
@@ -2149,7 +2194,9 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::atanh(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::atanh(const core::type::Type* ty,
+                         VectorRef<const Value*> args,
+                         const Source& source) {
     auto transform = [&](const Value* c0) {
         auto create = [&](auto i) -> Eval::Result {
             using NumberT = decltype(i);
@@ -2170,7 +2217,9 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::atan2(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::atan2(const core::type::Type* ty,
+                         VectorRef<const Value*> args,
+                         const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1) {
         auto create = [&](auto i, auto j) {
             return CreateScalar(source, c0->Type(), decltype(i)(std::atan2(i.value, j.value)));
@@ -2180,7 +2229,9 @@
     return TransformElements(mgr, ty, transform, args[0], args[1]);
 }
 
-Eval::Result Eval::ceil(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::ceil(const core::type::Type* ty,
+                        VectorRef<const Value*> args,
+                        const Source& source) {
     auto transform = [&](const Value* c0) {
         auto create = [&](auto e) {
             return CreateScalar(source, c0->Type(), decltype(e)(std::ceil(e)));
@@ -2190,14 +2241,18 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::clamp(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::clamp(const core::type::Type* ty,
+                         VectorRef<const Value*> args,
+                         const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1, const Value* c2) {
         return Dispatch_fia_fiu32_f16(ClampFunc(source, c0->Type()), c0, c1, c2);
     };
     return TransformElements(mgr, ty, transform, args[0], args[1], args[2]);
 }
 
-Eval::Result Eval::cos(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::cos(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source) {
     auto transform = [&](const Value* c0) {
         auto create = [&](auto i) -> Eval::Result {
             using NumberT = decltype(i);
@@ -2208,7 +2263,9 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::cosh(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::cosh(const core::type::Type* ty,
+                        VectorRef<const Value*> args,
+                        const Source& source) {
     auto transform = [&](const Value* c0) {
         auto create = [&](auto i) -> Eval::Result {
             using NumberT = decltype(i);
@@ -2219,7 +2276,7 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::countLeadingZeros(const type::Type* ty,
+Eval::Result Eval::countLeadingZeros(const core::type::Type* ty,
                                      VectorRef<const Value*> args,
                                      const Source& source) {
     auto transform = [&](const Value* c0) {
@@ -2234,7 +2291,7 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::countOneBits(const type::Type* ty,
+Eval::Result Eval::countOneBits(const core::type::Type* ty,
                                 VectorRef<const Value*> args,
                                 const Source& source) {
     auto transform = [&](const Value* c0) {
@@ -2258,7 +2315,7 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::countTrailingZeros(const type::Type* ty,
+Eval::Result Eval::countTrailingZeros(const core::type::Type* ty,
                                       VectorRef<const Value*> args,
                                       const Source& source) {
     auto transform = [&](const Value* c0) {
@@ -2273,10 +2330,12 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::cross(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::cross(const core::type::Type* ty,
+                         VectorRef<const Value*> args,
+                         const Source& source) {
     auto* u = args[0];
     auto* v = args[1];
-    auto* elem_ty = u->Type()->As<type::Vector>()->type();
+    auto* elem_ty = u->Type()->As<core::type::Vector>()->type();
 
     // cross product of a v3 is the determinant of the 3x3 matrix:
     //
@@ -2313,7 +2372,7 @@
     return mgr.Composite(ty, Vector<const Value*, 3>{x.Get(), y.Get(), z.Get()});
 }
 
-Eval::Result Eval::degrees(const type::Type* ty,
+Eval::Result Eval::degrees(const core::type::Type* ty,
                            VectorRef<const Value*> args,
                            const Source& source) {
     auto transform = [&](const Value* c0) {
@@ -2339,12 +2398,12 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::determinant(const type::Type* ty,
+Eval::Result Eval::determinant(const core::type::Type* ty,
                                VectorRef<const Value*> args,
                                const Source& source) {
     auto calculate = [&]() -> Eval::Result {
         auto* m = args[0];
-        auto* mat_ty = m->Type()->As<type::Matrix>();
+        auto* mat_ty = m->Type()->As<core::type::Matrix>();
         auto me = [&](size_t r, size_t c) { return m->Index(c)->Index(r); };
         switch (mat_ty->rows()) {
             case 2:
@@ -2375,7 +2434,7 @@
     return r;
 }
 
-Eval::Result Eval::distance(const type::Type* ty,
+Eval::Result Eval::distance(const core::type::Type* ty,
                             VectorRef<const Value*> args,
                             const Source& source) {
     auto err = [&]() -> Eval::Result {
@@ -2395,7 +2454,9 @@
     return len;
 }
 
-Eval::Result Eval::dot(const type::Type*, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::dot(const core::type::Type*,
+                       VectorRef<const Value*> args,
+                       const Source& source) {
     auto r = Dot(source, args[0], args[1]);
     if (!r) {
         AddNote("when calculating dot", source);
@@ -2403,7 +2464,9 @@
     return r;
 }
 
-Eval::Result Eval::exp(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::exp(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source) {
     auto transform = [&](const Value* c0) {
         auto create = [&](auto e0) -> Eval::Result {
             using NumberT = decltype(e0);
@@ -2423,7 +2486,9 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::exp2(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::exp2(const core::type::Type* ty,
+                        VectorRef<const Value*> args,
+                        const Source& source) {
     auto transform = [&](const Value* c0) {
         auto create = [&](auto e0) -> Eval::Result {
             using NumberT = decltype(e0);
@@ -2443,7 +2508,7 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::extractBits(const type::Type* ty,
+Eval::Result Eval::extractBits(const core::type::Type* ty,
                                VectorRef<const Value*> args,
                                const Source& source) {
     auto transform = [&](const Value* c0) {
@@ -2503,7 +2568,7 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::faceForward(const type::Type* ty,
+Eval::Result Eval::faceForward(const core::type::Type* ty,
                                VectorRef<const Value*> args,
                                const Source& source) {
     // Returns e1 if dot(e2, e3) is negative, and -e1 otherwise.
@@ -2522,7 +2587,7 @@
     return UnaryMinus(ty, Vector{e1}, source);
 }
 
-Eval::Result Eval::firstLeadingBit(const type::Type* ty,
+Eval::Result Eval::firstLeadingBit(const core::type::Type* ty,
                                    VectorRef<const Value*> args,
                                    const Source& source) {
     auto transform = [&](const Value* c0) {
@@ -2566,7 +2631,7 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::firstTrailingBit(const type::Type* ty,
+Eval::Result Eval::firstTrailingBit(const core::type::Type* ty,
                                     VectorRef<const Value*> args,
                                     const Source& source) {
     auto transform = [&](const Value* c0) {
@@ -2592,7 +2657,9 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::floor(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::floor(const core::type::Type* ty,
+                         VectorRef<const Value*> args,
+                         const Source& source) {
     auto transform = [&](const Value* c0) {
         auto create = [&](auto e) {
             return CreateScalar(source, c0->Type(), decltype(e)(std::floor(e)));
@@ -2602,7 +2669,9 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::fma(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::fma(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source) {
     auto transform = [&](const Value* c1, const Value* c2, const Value* c3) {
         auto create = [&](auto e1, auto e2, auto e3) -> Eval::Result {
             auto err_msg = [&] {
@@ -2626,7 +2695,9 @@
     return TransformElements(mgr, ty, transform, args[0], args[1], args[2]);
 }
 
-Eval::Result Eval::fract(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::fract(const core::type::Type* ty,
+                         VectorRef<const Value*> args,
+                         const Source& source) {
     auto transform = [&](const Value* c1) {
         auto create = [&](auto e) -> Eval::Result {
             using NumberT = decltype(e);
@@ -2638,7 +2709,9 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::frexp(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::frexp(const core::type::Type* ty,
+                         VectorRef<const Value*> args,
+                         const Source& source) {
     auto* arg = args[0];
 
     struct FractExp {
@@ -2651,19 +2724,19 @@
         double fract = std::frexp(s->ValueAs<AFloat>(), &exp);
         return Switch(
             s->Type(),
-            [&](const type::F32*) {
+            [&](const core::type::F32*) {
                 return FractExp{
                     CreateScalar(source, mgr.types.f32(), f32(fract)),
                     CreateScalar(source, mgr.types.i32(), i32(exp)),
                 };
             },
-            [&](const type::F16*) {
+            [&](const core::type::F16*) {
                 return FractExp{
                     CreateScalar(source, mgr.types.f16(), f16(fract)),
                     CreateScalar(source, mgr.types.i32(), i32(exp)),
                 };
             },
-            [&](const type::AbstractFloat*) {
+            [&](const core::type::AbstractFloat*) {
                 return FractExp{
                     CreateScalar(source, mgr.types.AFloat(), AFloat(fract)),
                     CreateScalar(source, mgr.types.AInt(), AInt(exp)),
@@ -2676,7 +2749,7 @@
             });
     };
 
-    if (auto* vec = arg->Type()->As<type::Vector>()) {
+    if (auto* vec = arg->Type()->As<core::type::Vector>()) {
         Vector<const Value*, 4> fract_els;
         Vector<const Value*, 4> exp_els;
         for (uint32_t i = 0; i < vec->Width(); i++) {
@@ -2705,7 +2778,7 @@
     }
 }
 
-Eval::Result Eval::insertBits(const type::Type* ty,
+Eval::Result Eval::insertBits(const core::type::Type* ty,
                               VectorRef<const Value*> args,
                               const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1) {
@@ -2762,7 +2835,7 @@
     return TransformElements(mgr, ty, transform, args[0], args[1]);
 }
 
-Eval::Result Eval::inverseSqrt(const type::Type* ty,
+Eval::Result Eval::inverseSqrt(const core::type::Type* ty,
                                VectorRef<const Value*> args,
                                const Source& source) {
     auto transform = [&](const Value* c0) {
@@ -2800,7 +2873,9 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::ldexp(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::ldexp(const core::type::Type* ty,
+                         VectorRef<const Value*> args,
+                         const Source& source) {
     auto transform = [&](const Value* c1, size_t index) {
         auto create = [&](auto e1) -> Eval::Result {
             using E1Type = decltype(e1);
@@ -2809,7 +2884,7 @@
 
             E2Type e2;
             auto* c2 = args[1];
-            if (c2->Type()->Is<type::Vector>()) {
+            if (c2->Type()->Is<core::type::Vector>()) {
                 e2 = c2->Index(index)->ValueAs<E2Type>();
             } else {
                 e2 = c2->ValueAs<E2Type>();
@@ -2844,7 +2919,7 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::length(const type::Type* ty,
+Eval::Result Eval::length(const core::type::Type* ty,
                           VectorRef<const Value*> args,
                           const Source& source) {
     auto r = Length(source, ty, args[0]);
@@ -2854,7 +2929,9 @@
     return r;
 }
 
-Eval::Result Eval::log(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::log(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source) {
     auto transform = [&](const Value* c0) {
         auto create = [&](auto v) -> Eval::Result {
             using NumberT = decltype(v);
@@ -2873,7 +2950,9 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::log2(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::log2(const core::type::Type* ty,
+                        VectorRef<const Value*> args,
+                        const Source& source) {
     auto transform = [&](const Value* c0) {
         auto create = [&](auto v) -> Eval::Result {
             using NumberT = decltype(v);
@@ -2892,7 +2971,9 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::max(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::max(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1) {
         auto create = [&](auto e0, auto e1) {
             return CreateScalar(source, c0->Type(), decltype(e0)(std::max(e0, e1)));
@@ -2902,7 +2983,9 @@
     return TransformElements(mgr, ty, transform, args[0], args[1]);
 }
 
-Eval::Result Eval::min(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::min(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1) {
         auto create = [&](auto e0, auto e1) {
             return CreateScalar(source, c0->Type(), decltype(e0)(std::min(e0, e1)));
@@ -2912,14 +2995,16 @@
     return TransformElements(mgr, ty, transform, args[0], args[1]);
 }
 
-Eval::Result Eval::mix(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::mix(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1, size_t index) {
         auto create = [&](auto e1, auto e2) -> Eval::Result {
             using NumberT = decltype(e1);
             // e3 is either a vector or a scalar
             NumberT e3;
             auto* c2 = args[2];
-            if (c2->Type()->Is<type::Vector>()) {
+            if (c2->Type()->Is<core::type::Vector>()) {
                 e3 = c2->Index(index)->ValueAs<NumberT>();
             } else {
                 e3 = c2->ValueAs<NumberT>();
@@ -2953,7 +3038,9 @@
     return r;
 }
 
-Eval::Result Eval::modf(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::modf(const core::type::Type* ty,
+                        VectorRef<const Value*> args,
+                        const Source& source) {
     auto transform_fract = [&](const Value* c) {
         auto create = [&](auto e) {
             return CreateScalar(source, c->Type(), decltype(e)(e.value - std::trunc(e.value)));
@@ -2984,7 +3071,7 @@
     return mgr.Composite(ty, std::move(fields));
 }
 
-Eval::Result Eval::normalize(const type::Type* ty,
+Eval::Result Eval::normalize(const core::type::Type* ty,
                              VectorRef<const Value*> args,
                              const Source& source) {
     auto* len_ty = ty->DeepestElement();
@@ -3005,7 +3092,7 @@
     return Divide(ty, Vector{args[0], v}, source);
 }
 
-Eval::Result Eval::pack2x16float(const type::Type* ty,
+Eval::Result Eval::pack2x16float(const core::type::Type* ty,
                                  VectorRef<const Value*> args,
                                  const Source& source) {
     auto convert = [&](f32 val) -> tint::Result<uint32_t> {
@@ -3037,7 +3124,7 @@
     return CreateScalar(source, ty, ret);
 }
 
-Eval::Result Eval::pack2x16snorm(const type::Type* ty,
+Eval::Result Eval::pack2x16snorm(const core::type::Type* ty,
                                  VectorRef<const Value*> args,
                                  const Source& source) {
     auto calc = [&](f32 val) -> u32 {
@@ -3054,7 +3141,7 @@
     return CreateScalar(source, ty, ret);
 }
 
-Eval::Result Eval::pack2x16unorm(const type::Type* ty,
+Eval::Result Eval::pack2x16unorm(const core::type::Type* ty,
                                  VectorRef<const Value*> args,
                                  const Source& source) {
     auto calc = [&](f32 val) -> u32 {
@@ -3070,7 +3157,7 @@
     return CreateScalar(source, ty, ret);
 }
 
-Eval::Result Eval::pack4x8snorm(const type::Type* ty,
+Eval::Result Eval::pack4x8snorm(const core::type::Type* ty,
                                 VectorRef<const Value*> args,
                                 const Source& source) {
     auto calc = [&](f32 val) -> u32 {
@@ -3090,7 +3177,7 @@
     return CreateScalar(source, ty, ret);
 }
 
-Eval::Result Eval::pack4x8unorm(const type::Type* ty,
+Eval::Result Eval::pack4x8unorm(const core::type::Type* ty,
                                 VectorRef<const Value*> args,
                                 const Source& source) {
     auto calc = [&](f32 val) -> u32 {
@@ -3109,7 +3196,9 @@
     return CreateScalar(source, ty, ret);
 }
 
-Eval::Result Eval::pow(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::pow(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1) {
         auto create = [&](auto e1, auto e2) -> Eval::Result {
             auto r = CheckedPow(e1, e2);
@@ -3128,7 +3217,7 @@
     return TransformElements(mgr, ty, transform, args[0], args[1]);
 }
 
-Eval::Result Eval::radians(const type::Type* ty,
+Eval::Result Eval::radians(const core::type::Type* ty,
                            VectorRef<const Value*> args,
                            const Source& source) {
     auto transform = [&](const Value* c0) {
@@ -3154,7 +3243,7 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::reflect(const type::Type* ty,
+Eval::Result Eval::reflect(const core::type::Type* ty,
                            VectorRef<const Value*> args,
                            const Source& source) {
     auto calculate = [&]() -> Eval::Result {
@@ -3162,7 +3251,7 @@
         // e1 - 2 * dot(e2, e1) * e2.
         auto* e1 = args[0];
         auto* e2 = args[1];
-        auto* vec_ty = ty->As<type::Vector>();
+        auto* vec_ty = ty->As<core::type::Vector>();
         auto* el_ty = vec_ty->type();
 
         // dot(e2, e1)
@@ -3197,10 +3286,10 @@
     return r;
 }
 
-Eval::Result Eval::refract(const type::Type* ty,
+Eval::Result Eval::refract(const core::type::Type* ty,
                            VectorRef<const Value*> args,
                            const Source& source) {
-    auto* vec_ty = ty->As<type::Vector>();
+    auto* vec_ty = ty->As<core::type::Vector>();
     auto* el_ty = vec_ty->type();
 
     auto compute_k = [&](auto e3, auto dot_e2_e1) -> Eval::Result {
@@ -3295,7 +3384,7 @@
     return r;
 }
 
-Eval::Result Eval::reverseBits(const type::Type* ty,
+Eval::Result Eval::reverseBits(const core::type::Type* ty,
                                VectorRef<const Value*> args,
                                const Source& source) {
     auto transform = [&](const Value* c0) {
@@ -3322,7 +3411,9 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::round(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::round(const core::type::Type* ty,
+                         VectorRef<const Value*> args,
+                         const Source& source) {
     auto transform = [&](const Value* c0) {
         auto create = [&](auto e) {
             using NumberT = decltype(e);
@@ -3356,7 +3447,7 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::saturate(const type::Type* ty,
+Eval::Result Eval::saturate(const core::type::Type* ty,
                             VectorRef<const Value*> args,
                             const Source& source) {
     auto transform = [&](const Value* c0) {
@@ -3370,7 +3461,7 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::select_bool(const type::Type* ty,
+Eval::Result Eval::select_bool(const core::type::Type* ty,
                                VectorRef<const Value*> args,
                                const Source& source) {
     auto cond = args[2]->ValueAs<bool>();
@@ -3384,7 +3475,7 @@
     return TransformElements(mgr, ty, transform, args[0], args[1]);
 }
 
-Eval::Result Eval::select_boolvec(const type::Type* ty,
+Eval::Result Eval::select_boolvec(const core::type::Type* ty,
                                   VectorRef<const Value*> args,
                                   const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1, size_t index) {
@@ -3399,7 +3490,9 @@
     return TransformElements(mgr, ty, transform, args[0], args[1]);
 }
 
-Eval::Result Eval::sign(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::sign(const core::type::Type* ty,
+                        VectorRef<const Value*> args,
+                        const Source& source) {
     auto transform = [&](const Value* c0) {
         auto create = [&](auto e) -> Eval::Result {
             using NumberT = decltype(e);
@@ -3419,7 +3512,9 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::sin(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::sin(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source) {
     auto transform = [&](const Value* c0) {
         auto create = [&](auto i) -> Eval::Result {
             using NumberT = decltype(i);
@@ -3430,7 +3525,9 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::sinh(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::sinh(const core::type::Type* ty,
+                        VectorRef<const Value*> args,
+                        const Source& source) {
     auto transform = [&](const Value* c0) {
         auto create = [&](auto i) -> Eval::Result {
             using NumberT = decltype(i);
@@ -3441,7 +3538,7 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::smoothstep(const type::Type* ty,
+Eval::Result Eval::smoothstep(const core::type::Type* ty,
                               VectorRef<const Value*> args,
                               const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1, const Value* c2) {
@@ -3491,7 +3588,9 @@
     return TransformElements(mgr, ty, transform, args[0], args[1], args[2]);
 }
 
-Eval::Result Eval::step(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::step(const core::type::Type* ty,
+                        VectorRef<const Value*> args,
+                        const Source& source) {
     auto transform = [&](const Value* c0, const Value* c1) {
         auto create = [&](auto edge, auto x) -> Eval::Result {
             using NumberT = decltype(edge);
@@ -3503,7 +3602,9 @@
     return TransformElements(mgr, ty, transform, args[0], args[1]);
 }
 
-Eval::Result Eval::sqrt(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::sqrt(const core::type::Type* ty,
+                        VectorRef<const Value*> args,
+                        const Source& source) {
     auto transform = [&](const Value* c0) {
         return Dispatch_fa_f32_f16(SqrtFunc(source, c0->Type()), c0);
     };
@@ -3511,7 +3612,9 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::tan(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::tan(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source) {
     auto transform = [&](const Value* c0) {
         auto create = [&](auto i) -> Eval::Result {
             using NumberT = decltype(i);
@@ -3522,7 +3625,9 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::tanh(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::tanh(const core::type::Type* ty,
+                        VectorRef<const Value*> args,
+                        const Source& source) {
     auto transform = [&](const Value* c0) {
         auto create = [&](auto i) -> Eval::Result {
             using NumberT = decltype(i);
@@ -3533,11 +3638,13 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::transpose(const type::Type* ty, VectorRef<const Value*> args, const Source&) {
+Eval::Result Eval::transpose(const core::type::Type* ty,
+                             VectorRef<const Value*> args,
+                             const Source&) {
     auto* m = args[0];
-    auto* mat_ty = m->Type()->As<type::Matrix>();
+    auto* mat_ty = m->Type()->As<core::type::Matrix>();
     auto me = [&](size_t r, size_t c) { return m->Index(c)->Index(r); };
-    auto* result_mat_ty = ty->As<type::Matrix>();
+    auto* result_mat_ty = ty->As<core::type::Matrix>();
 
     // Produce column vectors from each row
     Vector<const Value*, 4> result_mat;
@@ -3551,7 +3658,9 @@
     return mgr.Composite(ty, result_mat);
 }
 
-Eval::Result Eval::trunc(const type::Type* ty, VectorRef<const Value*> args, const Source& source) {
+Eval::Result Eval::trunc(const core::type::Type* ty,
+                         VectorRef<const Value*> args,
+                         const Source& source) {
     auto transform = [&](const Value* c0) {
         auto create = [&](auto i) {
             return CreateScalar(source, c0->Type(), decltype(i)(std::trunc(i.value)));
@@ -3561,7 +3670,7 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::unpack2x16float(const type::Type* ty,
+Eval::Result Eval::unpack2x16float(const core::type::Type* ty,
                                    VectorRef<const Value*> args,
                                    const Source& source) {
     auto* inner_ty = ty->DeepestElement();
@@ -3589,7 +3698,7 @@
     return mgr.Composite(ty, std::move(els));
 }
 
-Eval::Result Eval::unpack2x16snorm(const type::Type* ty,
+Eval::Result Eval::unpack2x16snorm(const core::type::Type* ty,
                                    VectorRef<const Value*> args,
                                    const Source& source) {
     auto* inner_ty = ty->DeepestElement();
@@ -3609,7 +3718,7 @@
     return mgr.Composite(ty, std::move(els));
 }
 
-Eval::Result Eval::unpack2x16unorm(const type::Type* ty,
+Eval::Result Eval::unpack2x16unorm(const core::type::Type* ty,
                                    VectorRef<const Value*> args,
                                    const Source& source) {
     auto* inner_ty = ty->DeepestElement();
@@ -3628,7 +3737,7 @@
     return mgr.Composite(ty, std::move(els));
 }
 
-Eval::Result Eval::unpack4x8snorm(const type::Type* ty,
+Eval::Result Eval::unpack4x8snorm(const core::type::Type* ty,
                                   VectorRef<const Value*> args,
                                   const Source& source) {
     auto* inner_ty = ty->DeepestElement();
@@ -3648,7 +3757,7 @@
     return mgr.Composite(ty, std::move(els));
 }
 
-Eval::Result Eval::unpack4x8unorm(const type::Type* ty,
+Eval::Result Eval::unpack4x8unorm(const core::type::Type* ty,
                                   VectorRef<const Value*> args,
                                   const Source& source) {
     auto* inner_ty = ty->DeepestElement();
@@ -3667,7 +3776,7 @@
     return mgr.Composite(ty, std::move(els));
 }
 
-Eval::Result Eval::quantizeToF16(const type::Type* ty,
+Eval::Result Eval::quantizeToF16(const core::type::Type* ty,
                                  VectorRef<const Value*> args,
                                  const Source& source) {
     auto transform = [&](const Value* c) -> Eval::Result {
@@ -3686,7 +3795,9 @@
     return TransformElements(mgr, ty, transform, args[0]);
 }
 
-Eval::Result Eval::Convert(const type::Type* target_ty, const Value* value, const Source& source) {
+Eval::Result Eval::Convert(const core::type::Type* target_ty,
+                           const Value* value,
+                           const Source& source) {
     if (value->Type() == target_ty) {
         return value;
     }
diff --git a/src/tint/lang/core/constant/eval.h b/src/tint/lang/core/constant/eval.h
index 6a81c42..035f353 100644
--- a/src/tint/lang/core/constant/eval.h
+++ b/src/tint/lang/core/constant/eval.h
@@ -16,6 +16,7 @@
 #define SRC_TINT_LANG_CORE_CONSTANT_EVAL_H_
 
 #include <stddef.h>
+#include <algorithm>
 #include <string>
 
 #include "src/tint/lang/core/number.h"
@@ -51,7 +52,7 @@
     using Result = tint::Result<const Value*>;
 
     /// Typedef for a constant evaluation function
-    using Function = Result (Eval::*)(const type::Type* result_ty,
+    using Function = Result (Eval::*)(const core::type::Type* result_ty,
                                       VectorRef<const Value*>,
                                       const Source&);
 
@@ -69,14 +70,14 @@
     /// @param ty the target type - must be an array or struct
     /// @param args the input arguments
     /// @return the constructed value, or null if the value cannot be calculated
-    Result ArrayOrStructCtor(const type::Type* ty, VectorRef<const Value*> args);
+    Result ArrayOrStructCtor(const core::type::Type* ty, VectorRef<const Value*> args);
 
     /// @param ty the target type
     /// @param value the value being converted
     /// @param source the source location
     /// @return the bit-cast of the given expression to the given type, or null if the value cannot
     ///         be calculated
-    Result Bitcast(const type::Type* ty, const Value* value, const Source& source);
+    Result Bitcast(const core::type::Type* ty, const Value* value, const Source& source);
 
     /// @param obj the object being indexed. May be null, in which case Index() will still validate
     /// the index is in bounds for the type.
@@ -85,7 +86,7 @@
     /// @param idx_source the source of the index expression
     /// @return the result of the index, or null if the value cannot be calculated
     Result Index(const Value* obj,
-                 const type::Type* obj_ty,
+                 const core::type::Type* obj_ty,
                  const Value* idx,
                  const Source& idx_source);
 
@@ -93,14 +94,14 @@
     /// @param vector the vector being swizzled
     /// @param indices the swizzle indices
     /// @return the result of the swizzle, or null if the value cannot be calculated
-    Result Swizzle(const type::Type* ty, const Value* vector, VectorRef<uint32_t> indices);
+    Result Swizzle(const core::type::Type* ty, const Value* vector, VectorRef<uint32_t> indices);
 
     /// Convert the `value` to `target_type`
     /// @param ty the result type
     /// @param value the value being converted
     /// @param source the source location
     /// @return the converted value, or null if the value cannot be calculated
-    Result Convert(const type::Type* ty, const Value* value, const Source& source);
+    Result Convert(const core::type::Type* ty, const Value* value, const Source& source);
 
     ////////////////////////////////////////////////////////////////////////////////////////////////
     // Constant value evaluation methods, to be indirectly called via the intrinsic table
@@ -111,56 +112,56 @@
     /// @param args the input arguments
     /// @param source the source location
     /// @return the converted value, or null if the value cannot be calculated
-    Result Conv(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result Conv(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// Zero value constructor
     /// @param ty the result type
     /// @param args the input arguments (no arguments provided)
     /// @param source the source location
     /// @return the constructed value, or null if the value cannot be calculated
-    Result Zero(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result Zero(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// Identity value constructor
     /// @param ty the result type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the constructed value, or null if the value cannot be calculated
-    Result Identity(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result Identity(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// Vector splat constructor
     /// @param ty the vector type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the constructed value, or null if the value cannot be calculated
-    Result VecSplat(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result VecSplat(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// Vector constructor using scalars
     /// @param ty the vector type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the constructed value, or null if the value cannot be calculated
-    Result VecInitS(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result VecInitS(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// Vector constructor using a mix of scalars and smaller vectors
     /// @param ty the vector type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the constructed value, or null if the value cannot be calculated
-    Result VecInitM(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result VecInitM(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// Matrix constructor using scalar values
     /// @param ty the matrix type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the constructed value, or null if the value cannot be calculated
-    Result MatInitS(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result MatInitS(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// Matrix constructor using column vectors
     /// @param ty the matrix type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the constructed value, or null if the value cannot be calculated
-    Result MatInitV(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result MatInitV(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     ////////////////////////////////////////////////////////////////////////////
     // Unary Operators
@@ -171,21 +172,25 @@
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result Complement(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result Complement(const core::type::Type* ty,
+                      VectorRef<const Value*> args,
+                      const Source& source);
 
     /// Unary minus operator '-'
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result UnaryMinus(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result UnaryMinus(const core::type::Type* ty,
+                      VectorRef<const Value*> args,
+                      const Source& source);
 
     /// Unary not operator '!'
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result Not(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result Not(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     ////////////////////////////////////////////////////////////////////////////
     // Binary Operators
@@ -196,98 +201,108 @@
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result Plus(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result Plus(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// Minus operator '-'
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result Minus(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result Minus(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// Multiply operator '*' for the same type on the LHS and RHS
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result Multiply(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result Multiply(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// Multiply operator '*' for matCxR<T> * vecC<T>
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result MultiplyMatVec(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result MultiplyMatVec(const core::type::Type* ty,
+                          VectorRef<const Value*> args,
+                          const Source& source);
 
     /// Multiply operator '*' for vecR<T> * matCxR<T>
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result MultiplyVecMat(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result MultiplyVecMat(const core::type::Type* ty,
+                          VectorRef<const Value*> args,
+                          const Source& source);
 
     /// Multiply operator '*' for matKxR<T> * matCxK<T>
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result MultiplyMatMat(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result MultiplyMatMat(const core::type::Type* ty,
+                          VectorRef<const Value*> args,
+                          const Source& source);
 
     /// Divide operator '/'
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result Divide(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result Divide(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// Modulo operator '%'
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result Modulo(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result Modulo(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// Equality operator '=='
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result Equal(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result Equal(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// Inequality operator '!='
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result NotEqual(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result NotEqual(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// Less than operator '<'
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result LessThan(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result LessThan(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// Greater than operator '>'
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result GreaterThan(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result GreaterThan(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source);
 
     /// Less than or equal operator '<='
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result LessThanEqual(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result LessThanEqual(const core::type::Type* ty,
+                         VectorRef<const Value*> args,
+                         const Source& source);
 
     /// Greater than or equal operator '>='
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result GreaterThanEqual(const type::Type* ty,
+    Result GreaterThanEqual(const core::type::Type* ty,
                             VectorRef<const Value*> args,
                             const Source& source);
 
@@ -296,49 +311,57 @@
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result LogicalAnd(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result LogicalAnd(const core::type::Type* ty,
+                      VectorRef<const Value*> args,
+                      const Source& source);
 
     /// Logical or operator '||'
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result LogicalOr(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result LogicalOr(const core::type::Type* ty,
+                     VectorRef<const Value*> args,
+                     const Source& source);
 
     /// Bitwise and operator '&'
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result And(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result And(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// Bitwise or operator '|'
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result Or(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result Or(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// Bitwise xor operator '^'
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result Xor(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result Xor(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// Bitwise shift left operator '<<'
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result ShiftLeft(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result ShiftLeft(const core::type::Type* ty,
+                     VectorRef<const Value*> args,
+                     const Source& source);
 
     /// Bitwise shift right operator '<<'
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result ShiftRight(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result ShiftRight(const core::type::Type* ty,
+                      VectorRef<const Value*> args,
+                      const Source& source);
 
     ////////////////////////////////////////////////////////////////////////////
     // Builtins
@@ -349,105 +372,105 @@
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result abs(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result abs(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// acos builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result acos(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result acos(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// acosh builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result acosh(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result acosh(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// all builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result all(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result all(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// any builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result any(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result any(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// asin builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result asin(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result asin(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// asinh builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result asinh(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result asinh(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// atan builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result atan(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result atan(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// atanh builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result atanh(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result atanh(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// atan2 builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result atan2(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result atan2(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// ceil builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result ceil(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result ceil(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// clamp builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result clamp(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result clamp(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// cos builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result cos(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result cos(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// cosh builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result cosh(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result cosh(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// countLeadingZeros builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result countLeadingZeros(const type::Type* ty,
+    Result countLeadingZeros(const core::type::Type* ty,
                              VectorRef<const Value*> args,
                              const Source& source);
 
@@ -456,14 +479,16 @@
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result countOneBits(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result countOneBits(const core::type::Type* ty,
+                        VectorRef<const Value*> args,
+                        const Source& source);
 
     /// countTrailingZeros builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result countTrailingZeros(const type::Type* ty,
+    Result countTrailingZeros(const core::type::Type* ty,
                               VectorRef<const Value*> args,
                               const Source& source);
 
@@ -472,70 +497,76 @@
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result cross(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result cross(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// degrees builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location of the conversion
     /// @return the result value, or null if the value cannot be calculated
-    Result degrees(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result degrees(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// determinant builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location of the conversion
     /// @return the result value, or null if the value cannot be calculated
-    Result determinant(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result determinant(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source);
 
     /// distance builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location of the conversion
     /// @return the result value, or null if the value cannot be calculated
-    Result distance(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result distance(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// dot builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result dot(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result dot(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// exp builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result exp(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result exp(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// exp2 builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result exp2(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result exp2(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// extractBits builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result extractBits(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result extractBits(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source);
 
     /// faceForward builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result faceForward(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result faceForward(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source);
 
     /// firstLeadingBit builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result firstLeadingBit(const type::Type* ty,
+    Result firstLeadingBit(const core::type::Type* ty,
                            VectorRef<const Value*> args,
                            const Source& source);
 
@@ -544,7 +575,7 @@
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result firstTrailingBit(const type::Type* ty,
+    Result firstTrailingBit(const core::type::Type* ty,
                             VectorRef<const Value*> args,
                             const Source& source);
 
@@ -553,282 +584,309 @@
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result floor(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result floor(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// fma builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result fma(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result fma(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// fract builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result fract(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result fract(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// frexp builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result frexp(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result frexp(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// insertBits builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result insertBits(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result insertBits(const core::type::Type* ty,
+                      VectorRef<const Value*> args,
+                      const Source& source);
 
     /// inverseSqrt builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result inverseSqrt(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result inverseSqrt(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source);
 
     /// ldexp builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result ldexp(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result ldexp(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// length builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result length(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result length(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// log builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result log(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result log(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// log2 builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result log2(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result log2(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// max builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result max(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result max(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// min builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result min(const type::Type* ty,  // NOLINT(build/include_what_you_use)  -- confused by min
-               VectorRef<const Value*> args,
-               const Source& source);
+    Result min(
+        const core::type::Type* ty,  // NOLINT(build/include_what_you_use)  -- confused by min
+        VectorRef<const Value*> args,
+        const Source& source);
 
     /// mix builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result mix(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result mix(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// modf builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result modf(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result modf(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// normalize builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result normalize(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result normalize(const core::type::Type* ty,
+                     VectorRef<const Value*> args,
+                     const Source& source);
 
     /// pack2x16float builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result pack2x16float(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result pack2x16float(const core::type::Type* ty,
+                         VectorRef<const Value*> args,
+                         const Source& source);
 
     /// pack2x16snorm builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result pack2x16snorm(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result pack2x16snorm(const core::type::Type* ty,
+                         VectorRef<const Value*> args,
+                         const Source& source);
 
     /// pack2x16unorm builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result pack2x16unorm(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result pack2x16unorm(const core::type::Type* ty,
+                         VectorRef<const Value*> args,
+                         const Source& source);
 
     /// pack4x8snorm builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result pack4x8snorm(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result pack4x8snorm(const core::type::Type* ty,
+                        VectorRef<const Value*> args,
+                        const Source& source);
 
     /// pack4x8unorm builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result pack4x8unorm(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result pack4x8unorm(const core::type::Type* ty,
+                        VectorRef<const Value*> args,
+                        const Source& source);
 
     /// pow builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result pow(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result pow(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// radians builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location of the conversion
     /// @return the result value, or null if the value cannot be calculated
-    Result radians(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result radians(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// reflect builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location of the conversion
     /// @return the result value, or null if the value cannot be calculated
-    Result reflect(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result reflect(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// refract builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location of the conversion
     /// @return the result value, or null if the value cannot be calculated
-    Result refract(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result refract(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// reverseBits builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result reverseBits(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result reverseBits(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source);
 
     /// round builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result round(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result round(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// saturate builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result saturate(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result saturate(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// select builtin with single bool third arg
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result select_bool(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result select_bool(const core::type::Type* ty,
+                       VectorRef<const Value*> args,
+                       const Source& source);
 
     /// select builtin with vector of bool third arg
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result select_boolvec(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result select_boolvec(const core::type::Type* ty,
+                          VectorRef<const Value*> args,
+                          const Source& source);
 
     /// sign builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result sign(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result sign(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// sin builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result sin(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result sin(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// sinh builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result sinh(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result sinh(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// smoothstep builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result smoothstep(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result smoothstep(const core::type::Type* ty,
+                      VectorRef<const Value*> args,
+                      const Source& source);
 
     /// step builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result step(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result step(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// sqrt builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result sqrt(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result sqrt(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// tan builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result tan(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result tan(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// tanh builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result tanh(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result tanh(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// transpose builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result transpose(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result transpose(const core::type::Type* ty,
+                     VectorRef<const Value*> args,
+                     const Source& source);
 
     /// trunc builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result trunc(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result trunc(const core::type::Type* ty, VectorRef<const Value*> args, const Source& source);
 
     /// unpack2x16float builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result unpack2x16float(const type::Type* ty,
+    Result unpack2x16float(const core::type::Type* ty,
                            VectorRef<const Value*> args,
                            const Source& source);
 
@@ -837,7 +895,7 @@
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result unpack2x16snorm(const type::Type* ty,
+    Result unpack2x16snorm(const core::type::Type* ty,
                            VectorRef<const Value*> args,
                            const Source& source);
 
@@ -846,7 +904,7 @@
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result unpack2x16unorm(const type::Type* ty,
+    Result unpack2x16unorm(const core::type::Type* ty,
                            VectorRef<const Value*> args,
                            const Source& source);
 
@@ -855,21 +913,27 @@
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result unpack4x8snorm(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result unpack4x8snorm(const core::type::Type* ty,
+                          VectorRef<const Value*> args,
+                          const Source& source);
 
     /// unpack4x8unorm builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result unpack4x8unorm(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result unpack4x8unorm(const core::type::Type* ty,
+                          VectorRef<const Value*> args,
+                          const Source& source);
 
     /// quantizeToF16 builtin
     /// @param ty the expression type
     /// @param args the input arguments
     /// @param source the source location
     /// @return the result value, or null if the value cannot be calculated
-    Result quantizeToF16(const type::Type* ty, VectorRef<const Value*> args, const Source& source);
+    Result quantizeToF16(const core::type::Type* ty,
+                         VectorRef<const Value*> args,
+                         const Source& source);
 
   private:
     /// Adds the given error message to the diagnostics
@@ -887,10 +951,10 @@
     /// @param v the scalar value
     /// @return the constant value with the same type and value
     template <typename T>
-    Eval::Result CreateScalar(const Source& source, const type::Type* t, T v);
+    Eval::Result CreateScalar(const Source& source, const core::type::Type* t, T v);
 
     /// ZeroValue returns a Constant for the zero-value of the type `type`.
-    const Value* ZeroValue(const type::Type* type);
+    const Value* ZeroValue(const core::type::Type* type);
 
     /// Adds two Number<T>s
     /// @param source the source location
@@ -1085,91 +1149,91 @@
     /// @param source the source location
     /// @param elem_ty the element type of the Constant to create on success
     /// @returns the callable function
-    auto AddFunc(const Source& source, const type::Type* elem_ty);
+    auto AddFunc(const Source& source, const core::type::Type* elem_ty);
 
     /// Returns a callable that calls Sub, and creates a Constant with its result of type `elem_ty`
     /// if successful, or returns Failure otherwise.
     /// @param source the source location
     /// @param elem_ty the element type of the Constant to create on success
     /// @returns the callable function
-    auto SubFunc(const Source& source, const type::Type* elem_ty);
+    auto SubFunc(const Source& source, const core::type::Type* elem_ty);
 
     /// Returns a callable that calls Mul, and creates a Constant with its result of type `elem_ty`
     /// if successful, or returns Failure otherwise.
     /// @param source the source location
     /// @param elem_ty the element type of the Constant to create on success
     /// @returns the callable function
-    auto MulFunc(const Source& source, const type::Type* elem_ty);
+    auto MulFunc(const Source& source, const core::type::Type* elem_ty);
 
     /// Returns a callable that calls Div, and creates a Constant with its result of type `elem_ty`
     /// if successful, or returns Failure otherwise.
     /// @param source the source location
     /// @param elem_ty the element type of the Constant to create on success
     /// @returns the callable function
-    auto DivFunc(const Source& source, const type::Type* elem_ty);
+    auto DivFunc(const Source& source, const core::type::Type* elem_ty);
 
     /// Returns a callable that calls Mod, and creates a Constant with its result of type `elem_ty`
     /// if successful, or returns Failure otherwise.
     /// @param source the source location
     /// @param elem_ty the element type of the Constant to create on success
     /// @returns the callable function
-    auto ModFunc(const Source& source, const type::Type* elem_ty);
+    auto ModFunc(const Source& source, const core::type::Type* elem_ty);
 
     /// Returns a callable that calls Dot2, and creates a Constant with its result of type `elem_ty`
     /// if successful, or returns Failure otherwise.
     /// @param source the source location
     /// @param elem_ty the element type of the Constant to create on success
     /// @returns the callable function
-    auto Dot2Func(const Source& source, const type::Type* elem_ty);
+    auto Dot2Func(const Source& source, const core::type::Type* elem_ty);
 
     /// Returns a callable that calls Dot3, and creates a Constant with its result of type `elem_ty`
     /// if successful, or returns Failure otherwise.
     /// @param source the source location
     /// @param elem_ty the element type of the Constant to create on success
     /// @returns the callable function
-    auto Dot3Func(const Source& source, const type::Type* elem_ty);
+    auto Dot3Func(const Source& source, const core::type::Type* elem_ty);
 
     /// Returns a callable that calls Dot4, and creates a Constant with its result of type `elem_ty`
     /// if successful, or returns Failure otherwise.
     /// @param source the source location
     /// @param elem_ty the element type of the Constant to create on success
     /// @returns the callable function
-    auto Dot4Func(const Source& source, const type::Type* elem_ty);
+    auto Dot4Func(const Source& source, const core::type::Type* elem_ty);
 
     /// Returns a callable that calls Det2, and creates a Constant with its result of type `elem_ty`
     /// if successful, or returns Failure otherwise.
     /// @param source the source location
     /// @param elem_ty the element type of the Constant to create on success
     /// @returns the callable function
-    auto Det2Func(const Source& source, const type::Type* elem_ty);
+    auto Det2Func(const Source& source, const core::type::Type* elem_ty);
 
     /// Returns a callable that calls Det3, and creates a Constant with its result of type `elem_ty`
     /// if successful, or returns Failure otherwise.
     /// @param source the source location
     /// @param elem_ty the element type of the Constant to create on success
     /// @returns the callable function
-    auto Det3Func(const Source& source, const type::Type* elem_ty);
+    auto Det3Func(const Source& source, const core::type::Type* elem_ty);
 
     /// Returns a callable that calls Det4, and creates a Constant with its result of type `elem_ty`
     /// if successful, or returns Failure otherwise.
     /// @param source the source location
     /// @param elem_ty the element type of the Constant to create on success
     /// @returns the callable function
-    auto Det4Func(const Source& source, const type::Type* elem_ty);
+    auto Det4Func(const Source& source, const core::type::Type* elem_ty);
 
     /// Returns a callable that calls Clamp, and creates a Constant with its result of type
     /// `elem_ty` if successful, or returns Failure otherwise.
     /// @param source the source location
     /// @param elem_ty the element type of the Constant to create on success
     /// @returns the callable function
-    auto ClampFunc(const Source& source, const type::Type* elem_ty);
+    auto ClampFunc(const Source& source, const core::type::Type* elem_ty);
 
     /// Returns a callable that calls SqrtFunc, and creates a Constant with its
     /// result of type `elem_ty` if successful, or returns Failure otherwise.
     /// @param source the source location
     /// @param elem_ty the element type of the Constant to create on success
     /// @returns the callable function
-    auto SqrtFunc(const Source& source, const type::Type* elem_ty);
+    auto SqrtFunc(const Source& source, const core::type::Type* elem_ty);
 
     /// Returns the dot product of v1 and v2.
     /// @param source the source location
@@ -1183,7 +1247,7 @@
     /// @param ty the return type
     /// @param c0 the constant to calculate the length of
     /// @returns the length of c0
-    Result Length(const Source& source, const type::Type* ty, const Value* c0);
+    Result Length(const Source& source, const core::type::Type* ty, const Value* c0);
 
     /// Returns the product of v1 and v2
     /// @param source the source location
@@ -1191,7 +1255,7 @@
     /// @param v1 lhs value
     /// @param v2 rhs value
     /// @returns the product of v1 and v2
-    Result Mul(const Source& source, const type::Type* ty, const Value* v1, const Value* v2);
+    Result Mul(const Source& source, const core::type::Type* ty, const Value* v1, const Value* v2);
 
     /// Returns the difference between v2 and v1
     /// @param source the source location
@@ -1199,7 +1263,7 @@
     /// @param v1 lhs value
     /// @param v2 rhs value
     /// @returns the difference between v2 and v1
-    Result Sub(const Source& source, const type::Type* ty, const Value* v1, const Value* v2);
+    Result Sub(const Source& source, const core::type::Type* ty, const Value* v1, const Value* v2);
 
   private:
     Manager& mgr;
diff --git a/src/tint/lang/core/constant/eval_binary_op_test.cc b/src/tint/lang/core/constant/eval_binary_op_test.cc
index 89e2247..8eff2f8 100644
--- a/src/tint/lang/core/constant/eval_binary_op_test.cc
+++ b/src/tint/lang/core/constant/eval_binary_op_test.cc
@@ -1195,7 +1195,7 @@
     auto* sem2 = Sem().Get(expr2);
     ASSERT_NE(sem2, nullptr);
 
-    auto aint_ty = create<type::AbstractInt>();
+    auto aint_ty = create<core::type::AbstractInt>();
     EXPECT_EQ(sem1->Type(), aint_ty);
     EXPECT_EQ(sem2->Type(), aint_ty);
 }
diff --git a/src/tint/lang/core/constant/eval_builtin_test.cc b/src/tint/lang/core/constant/eval_builtin_test.cc
index 75d1c11..22e8bf4 100644
--- a/src/tint/lang/core/constant/eval_builtin_test.cc
+++ b/src/tint/lang/core/constant/eval_builtin_test.cc
@@ -166,7 +166,7 @@
         ASSERT_NE(value, nullptr);
         EXPECT_TYPE(value->Type(), sem->Type());
 
-        if (value->Type()->Is<type::Struct>()) {
+        if (value->Type()->Is<core::type::Struct>()) {
             // The result type of the constant-evaluated expression is a structure.
             // Compare each of the fields individually.
             for (size_t i = 0; i < expected_case.values.Length(); i++) {
diff --git a/src/tint/lang/core/constant/eval_construction_test.cc b/src/tint/lang/core/constant/eval_construction_test.cc
index e5c7b3d..4e9ae4ea 100644
--- a/src/tint/lang/core/constant/eval_construction_test.cc
+++ b/src/tint/lang/core/constant/eval_construction_test.cc
@@ -29,7 +29,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    EXPECT_TRUE(sem->Type()->Is<type::AbstractFloat>());
+    EXPECT_TRUE(sem->Type()->Is<core::type::AbstractFloat>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->AllZero());
@@ -45,7 +45,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    EXPECT_TRUE(sem->Type()->Is<type::AbstractInt>());
+    EXPECT_TRUE(sem->Type()->Is<core::type::AbstractInt>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->AllZero());
@@ -60,7 +60,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    EXPECT_TRUE(sem->Type()->Is<type::I32>());
+    EXPECT_TRUE(sem->Type()->Is<core::type::I32>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->AllZero());
@@ -75,7 +75,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    EXPECT_TRUE(sem->Type()->Is<type::U32>());
+    EXPECT_TRUE(sem->Type()->Is<core::type::U32>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->AllZero());
@@ -90,7 +90,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    EXPECT_TRUE(sem->Type()->Is<type::F32>());
+    EXPECT_TRUE(sem->Type()->Is<core::type::F32>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->AllZero());
@@ -107,7 +107,7 @@
 
     auto* sem = Sem().Get(expr);
     EXPECT_NE(sem, nullptr);
-    EXPECT_TRUE(sem->Type()->Is<type::F16>());
+    EXPECT_TRUE(sem->Type()->Is<core::type::F16>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->AllZero());
@@ -123,7 +123,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    EXPECT_TRUE(sem->Type()->Is<type::Bool>());
+    EXPECT_TRUE(sem->Type()->Is<core::type::Bool>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->AllZero());
@@ -155,16 +155,16 @@
     EXPECT_TRUE(sem->ConstantValue()->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->AllZero());
 
-    if (sem->Type()->Is<type::Scalar>()) {
+    if (sem->Type()->Is<core::type::Scalar>()) {
         EXPECT_EQ(sem->ConstantValue()->Index(0), nullptr);
         EXPECT_EQ(sem->ConstantValue()->ValueAs<f32>(), 0.0f);
-    } else if (auto* vec = sem->Type()->As<type::Vector>()) {
+    } else if (auto* vec = sem->Type()->As<core::type::Vector>()) {
         for (size_t i = 0; i < vec->Width(); ++i) {
             EXPECT_TRUE(sem->ConstantValue()->Index(i)->AnyZero());
             EXPECT_TRUE(sem->ConstantValue()->Index(i)->AllZero());
             EXPECT_EQ(sem->ConstantValue()->Index(i)->ValueAs<f32>(), 0.0f);
         }
-    } else if (auto* mat = sem->Type()->As<type::Matrix>()) {
+    } else if (auto* mat = sem->Type()->As<core::type::Matrix>()) {
         for (size_t i = 0; i < mat->columns(); ++i) {
             EXPECT_TRUE(sem->ConstantValue()->Index(i)->AnyZero());
             EXPECT_TRUE(sem->ConstantValue()->Index(i)->AllZero());
@@ -174,7 +174,7 @@
                 EXPECT_EQ(sem->ConstantValue()->Index(i)->Index(j)->ValueAs<f32>(), 0.0f);
             }
         }
-    } else if (auto* arr = sem->Type()->As<type::Array>()) {
+    } else if (auto* arr = sem->Type()->As<core::type::Array>()) {
         for (size_t i = 0; i < *(arr->ConstantCount()); ++i) {
             EXPECT_TRUE(sem->ConstantValue()->Index(i)->AnyZero());
             EXPECT_TRUE(sem->ConstantValue()->Index(i)->AllZero());
@@ -216,9 +216,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::I32>());
+    EXPECT_TRUE(vec->type()->Is<core::type::I32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AnyZero());
@@ -245,9 +245,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::U32>());
+    EXPECT_TRUE(vec->type()->Is<core::type::U32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AnyZero());
@@ -274,9 +274,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::F32>());
+    EXPECT_TRUE(vec->type()->Is<core::type::F32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AnyZero());
@@ -305,9 +305,9 @@
 
     auto* sem = Sem().Get(expr);
     EXPECT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::F16>());
+    EXPECT_TRUE(vec->type()->Is<core::type::F16>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AnyZero());
@@ -334,9 +334,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::Bool>());
+    EXPECT_TRUE(vec->type()->Is<core::type::Bool>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AnyZero());
@@ -363,9 +363,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::I32>());
+    EXPECT_TRUE(vec->type()->Is<core::type::I32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -392,9 +392,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::U32>());
+    EXPECT_TRUE(vec->type()->Is<core::type::U32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -421,9 +421,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::F32>());
+    EXPECT_TRUE(vec->type()->Is<core::type::F32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -452,9 +452,9 @@
 
     auto* sem = Sem().Get(expr);
     EXPECT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::F16>());
+    EXPECT_TRUE(vec->type()->Is<core::type::F16>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -482,9 +482,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::Bool>());
+    EXPECT_TRUE(vec->type()->Is<core::type::Bool>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -512,9 +512,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::AbstractInt>());
+    EXPECT_TRUE(vec->type()->Is<core::type::AbstractInt>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -542,9 +542,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::AbstractFloat>());
+    EXPECT_TRUE(vec->type()->Is<core::type::AbstractFloat>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -571,9 +571,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::I32>());
+    EXPECT_TRUE(vec->type()->Is<core::type::I32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -600,9 +600,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::U32>());
+    EXPECT_TRUE(vec->type()->Is<core::type::U32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -629,9 +629,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::F32>());
+    EXPECT_TRUE(vec->type()->Is<core::type::F32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -660,9 +660,9 @@
 
     auto* sem = Sem().Get(expr);
     EXPECT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::F16>());
+    EXPECT_TRUE(vec->type()->Is<core::type::F16>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -689,9 +689,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::Bool>());
+    EXPECT_TRUE(vec->type()->Is<core::type::Bool>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AnyZero());
@@ -718,9 +718,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::I32>());
+    EXPECT_TRUE(vec->type()->Is<core::type::I32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -747,9 +747,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::U32>());
+    EXPECT_TRUE(vec->type()->Is<core::type::U32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -776,9 +776,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::F32>());
+    EXPECT_TRUE(vec->type()->Is<core::type::F32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -805,9 +805,9 @@
 
     auto* sem = Sem().Get(expr);
     EXPECT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::F32>());
+    EXPECT_TRUE(vec->type()->Is<core::type::F32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -834,9 +834,9 @@
 
     auto* sem = Sem().Get(expr);
     EXPECT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::F32>());
+    EXPECT_TRUE(vec->type()->Is<core::type::F32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AnyZero());
@@ -863,9 +863,9 @@
 
     auto* sem = Sem().Get(expr);
     EXPECT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::F32>());
+    EXPECT_TRUE(vec->type()->Is<core::type::F32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -892,9 +892,9 @@
 
     auto* sem = Sem().Get(expr);
     EXPECT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::F32>());
+    EXPECT_TRUE(vec->type()->Is<core::type::F32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AnyZero());
@@ -923,9 +923,9 @@
 
     auto* sem = Sem().Get(expr);
     EXPECT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::F16>());
+    EXPECT_TRUE(vec->type()->Is<core::type::F16>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -954,9 +954,9 @@
 
     auto* sem = Sem().Get(expr);
     EXPECT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::F16>());
+    EXPECT_TRUE(vec->type()->Is<core::type::F16>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -985,9 +985,9 @@
 
     auto* sem = Sem().Get(expr);
     EXPECT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::F16>());
+    EXPECT_TRUE(vec->type()->Is<core::type::F16>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AnyZero());
@@ -1016,9 +1016,9 @@
 
     auto* sem = Sem().Get(expr);
     EXPECT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::F16>());
+    EXPECT_TRUE(vec->type()->Is<core::type::F16>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -1047,9 +1047,9 @@
 
     auto* sem = Sem().Get(expr);
     EXPECT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::F16>());
+    EXPECT_TRUE(vec->type()->Is<core::type::F16>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AnyZero());
@@ -1076,9 +1076,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::Bool>());
+    EXPECT_TRUE(vec->type()->Is<core::type::Bool>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AnyZero());
@@ -1105,9 +1105,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::Bool>());
+    EXPECT_TRUE(vec->type()->Is<core::type::Bool>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -1134,9 +1134,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::Bool>());
+    EXPECT_TRUE(vec->type()->Is<core::type::Bool>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AnyZero());
@@ -1163,9 +1163,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* mat = sem->Type()->As<type::Matrix>();
+    auto* mat = sem->Type()->As<core::type::Matrix>();
     ASSERT_NE(mat, nullptr);
-    EXPECT_TRUE(mat->type()->Is<type::F32>());
+    EXPECT_TRUE(mat->type()->Is<core::type::F32>());
     EXPECT_EQ(mat->columns(), 2u);
     EXPECT_EQ(mat->rows(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
@@ -1207,9 +1207,9 @@
 
     auto* sem = Sem().Get(expr);
     EXPECT_NE(sem, nullptr);
-    auto* mat = sem->Type()->As<type::Matrix>();
+    auto* mat = sem->Type()->As<core::type::Matrix>();
     ASSERT_NE(mat, nullptr);
-    EXPECT_TRUE(mat->type()->Is<type::F16>());
+    EXPECT_TRUE(mat->type()->Is<core::type::F16>());
     EXPECT_EQ(mat->columns(), 2u);
     EXPECT_EQ(mat->rows(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
@@ -1249,9 +1249,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* mat = sem->Type()->As<type::Matrix>();
+    auto* mat = sem->Type()->As<core::type::Matrix>();
     ASSERT_NE(mat, nullptr);
-    EXPECT_TRUE(mat->type()->Is<type::F32>());
+    EXPECT_TRUE(mat->type()->Is<core::type::F32>());
     EXPECT_EQ(mat->columns(), 3u);
     EXPECT_EQ(mat->rows(), 2u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
@@ -1294,9 +1294,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* mat = sem->Type()->As<type::Matrix>();
+    auto* mat = sem->Type()->As<core::type::Matrix>();
     ASSERT_NE(mat, nullptr);
-    EXPECT_TRUE(mat->type()->Is<type::F32>());
+    EXPECT_TRUE(mat->type()->Is<core::type::F32>());
     EXPECT_EQ(mat->columns(), 3u);
     EXPECT_EQ(mat->rows(), 2u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
@@ -1336,9 +1336,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* arr = sem->Type()->As<type::Array>();
+    auto* arr = sem->Type()->As<core::type::Array>();
     ASSERT_NE(arr, nullptr);
-    EXPECT_TRUE(arr->ElemType()->Is<type::I32>());
+    EXPECT_TRUE(arr->ElemType()->Is<core::type::I32>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->AllZero());
@@ -1368,9 +1368,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* arr = sem->Type()->As<type::Array>();
+    auto* arr = sem->Type()->As<core::type::Array>();
     ASSERT_NE(arr, nullptr);
-    EXPECT_TRUE(arr->ElemType()->Is<type::F32>());
+    EXPECT_TRUE(arr->ElemType()->Is<core::type::F32>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->AllZero());
@@ -1400,9 +1400,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* arr = sem->Type()->As<type::Array>();
+    auto* arr = sem->Type()->As<core::type::Array>();
     ASSERT_NE(arr, nullptr);
-    EXPECT_TRUE(arr->ElemType()->Is<type::Vector>());
+    EXPECT_TRUE(arr->ElemType()->Is<core::type::Vector>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->AllZero());
@@ -1444,9 +1444,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* arr = sem->Type()->As<type::Array>();
+    auto* arr = sem->Type()->As<core::type::Array>();
     ASSERT_NE(arr, nullptr);
-    EXPECT_TRUE(arr->ElemType()->Is<type::Struct>());
+    EXPECT_TRUE(arr->ElemType()->Is<core::type::Struct>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->AllZero());
@@ -1476,9 +1476,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* arr = sem->Type()->As<type::Array>();
+    auto* arr = sem->Type()->As<core::type::Array>();
     ASSERT_NE(arr, nullptr);
-    EXPECT_TRUE(arr->ElemType()->Is<type::I32>());
+    EXPECT_TRUE(arr->ElemType()->Is<core::type::I32>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->AllZero());
@@ -1523,7 +1523,7 @@
 
     auto* sem = Sem().GetVal(expr);
     ASSERT_NE(sem, nullptr);
-    auto* arr = sem->Type()->As<type::Array>();
+    auto* arr = sem->Type()->As<core::type::Array>();
     ASSERT_NE(arr, nullptr);
 
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
@@ -1568,10 +1568,10 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* outer_arr = sem->Type()->As<type::Array>();
+    auto* outer_arr = sem->Type()->As<core::type::Array>();
     ASSERT_NE(outer_arr, nullptr);
-    EXPECT_TRUE(outer_arr->ElemType()->Is<type::Array>());
-    EXPECT_TRUE(outer_arr->ElemType()->As<type::Array>()->ElemType()->Is<type::F32>());
+    EXPECT_TRUE(outer_arr->ElemType()->Is<core::type::Array>());
+    EXPECT_TRUE(outer_arr->ElemType()->As<core::type::Array>()->ElemType()->Is<core::type::F32>());
 
     auto* arr = sem->ConstantValue();
     EXPECT_FALSE(arr->AnyZero());
@@ -1600,9 +1600,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* arr = sem->Type()->As<type::Array>();
+    auto* arr = sem->Type()->As<core::type::Array>();
     ASSERT_NE(arr, nullptr);
-    EXPECT_TRUE(arr->ElemType()->Is<type::F32>());
+    EXPECT_TRUE(arr->ElemType()->Is<core::type::F32>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->AllZero());
@@ -1633,9 +1633,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* arr = sem->Type()->As<type::Array>();
+    auto* arr = sem->Type()->As<core::type::Array>();
     ASSERT_NE(arr, nullptr);
-    EXPECT_TRUE(arr->ElemType()->Is<type::Vector>());
+    EXPECT_TRUE(arr->ElemType()->Is<core::type::Vector>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->AllZero());
@@ -1661,9 +1661,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* arr = sem->Type()->As<type::Array>();
+    auto* arr = sem->Type()->As<core::type::Array>();
     ASSERT_NE(arr, nullptr);
-    EXPECT_TRUE(arr->ElemType()->Is<type::Struct>());
+    EXPECT_TRUE(arr->ElemType()->Is<core::type::Struct>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->AllZero());
@@ -1703,7 +1703,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* str = sem->Type()->As<type::Struct>();
+    auto* str = sem->Type()->As<core::type::Struct>();
     ASSERT_NE(str, nullptr);
     EXPECT_EQ(str->Members().Length(), 5u);
 
@@ -1711,15 +1711,15 @@
     EXPECT_TRUE(sem->ConstantValue()->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->AllZero());
 
-    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<type::I32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<core::type::I32>());
     EXPECT_EQ(sem->ConstantValue()->Index(0)->ValueAs<i32>(), 0);
-    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<type::U32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<core::type::U32>());
     EXPECT_EQ(sem->ConstantValue()->Index(1)->ValueAs<u32>(), 0u);
-    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<type::F32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<core::type::F32>());
     EXPECT_EQ(sem->ConstantValue()->Index(2)->ValueAs<f32>(), 0.0f);
-    EXPECT_TRUE(sem->ConstantValue()->Index(3)->Type()->Is<type::F16>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(3)->Type()->Is<core::type::F16>());
     EXPECT_EQ(sem->ConstantValue()->Index(3)->ValueAs<f16>(), 0.0f);
-    EXPECT_TRUE(sem->ConstantValue()->Index(4)->Type()->Is<type::Bool>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(4)->Type()->Is<core::type::Bool>());
     EXPECT_EQ(sem->ConstantValue()->Index(4)->ValueAs<bool>(), false);
 
     for (size_t i = 0; i < str->Members().Length(); ++i) {
@@ -1750,7 +1750,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* str = sem->Type()->As<type::Struct>();
+    auto* str = sem->Type()->As<core::type::Struct>();
     ASSERT_NE(str, nullptr);
     EXPECT_EQ(str->Members().Length(), 1u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
@@ -1761,15 +1761,15 @@
     EXPECT_TRUE(inner_struct->AnyZero());
     EXPECT_TRUE(inner_struct->AllZero());
 
-    EXPECT_TRUE(inner_struct->Index(0)->Type()->Is<type::I32>());
+    EXPECT_TRUE(inner_struct->Index(0)->Type()->Is<core::type::I32>());
     EXPECT_EQ(inner_struct->Index(0)->ValueAs<i32>(), 0);
-    EXPECT_TRUE(inner_struct->Index(1)->Type()->Is<type::U32>());
+    EXPECT_TRUE(inner_struct->Index(1)->Type()->Is<core::type::U32>());
     EXPECT_EQ(inner_struct->Index(1)->ValueAs<u32>(), 0u);
-    EXPECT_TRUE(inner_struct->Index(2)->Type()->Is<type::F32>());
+    EXPECT_TRUE(inner_struct->Index(2)->Type()->Is<core::type::F32>());
     EXPECT_EQ(inner_struct->Index(2)->ValueAs<f32>(), 0.0f);
-    EXPECT_TRUE(inner_struct->Index(3)->Type()->Is<type::F16>());
+    EXPECT_TRUE(inner_struct->Index(3)->Type()->Is<core::type::F16>());
     EXPECT_EQ(inner_struct->Index(3)->ValueAs<f16>(), 0.0f);
-    EXPECT_TRUE(inner_struct->Index(4)->Type()->Is<type::Bool>());
+    EXPECT_TRUE(inner_struct->Index(4)->Type()->Is<core::type::Bool>());
     EXPECT_EQ(inner_struct->Index(4)->ValueAs<bool>(), false);
 
     for (size_t i = 0; i < str->Members().Length(); ++i) {
@@ -1787,7 +1787,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* str = sem->Type()->As<type::Struct>();
+    auto* str = sem->Type()->As<core::type::Struct>();
     ASSERT_NE(str, nullptr);
     EXPECT_EQ(str->Members().Length(), 3u);
     ASSERT_NE(sem->ConstantValue(), nullptr);
@@ -1797,17 +1797,17 @@
 
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<type::I32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<core::type::I32>());
     EXPECT_EQ(sem->ConstantValue()->Index(0)->ValueAs<i32>(), 0_i);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<type::I32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<core::type::I32>());
     EXPECT_EQ(sem->ConstantValue()->Index(1)->ValueAs<i32>(), 0_i);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(2)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(2)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<type::I32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<core::type::I32>());
     EXPECT_EQ(sem->ConstantValue()->Index(2)->ValueAs<i32>(), 0_i);
 }
 
@@ -1828,7 +1828,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* str = sem->Type()->As<type::Struct>();
+    auto* str = sem->Type()->As<core::type::Struct>();
     ASSERT_NE(str, nullptr);
     EXPECT_EQ(str->Members().Length(), 5u);
     ASSERT_NE(sem->ConstantValue(), nullptr);
@@ -1838,27 +1838,27 @@
 
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<type::I32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<core::type::I32>());
     EXPECT_EQ(sem->ConstantValue()->Index(0)->ValueAs<i32>(), 0_i);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<type::U32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<core::type::U32>());
     EXPECT_EQ(sem->ConstantValue()->Index(1)->ValueAs<u32>(), 0_u);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(2)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(2)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<type::F32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<core::type::F32>());
     EXPECT_EQ(sem->ConstantValue()->Index(2)->ValueAs<f32>(), 0._f);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(3)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(3)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(3)->Type()->Is<type::F16>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(3)->Type()->Is<core::type::F16>());
     EXPECT_EQ(sem->ConstantValue()->Index(3)->ValueAs<f16>(), 0._h);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(4)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(4)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(4)->Type()->Is<type::Bool>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(4)->Type()->Is<core::type::Bool>());
     EXPECT_EQ(sem->ConstantValue()->Index(4)->ValueAs<bool>(), false);
 }
 
@@ -1875,7 +1875,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* str = sem->Type()->As<type::Struct>();
+    auto* str = sem->Type()->As<core::type::Struct>();
     ASSERT_NE(str, nullptr);
     EXPECT_EQ(str->Members().Length(), 3u);
     ASSERT_NE(sem->ConstantValue(), nullptr);
@@ -1885,27 +1885,39 @@
 
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<type::Vector>());
-    EXPECT_TRUE(
-        sem->ConstantValue()->Index(0)->Type()->As<type::Vector>()->type()->Is<type::F32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(sem->ConstantValue()
+                    ->Index(0)
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::F32>());
     EXPECT_EQ(sem->ConstantValue()->Index(0)->Index(0)->ValueAs<f32>(), 0._f);
     EXPECT_EQ(sem->ConstantValue()->Index(0)->Index(1)->ValueAs<f32>(), 0._f);
     EXPECT_EQ(sem->ConstantValue()->Index(0)->Index(2)->ValueAs<f32>(), 0._f);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<type::Vector>());
-    EXPECT_TRUE(
-        sem->ConstantValue()->Index(1)->Type()->As<type::Vector>()->type()->Is<type::F32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(sem->ConstantValue()
+                    ->Index(1)
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::F32>());
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(0)->ValueAs<f32>(), 0._f);
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(1)->ValueAs<f32>(), 0._f);
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(2)->ValueAs<f32>(), 0._f);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(2)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(2)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<type::Vector>());
-    EXPECT_TRUE(
-        sem->ConstantValue()->Index(2)->Type()->As<type::Vector>()->type()->Is<type::F32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(sem->ConstantValue()
+                    ->Index(2)
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::F32>());
     EXPECT_EQ(sem->ConstantValue()->Index(2)->Index(0)->ValueAs<f32>(), 0._f);
     EXPECT_EQ(sem->ConstantValue()->Index(2)->Index(1)->ValueAs<f32>(), 0._f);
     EXPECT_EQ(sem->ConstantValue()->Index(2)->Index(2)->ValueAs<f32>(), 0._f);
@@ -1928,7 +1940,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* str = sem->Type()->As<type::Struct>();
+    auto* str = sem->Type()->As<core::type::Struct>();
     ASSERT_NE(str, nullptr);
     EXPECT_EQ(str->Members().Length(), 5u);
     ASSERT_NE(sem->ConstantValue(), nullptr);
@@ -1938,26 +1950,38 @@
 
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<type::Vector>());
-    EXPECT_TRUE(
-        sem->ConstantValue()->Index(0)->Type()->As<type::Vector>()->type()->Is<type::I32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(sem->ConstantValue()
+                    ->Index(0)
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::I32>());
     EXPECT_EQ(sem->ConstantValue()->Index(0)->Index(0)->ValueAs<i32>(), 0_i);
     EXPECT_EQ(sem->ConstantValue()->Index(0)->Index(1)->ValueAs<i32>(), 0_i);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<type::Vector>());
-    EXPECT_TRUE(
-        sem->ConstantValue()->Index(1)->Type()->As<type::Vector>()->type()->Is<type::U32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(sem->ConstantValue()
+                    ->Index(1)
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::U32>());
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(0)->ValueAs<u32>(), 0_u);
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(1)->ValueAs<u32>(), 0_u);
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(2)->ValueAs<u32>(), 0_u);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(2)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(2)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<type::Vector>());
-    EXPECT_TRUE(
-        sem->ConstantValue()->Index(2)->Type()->As<type::Vector>()->type()->Is<type::F32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(sem->ConstantValue()
+                    ->Index(2)
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::F32>());
     EXPECT_EQ(sem->ConstantValue()->Index(2)->Index(0)->ValueAs<f32>(), 0._f);
     EXPECT_EQ(sem->ConstantValue()->Index(2)->Index(1)->ValueAs<f32>(), 0._f);
     EXPECT_EQ(sem->ConstantValue()->Index(2)->Index(2)->ValueAs<f32>(), 0._f);
@@ -1965,18 +1989,26 @@
 
     EXPECT_TRUE(sem->ConstantValue()->Index(3)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(3)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(3)->Type()->Is<type::Vector>());
-    EXPECT_TRUE(
-        sem->ConstantValue()->Index(3)->Type()->As<type::Vector>()->type()->Is<type::F16>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(3)->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(sem->ConstantValue()
+                    ->Index(3)
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::F16>());
     EXPECT_EQ(sem->ConstantValue()->Index(3)->Index(0)->ValueAs<f16>(), 0._h);
     EXPECT_EQ(sem->ConstantValue()->Index(3)->Index(1)->ValueAs<f16>(), 0._h);
     EXPECT_EQ(sem->ConstantValue()->Index(3)->Index(2)->ValueAs<f16>(), 0._h);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(4)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(4)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(4)->Type()->Is<type::Vector>());
-    EXPECT_TRUE(
-        sem->ConstantValue()->Index(4)->Type()->As<type::Vector>()->type()->Is<type::Bool>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(4)->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(sem->ConstantValue()
+                    ->Index(4)
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::Bool>());
     EXPECT_EQ(sem->ConstantValue()->Index(4)->Index(0)->ValueAs<bool>(), false);
     EXPECT_EQ(sem->ConstantValue()->Index(4)->Index(1)->ValueAs<bool>(), false);
 }
@@ -1999,7 +2031,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* str = sem->Type()->As<type::Struct>();
+    auto* str = sem->Type()->As<core::type::Struct>();
     ASSERT_NE(str, nullptr);
     EXPECT_EQ(str->Members().Length(), 2u);
     ASSERT_NE(sem->ConstantValue(), nullptr);
@@ -2009,14 +2041,14 @@
 
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(0)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<type::Struct>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<core::type::Struct>());
     EXPECT_EQ(sem->ConstantValue()->Index(0)->Index(0)->ValueAs<i32>(), 0_i);
     EXPECT_EQ(sem->ConstantValue()->Index(0)->Index(1)->ValueAs<u32>(), 0_u);
     EXPECT_EQ(sem->ConstantValue()->Index(0)->Index(2)->ValueAs<f32>(), 0_f);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<type::Struct>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<core::type::Struct>());
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(0)->ValueAs<i32>(), 0_i);
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(1)->ValueAs<u32>(), 0_u);
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(2)->ValueAs<f32>(), 0_f);
@@ -2039,7 +2071,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* str = sem->Type()->As<type::Struct>();
+    auto* str = sem->Type()->As<core::type::Struct>();
     ASSERT_NE(str, nullptr);
     EXPECT_EQ(str->Members().Length(), 5u);
     ASSERT_NE(sem->ConstantValue(), nullptr);
@@ -2049,27 +2081,27 @@
 
     EXPECT_FALSE(sem->ConstantValue()->Index(0)->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->Index(0)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<type::I32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<core::type::I32>());
     EXPECT_EQ(sem->ConstantValue()->Index(0)->ValueAs<i32>(), 1_i);
 
     EXPECT_FALSE(sem->ConstantValue()->Index(1)->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->Index(1)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<type::U32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<core::type::U32>());
     EXPECT_EQ(sem->ConstantValue()->Index(1)->ValueAs<u32>(), 2_u);
 
     EXPECT_FALSE(sem->ConstantValue()->Index(2)->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->Index(2)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<type::F32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<core::type::F32>());
     EXPECT_EQ(sem->ConstantValue()->Index(2)->ValueAs<f32>(), 3._f);
 
     EXPECT_FALSE(sem->ConstantValue()->Index(3)->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->Index(3)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(3)->Type()->Is<type::F16>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(3)->Type()->Is<core::type::F16>());
     EXPECT_EQ(sem->ConstantValue()->Index(3)->ValueAs<f16>(), 4._h);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(4)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(4)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(4)->Type()->Is<type::Bool>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(4)->Type()->Is<core::type::Bool>());
     EXPECT_EQ(sem->ConstantValue()->Index(4)->ValueAs<bool>(), false);
 }
 
@@ -2091,7 +2123,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* str = sem->Type()->As<type::Struct>();
+    auto* str = sem->Type()->As<core::type::Struct>();
     ASSERT_NE(str, nullptr);
     EXPECT_EQ(str->Members().Length(), 5u);
     ASSERT_NE(sem->ConstantValue(), nullptr);
@@ -2101,26 +2133,38 @@
 
     EXPECT_FALSE(sem->ConstantValue()->Index(0)->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->Index(0)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<type::Vector>());
-    EXPECT_TRUE(
-        sem->ConstantValue()->Index(0)->Type()->As<type::Vector>()->type()->Is<type::I32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(sem->ConstantValue()
+                    ->Index(0)
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::I32>());
     EXPECT_EQ(sem->ConstantValue()->Index(0)->Index(0)->ValueAs<i32>(), 1_i);
     EXPECT_EQ(sem->ConstantValue()->Index(0)->Index(1)->ValueAs<i32>(), 1_i);
 
     EXPECT_FALSE(sem->ConstantValue()->Index(1)->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->Index(1)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<type::Vector>());
-    EXPECT_TRUE(
-        sem->ConstantValue()->Index(1)->Type()->As<type::Vector>()->type()->Is<type::U32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(sem->ConstantValue()
+                    ->Index(1)
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::U32>());
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(0)->ValueAs<u32>(), 2_u);
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(1)->ValueAs<u32>(), 2_u);
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(2)->ValueAs<u32>(), 2_u);
 
     EXPECT_FALSE(sem->ConstantValue()->Index(2)->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->Index(2)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<type::Vector>());
-    EXPECT_TRUE(
-        sem->ConstantValue()->Index(2)->Type()->As<type::Vector>()->type()->Is<type::F32>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(2)->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(sem->ConstantValue()
+                    ->Index(2)
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::F32>());
     EXPECT_EQ(sem->ConstantValue()->Index(2)->Index(0)->ValueAs<f32>(), 3._f);
     EXPECT_EQ(sem->ConstantValue()->Index(2)->Index(1)->ValueAs<f32>(), 3._f);
     EXPECT_EQ(sem->ConstantValue()->Index(2)->Index(2)->ValueAs<f32>(), 3._f);
@@ -2128,18 +2172,26 @@
 
     EXPECT_FALSE(sem->ConstantValue()->Index(3)->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->Index(3)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(3)->Type()->Is<type::Vector>());
-    EXPECT_TRUE(
-        sem->ConstantValue()->Index(3)->Type()->As<type::Vector>()->type()->Is<type::F16>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(3)->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(sem->ConstantValue()
+                    ->Index(3)
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::F16>());
     EXPECT_EQ(sem->ConstantValue()->Index(3)->Index(0)->ValueAs<f16>(), 4._h);
     EXPECT_EQ(sem->ConstantValue()->Index(3)->Index(1)->ValueAs<f16>(), 4._h);
     EXPECT_EQ(sem->ConstantValue()->Index(3)->Index(2)->ValueAs<f16>(), 4._h);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(4)->AnyZero());
     EXPECT_TRUE(sem->ConstantValue()->Index(4)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(4)->Type()->Is<type::Vector>());
-    EXPECT_TRUE(
-        sem->ConstantValue()->Index(4)->Type()->As<type::Vector>()->type()->Is<type::Bool>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(4)->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(sem->ConstantValue()
+                    ->Index(4)
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::Bool>());
     EXPECT_EQ(sem->ConstantValue()->Index(4)->Index(0)->ValueAs<bool>(), false);
     EXPECT_EQ(sem->ConstantValue()->Index(4)->Index(1)->ValueAs<bool>(), false);
 }
@@ -2163,7 +2215,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* str = sem->Type()->As<type::Struct>();
+    auto* str = sem->Type()->As<core::type::Struct>();
     ASSERT_NE(str, nullptr);
     EXPECT_EQ(str->Members().Length(), 2u);
     ASSERT_NE(sem->ConstantValue(), nullptr);
@@ -2173,14 +2225,14 @@
 
     EXPECT_FALSE(sem->ConstantValue()->Index(0)->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->Index(0)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<type::Struct>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<core::type::Struct>());
     EXPECT_EQ(sem->ConstantValue()->Index(0)->Index(0)->ValueAs<i32>(), 1_i);
     EXPECT_EQ(sem->ConstantValue()->Index(0)->Index(1)->ValueAs<u32>(), 2_u);
     EXPECT_EQ(sem->ConstantValue()->Index(0)->Index(2)->ValueAs<f32>(), 3_f);
 
     EXPECT_TRUE(sem->ConstantValue()->Index(1)->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->Index(1)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<type::Struct>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<core::type::Struct>());
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(0)->ValueAs<i32>(), 4_i);
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(1)->ValueAs<u32>(), 0_u);
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(2)->ValueAs<f32>(), 6_f);
@@ -2199,7 +2251,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* str = sem->Type()->As<type::Struct>();
+    auto* str = sem->Type()->As<core::type::Struct>();
     ASSERT_NE(str, nullptr);
     EXPECT_EQ(str->Members().Length(), 2u);
     ASSERT_NE(sem->ConstantValue(), nullptr);
@@ -2209,13 +2261,13 @@
 
     EXPECT_FALSE(sem->ConstantValue()->Index(0)->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->Index(0)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<type::Array>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(0)->Type()->Is<core::type::Array>());
     EXPECT_EQ(sem->ConstantValue()->Index(0)->Index(0)->ValueAs<i32>(), 1_i);
     EXPECT_EQ(sem->ConstantValue()->Index(0)->Index(1)->ValueAs<u32>(), 2_i);
 
     EXPECT_FALSE(sem->ConstantValue()->Index(1)->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->Index(1)->AllZero());
-    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<type::Array>());
+    EXPECT_TRUE(sem->ConstantValue()->Index(1)->Type()->Is<core::type::Array>());
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(0)->ValueAs<i32>(), 1_f);
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(1)->ValueAs<u32>(), 2_f);
     EXPECT_EQ(sem->ConstantValue()->Index(1)->Index(2)->ValueAs<f32>(), 3_f);
diff --git a/src/tint/lang/core/constant/eval_conversion_test.cc b/src/tint/lang/core/constant/eval_conversion_test.cc
index b7e952d..23279d4 100644
--- a/src/tint/lang/core/constant/eval_conversion_test.cc
+++ b/src/tint/lang/core/constant/eval_conversion_test.cc
@@ -82,7 +82,7 @@
 
     auto* target_sem_ty = type.sem(*this);
     if (kind == Kind::kVector) {
-        target_sem_ty = create<type::Vector>(target_sem_ty, 3u);
+        target_sem_ty = create<core::type::Vector>(target_sem_ty, 3u);
     }
 
     if (unrepresentable) {
@@ -233,9 +233,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::I32>());
+    EXPECT_TRUE(vec->type()->Is<core::type::I32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -262,9 +262,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::F32>());
+    EXPECT_TRUE(vec->type()->Is<core::type::F32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -293,9 +293,9 @@
 
     auto* sem = Sem().Get(expr);
     EXPECT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::I32>());
+    EXPECT_TRUE(vec->type()->Is<core::type::I32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -324,9 +324,9 @@
 
     auto* sem = Sem().Get(expr);
     EXPECT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::F16>());
+    EXPECT_TRUE(vec->type()->Is<core::type::F16>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -353,9 +353,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::I32>());
+    EXPECT_TRUE(vec->type()->Is<core::type::I32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
@@ -382,9 +382,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::U32>());
+    EXPECT_TRUE(vec->type()->Is<core::type::U32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AnyZero());
@@ -423,9 +423,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::F16>());
+    EXPECT_TRUE(vec->type()->Is<core::type::F16>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_TRUE(sem->ConstantValue()->AnyZero());
@@ -466,12 +466,12 @@
 
     EXPECT_TRUE(c->ConstantValue()->Index(0)->AnyZero());
     EXPECT_TRUE(c->ConstantValue()->Index(0)->AllZero());
-    EXPECT_TRUE(c->ConstantValue()->Index(0)->Type()->Is<type::AbstractFloat>());
+    EXPECT_TRUE(c->ConstantValue()->Index(0)->Type()->Is<core::type::AbstractFloat>());
     EXPECT_EQ(c->ConstantValue()->Index(0)->ValueAs<AFloat>(), 0_f);
 
     EXPECT_TRUE(c->ConstantValue()->Index(1)->AnyZero());
     EXPECT_TRUE(c->ConstantValue()->Index(1)->AllZero());
-    EXPECT_TRUE(c->ConstantValue()->Index(1)->Type()->Is<type::AbstractFloat>());
+    EXPECT_TRUE(c->ConstantValue()->Index(1)->Type()->Is<core::type::AbstractFloat>());
     EXPECT_EQ(c->ConstantValue()->Index(1)->ValueAs<AFloat>(), 0_a);
 
     auto* v = Sem().GetVal(materialized);
@@ -483,12 +483,12 @@
 
     EXPECT_TRUE(v->ConstantValue()->Index(0)->AnyZero());
     EXPECT_TRUE(v->ConstantValue()->Index(0)->AllZero());
-    EXPECT_TRUE(v->ConstantValue()->Index(0)->Type()->Is<type::F32>());
+    EXPECT_TRUE(v->ConstantValue()->Index(0)->Type()->Is<core::type::F32>());
     EXPECT_EQ(v->ConstantValue()->Index(0)->ValueAs<f32>(), 0_f);
 
     EXPECT_TRUE(v->ConstantValue()->Index(1)->AnyZero());
     EXPECT_TRUE(v->ConstantValue()->Index(1)->AllZero());
-    EXPECT_TRUE(v->ConstantValue()->Index(1)->Type()->Is<type::F32>());
+    EXPECT_TRUE(v->ConstantValue()->Index(1)->Type()->Is<core::type::F32>());
     EXPECT_EQ(v->ConstantValue()->Index(1)->ValueAs<f32>(), 0_f);
 }
 
diff --git a/src/tint/lang/core/constant/eval_indexing_test.cc b/src/tint/lang/core/constant/eval_indexing_test.cc
index 8ee61b4..c84a71e 100644
--- a/src/tint/lang/core/constant/eval_indexing_test.cc
+++ b/src/tint/lang/core/constant/eval_indexing_test.cc
@@ -28,7 +28,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    ASSERT_TRUE(sem->Type()->Is<type::I32>());
+    ASSERT_TRUE(sem->Type()->Is<core::type::I32>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->AllZero());
@@ -131,7 +131,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    ASSERT_TRUE(sem->Type()->Is<type::I32>());
+    ASSERT_TRUE(sem->Type()->Is<core::type::I32>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->AllZero());
@@ -146,7 +146,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
     EXPECT_EQ(vec->Width(), 2u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
@@ -170,7 +170,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    ASSERT_TRUE(sem->Type()->Is<type::I32>());
+    ASSERT_TRUE(sem->Type()->Is<core::type::I32>());
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
     EXPECT_FALSE(sem->ConstantValue()->AnyZero());
     EXPECT_FALSE(sem->ConstantValue()->AllZero());
@@ -188,7 +188,7 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
     EXPECT_EQ(vec->Width(), 2u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
@@ -235,9 +235,9 @@
 
     auto* sem = Sem().Get(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
-    EXPECT_TRUE(vec->type()->Is<type::F32>());
+    EXPECT_TRUE(vec->type()->Is<core::type::F32>());
     EXPECT_EQ(vec->Width(), 3u);
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
 
@@ -303,9 +303,9 @@
     {
         auto* mat = Sem().Get(mat_expr);
         EXPECT_NE(mat, nullptr);
-        auto* ty = mat->Type()->As<type::Matrix>();
+        auto* ty = mat->Type()->As<core::type::Matrix>();
         ASSERT_NE(mat->Type(), nullptr);
-        EXPECT_TRUE(ty->ColumnType()->Is<type::Vector>());
+        EXPECT_TRUE(ty->ColumnType()->Is<core::type::Vector>());
         EXPECT_EQ(ty->columns(), 2u);
         EXPECT_EQ(ty->rows(), 3u);
         EXPECT_EQ(mat->ConstantValue()->Type(), mat->Type());
@@ -339,9 +339,9 @@
     {
         auto* vec = Sem().Get(vec_expr);
         EXPECT_NE(vec, nullptr);
-        auto* ty = vec->Type()->As<type::Vector>();
+        auto* ty = vec->Type()->As<core::type::Vector>();
         ASSERT_NE(vec->Type(), nullptr);
-        EXPECT_TRUE(ty->type()->Is<type::F32>());
+        EXPECT_TRUE(ty->type()->Is<core::type::F32>());
         EXPECT_EQ(ty->Width(), 3u);
         EXPECT_EQ(vec->ConstantValue()->Type(), vec->Type());
         EXPECT_TRUE(vec->ConstantValue()->AnyZero());
@@ -362,7 +362,7 @@
     {
         auto* f = Sem().Get(f32_expr);
         EXPECT_NE(f, nullptr);
-        EXPECT_TRUE(f->Type()->Is<type::F32>());
+        EXPECT_TRUE(f->Type()->Is<core::type::F32>());
         EXPECT_EQ(f->ConstantValue()->Type(), f->Type());
         EXPECT_FALSE(f->ConstantValue()->AnyZero());
         EXPECT_FALSE(f->ConstantValue()->AllZero());
diff --git a/src/tint/lang/core/constant/eval_member_access_test.cc b/src/tint/lang/core/constant/eval_member_access_test.cc
index 34a3007..fb6271d 100644
--- a/src/tint/lang/core/constant/eval_member_access_test.cc
+++ b/src/tint/lang/core/constant/eval_member_access_test.cc
@@ -42,7 +42,7 @@
 
     auto* outer = Sem().Get(outer_expr);
     ASSERT_NE(outer, nullptr);
-    auto* str = outer->Type()->As<type::Struct>();
+    auto* str = outer->Type()->As<core::type::Struct>();
     ASSERT_NE(str, nullptr);
     EXPECT_EQ(str->Members().Length(), 2u);
     ASSERT_NE(outer->ConstantValue(), nullptr);
@@ -54,7 +54,7 @@
     ASSERT_NE(o1->ConstantValue(), nullptr);
     EXPECT_FALSE(o1->ConstantValue()->AnyZero());
     EXPECT_FALSE(o1->ConstantValue()->AllZero());
-    EXPECT_TRUE(o1->ConstantValue()->Type()->Is<type::Struct>());
+    EXPECT_TRUE(o1->ConstantValue()->Type()->Is<core::type::Struct>());
     EXPECT_EQ(o1->ConstantValue()->Index(0)->ValueAs<i32>(), 1_i);
     EXPECT_EQ(o1->ConstantValue()->Index(1)->ValueAs<u32>(), 2_u);
     EXPECT_EQ(o1->ConstantValue()->Index(2)->ValueAs<f32>(), 3_f);
@@ -64,7 +64,7 @@
     ASSERT_NE(i2->ConstantValue(), nullptr);
     EXPECT_FALSE(i2->ConstantValue()->AnyZero());
     EXPECT_FALSE(i2->ConstantValue()->AllZero());
-    EXPECT_TRUE(i2->ConstantValue()->Type()->Is<type::U32>());
+    EXPECT_TRUE(i2->ConstantValue()->Type()->Is<core::type::U32>());
     EXPECT_EQ(i2->ConstantValue()->ValueAs<u32>(), 2_u);
 }
 
@@ -78,11 +78,11 @@
 
     auto* sem = Sem().Get(c);
     ASSERT_NE(sem, nullptr);
-    EXPECT_TRUE(sem->Type()->Is<type::Matrix>());
+    EXPECT_TRUE(sem->Type()->Is<core::type::Matrix>());
     auto* cv = sem->ConstantValue();
     EXPECT_TYPE(cv->Type(), sem->Type());
-    EXPECT_TRUE(cv->Index(0)->Type()->Is<type::Vector>());
-    EXPECT_TRUE(cv->Index(0)->Index(0)->Type()->Is<type::AbstractFloat>());
+    EXPECT_TRUE(cv->Index(0)->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(cv->Index(0)->Index(0)->Type()->Is<core::type::AbstractFloat>());
     EXPECT_FALSE(cv->AnyZero());
     EXPECT_FALSE(cv->AllZero());
     auto* c0 = cv->Index(0);
@@ -116,56 +116,56 @@
 
     auto* sem = Sem().Get(c);
     ASSERT_NE(sem, nullptr);
-    EXPECT_TRUE(sem->Type()->Is<type::Matrix>());
+    EXPECT_TRUE(sem->Type()->Is<core::type::Matrix>());
     auto* cv = sem->ConstantValue();
     EXPECT_TYPE(cv->Type(), sem->Type());
-    EXPECT_TRUE(cv->Index(0)->Type()->Is<type::Vector>());
-    EXPECT_TRUE(cv->Index(0)->Index(0)->Type()->Is<type::AbstractFloat>());
+    EXPECT_TRUE(cv->Index(0)->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(cv->Index(0)->Index(0)->Type()->Is<core::type::AbstractFloat>());
     EXPECT_FALSE(cv->AnyZero());
     EXPECT_FALSE(cv->AllZero());
 
     auto* sem_col0 = Sem().Get(col_0);
     ASSERT_NE(sem_col0, nullptr);
-    EXPECT_TRUE(sem_col0->Type()->Is<type::Vector>());
+    EXPECT_TRUE(sem_col0->Type()->Is<core::type::Vector>());
     EXPECT_EQ(sem_col0->ConstantValue()->Index(0)->ValueAs<AFloat>(), 1.0);
     EXPECT_EQ(sem_col0->ConstantValue()->Index(1)->ValueAs<AFloat>(), 2.0);
     EXPECT_EQ(sem_col0->ConstantValue()->Index(2)->ValueAs<AFloat>(), 3.0);
 
     auto* sem_col1 = Sem().Get(col_1);
     ASSERT_NE(sem_col1, nullptr);
-    EXPECT_TRUE(sem_col1->Type()->Is<type::Vector>());
+    EXPECT_TRUE(sem_col1->Type()->Is<core::type::Vector>());
     EXPECT_EQ(sem_col1->ConstantValue()->Index(0)->ValueAs<AFloat>(), 4.0);
     EXPECT_EQ(sem_col1->ConstantValue()->Index(1)->ValueAs<AFloat>(), 5.0);
     EXPECT_EQ(sem_col1->ConstantValue()->Index(2)->ValueAs<AFloat>(), 6.0);
 
     auto* sem_e00 = Sem().Get(e00);
     ASSERT_NE(sem_e00, nullptr);
-    EXPECT_TRUE(sem_e00->Type()->Is<type::AbstractFloat>());
+    EXPECT_TRUE(sem_e00->Type()->Is<core::type::AbstractFloat>());
     EXPECT_EQ(sem_e00->ConstantValue()->ValueAs<AFloat>(), 1.0);
 
     auto* sem_e01 = Sem().Get(e01);
     ASSERT_NE(sem_e01, nullptr);
-    EXPECT_TRUE(sem_e01->Type()->Is<type::AbstractFloat>());
+    EXPECT_TRUE(sem_e01->Type()->Is<core::type::AbstractFloat>());
     EXPECT_EQ(sem_e01->ConstantValue()->ValueAs<AFloat>(), 2.0);
 
     auto* sem_e02 = Sem().Get(e02);
     ASSERT_NE(sem_e02, nullptr);
-    EXPECT_TRUE(sem_e02->Type()->Is<type::AbstractFloat>());
+    EXPECT_TRUE(sem_e02->Type()->Is<core::type::AbstractFloat>());
     EXPECT_EQ(sem_e02->ConstantValue()->ValueAs<AFloat>(), 3.0);
 
     auto* sem_e10 = Sem().Get(e10);
     ASSERT_NE(sem_e10, nullptr);
-    EXPECT_TRUE(sem_e10->Type()->Is<type::AbstractFloat>());
+    EXPECT_TRUE(sem_e10->Type()->Is<core::type::AbstractFloat>());
     EXPECT_EQ(sem_e10->ConstantValue()->ValueAs<AFloat>(), 4.0);
 
     auto* sem_e11 = Sem().Get(e11);
     ASSERT_NE(sem_e11, nullptr);
-    EXPECT_TRUE(sem_e11->Type()->Is<type::AbstractFloat>());
+    EXPECT_TRUE(sem_e11->Type()->Is<core::type::AbstractFloat>());
     EXPECT_EQ(sem_e11->ConstantValue()->ValueAs<AFloat>(), 5.0);
 
     auto* sem_e12 = Sem().Get(e12);
     ASSERT_NE(sem_e12, nullptr);
-    EXPECT_TRUE(sem_e12->Type()->Is<type::AbstractFloat>());
+    EXPECT_TRUE(sem_e12->Type()->Is<core::type::AbstractFloat>());
     EXPECT_EQ(sem_e12->ConstantValue()->ValueAs<AFloat>(), 6.0);
 }
 
@@ -192,56 +192,56 @@
 
     auto* sem = Sem().Get(c);
     ASSERT_NE(sem, nullptr);
-    EXPECT_TRUE(sem->Type()->Is<type::Matrix>());
+    EXPECT_TRUE(sem->Type()->Is<core::type::Matrix>());
     auto* cv = sem->ConstantValue();
     EXPECT_TYPE(cv->Type(), sem->Type());
-    EXPECT_TRUE(cv->Index(0)->Type()->Is<type::Vector>());
-    EXPECT_TRUE(cv->Index(0)->Index(0)->Type()->Is<type::F32>());
+    EXPECT_TRUE(cv->Index(0)->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(cv->Index(0)->Index(0)->Type()->Is<core::type::F32>());
     EXPECT_FALSE(cv->AnyZero());
     EXPECT_FALSE(cv->AllZero());
 
     auto* sem_col0 = Sem().Get(col_0);
     ASSERT_NE(sem_col0, nullptr);
-    EXPECT_TRUE(sem_col0->Type()->Is<type::Vector>());
+    EXPECT_TRUE(sem_col0->Type()->Is<core::type::Vector>());
     EXPECT_EQ(sem_col0->ConstantValue()->Index(0)->ValueAs<f32>(), 1.0f);
     EXPECT_EQ(sem_col0->ConstantValue()->Index(1)->ValueAs<f32>(), 2.0f);
     EXPECT_EQ(sem_col0->ConstantValue()->Index(2)->ValueAs<f32>(), 3.0f);
 
     auto* sem_col1 = Sem().Get(col_1);
     ASSERT_NE(sem_col1, nullptr);
-    EXPECT_TRUE(sem_col1->Type()->Is<type::Vector>());
+    EXPECT_TRUE(sem_col1->Type()->Is<core::type::Vector>());
     EXPECT_EQ(sem_col1->ConstantValue()->Index(0)->ValueAs<f32>(), 4.0f);
     EXPECT_EQ(sem_col1->ConstantValue()->Index(1)->ValueAs<f32>(), 5.0f);
     EXPECT_EQ(sem_col1->ConstantValue()->Index(2)->ValueAs<f32>(), 6.0f);
 
     auto* sem_e00 = Sem().Get(e00);
     ASSERT_NE(sem_e00, nullptr);
-    EXPECT_TRUE(sem_e00->Type()->Is<type::F32>());
+    EXPECT_TRUE(sem_e00->Type()->Is<core::type::F32>());
     EXPECT_EQ(sem_e00->ConstantValue()->ValueAs<f32>(), 1.0f);
 
     auto* sem_e01 = Sem().Get(e01);
     ASSERT_NE(sem_e01, nullptr);
-    EXPECT_TRUE(sem_e01->Type()->Is<type::F32>());
+    EXPECT_TRUE(sem_e01->Type()->Is<core::type::F32>());
     EXPECT_EQ(sem_e01->ConstantValue()->ValueAs<f32>(), 2.0f);
 
     auto* sem_e02 = Sem().Get(e02);
     ASSERT_NE(sem_e02, nullptr);
-    EXPECT_TRUE(sem_e02->Type()->Is<type::F32>());
+    EXPECT_TRUE(sem_e02->Type()->Is<core::type::F32>());
     EXPECT_EQ(sem_e02->ConstantValue()->ValueAs<f32>(), 3.0f);
 
     auto* sem_e10 = Sem().Get(e10);
     ASSERT_NE(sem_e10, nullptr);
-    EXPECT_TRUE(sem_e10->Type()->Is<type::F32>());
+    EXPECT_TRUE(sem_e10->Type()->Is<core::type::F32>());
     EXPECT_EQ(sem_e10->ConstantValue()->ValueAs<f32>(), 4.0f);
 
     auto* sem_e11 = Sem().Get(e11);
     ASSERT_NE(sem_e11, nullptr);
-    EXPECT_TRUE(sem_e11->Type()->Is<type::F32>());
+    EXPECT_TRUE(sem_e11->Type()->Is<core::type::F32>());
     EXPECT_EQ(sem_e11->ConstantValue()->ValueAs<f32>(), 5.0f);
 
     auto* sem_e12 = Sem().Get(e12);
     ASSERT_NE(sem_e12, nullptr);
-    EXPECT_TRUE(sem_e12->Type()->Is<type::F32>());
+    EXPECT_TRUE(sem_e12->Type()->Is<core::type::F32>());
     EXPECT_EQ(sem_e12->ConstantValue()->ValueAs<f32>(), 6.0f);
 }
 
@@ -281,7 +281,7 @@
 
     auto* sem = Sem().GetVal(expr);
     ASSERT_NE(sem, nullptr);
-    auto* arr = sem->Type()->As<type::Array>();
+    auto* arr = sem->Type()->As<core::type::Array>();
     ASSERT_NE(arr, nullptr);
 
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
@@ -356,7 +356,7 @@
 
     auto* sem = Sem().GetVal(expr);
     ASSERT_NE(sem, nullptr);
-    auto* vec = sem->Type()->As<type::Vector>();
+    auto* vec = sem->Type()->As<core::type::Vector>();
     ASSERT_NE(vec, nullptr);
 
     EXPECT_TYPE(sem->ConstantValue()->Type(), sem->Type());
diff --git a/src/tint/lang/core/constant/eval_runtime_semantics_test.cc b/src/tint/lang/core/constant/eval_runtime_semantics_test.cc
index f9b5dec..1407e86 100644
--- a/src/tint/lang/core/constant/eval_runtime_semantics_test.cc
+++ b/src/tint/lang/core/constant/eval_runtime_semantics_test.cc
@@ -433,7 +433,8 @@
 TEST_F(ConstEvalRuntimeSemanticsTest, Normalize_ZeroLength) {
     auto* zero = constants.Get(f32(0));
     auto* vec =
-        eval.VecSplat(create<type::Vector>(create<type::F32>(), 4u), Vector{zero}, {}).Get();
+        eval.VecSplat(create<core::type::Vector>(create<core::type::F32>(), 4u), Vector{zero}, {})
+            .Get();
     auto result = eval.normalize(vec->Type(), Vector{vec}, {});
     ASSERT_TRUE(result);
     EXPECT_EQ(result.Get()->Index(0)->ValueAs<f32>(), 0.f);
@@ -447,8 +448,9 @@
     auto* a = constants.Get(f32(75250.f));
     auto* b = constants.Get(f32(42.1f));
     auto* vec =
-        eval.VecInitS(create<type::Vector>(create<type::F32>(), 2u), Vector{a, b}, {}).Get();
-    auto result = eval.pack2x16float(create<type::U32>(), Vector{vec}, {});
+        eval.VecInitS(create<core::type::Vector>(create<core::type::F32>(), 2u), Vector{a, b}, {})
+            .Get();
+    auto result = eval.pack2x16float(create<core::type::U32>(), Vector{vec}, {});
     ASSERT_TRUE(result);
     EXPECT_EQ(result.Get()->ValueAs<u32>(), 0x51430000);
     EXPECT_EQ(error(), R"(warning: value 75250.0 cannot be represented as 'f16')");
@@ -465,7 +467,7 @@
 
 TEST_F(ConstEvalRuntimeSemanticsTest, Unpack2x16Float_OutOfRange) {
     auto* a = constants.Get(u32(0x51437C00));
-    auto result = eval.unpack2x16float(create<type::U32>(), Vector{a}, {});
+    auto result = eval.unpack2x16float(create<core::type::U32>(), Vector{a}, {});
     ASSERT_TRUE(result);
     EXPECT_FLOAT_EQ(result.Get()->Index(0)->ValueAs<f32>(), 0.f);
     EXPECT_FLOAT_EQ(result.Get()->Index(1)->ValueAs<f32>(), 42.09375f);
@@ -474,7 +476,7 @@
 
 TEST_F(ConstEvalRuntimeSemanticsTest, QuantizeToF16_OutOfRange) {
     auto* a = constants.Get(f32(75250.f));
-    auto result = eval.quantizeToF16(create<type::U32>(), Vector{a}, {});
+    auto result = eval.quantizeToF16(create<core::type::U32>(), Vector{a}, {});
     ASSERT_TRUE(result);
     EXPECT_EQ(result.Get()->ValueAs<u32>(), 0);
     EXPECT_EQ(error(), R"(warning: value 75250.0 cannot be represented as 'f16')");
@@ -500,7 +502,7 @@
 
 TEST_F(ConstEvalRuntimeSemanticsTest, Bitcast_Infinity) {
     auto* a = constants.Get(u32(0x7F800000));
-    auto result = eval.Bitcast(create<type::F32>(), a, {});
+    auto result = eval.Bitcast(create<core::type::F32>(), a, {});
     ASSERT_TRUE(result);
     EXPECT_EQ(result.Get()->ValueAs<f32>(), 0.f);
     EXPECT_EQ(error(), R"(warning: value inf cannot be represented as 'f32')");
@@ -508,7 +510,7 @@
 
 TEST_F(ConstEvalRuntimeSemanticsTest, Bitcast_NaN) {
     auto* a = constants.Get(u32(0x7FC00000));
-    auto result = eval.Bitcast(create<type::F32>(), a, {});
+    auto result = eval.Bitcast(create<core::type::F32>(), a, {});
     ASSERT_TRUE(result);
     EXPECT_EQ(result.Get()->ValueAs<f32>(), 0.f);
     EXPECT_EQ(error(), R"(warning: value nan cannot be represented as 'f32')");
@@ -516,7 +518,7 @@
 
 TEST_F(ConstEvalRuntimeSemanticsTest, Convert_F32_TooHigh) {
     auto* a = constants.Get(AFloat::Highest());
-    auto result = eval.Convert(create<type::F32>(), a, {});
+    auto result = eval.Convert(create<core::type::F32>(), a, {});
     ASSERT_TRUE(result);
     EXPECT_EQ(result.Get()->ValueAs<f32>(), f32::kHighestValue);
     EXPECT_EQ(
@@ -526,7 +528,7 @@
 
 TEST_F(ConstEvalRuntimeSemanticsTest, Convert_F32_TooLow) {
     auto* a = constants.Get(AFloat::Lowest());
-    auto result = eval.Convert(create<type::F32>(), a, {});
+    auto result = eval.Convert(create<core::type::F32>(), a, {});
     ASSERT_TRUE(result);
     EXPECT_EQ(result.Get()->ValueAs<f32>(), f32::kLowestValue);
     EXPECT_EQ(
@@ -536,7 +538,7 @@
 
 TEST_F(ConstEvalRuntimeSemanticsTest, Convert_F16_TooHigh) {
     auto* a = constants.Get(f32(1000000.0));
-    auto result = eval.Convert(create<type::F16>(), a, {});
+    auto result = eval.Convert(create<core::type::F16>(), a, {});
     ASSERT_TRUE(result);
     EXPECT_EQ(result.Get()->ValueAs<f32>(), f16::kHighestValue);
     EXPECT_EQ(error(), R"(warning: value 1000000.0 cannot be represented as 'f16')");
@@ -544,7 +546,7 @@
 
 TEST_F(ConstEvalRuntimeSemanticsTest, Convert_F16_TooLow) {
     auto* a = constants.Get(f32(-1000000.0));
-    auto result = eval.Convert(create<type::F16>(), a, {});
+    auto result = eval.Convert(create<core::type::F16>(), a, {});
     ASSERT_TRUE(result);
     EXPECT_EQ(result.Get()->ValueAs<f32>(), f16::kLowestValue);
     EXPECT_EQ(error(), R"(warning: value -1000000.0 cannot be represented as 'f16')");
@@ -552,7 +554,7 @@
 
 TEST_F(ConstEvalRuntimeSemanticsTest, Vec_Overflow_SingleComponent) {
     // Test that overflow for an element-wise vector operation only affects a single component.
-    auto* vec4f = create<type::Vector>(create<type::F32>(), 4u);
+    auto* vec4f = create<core::type::Vector>(create<core::type::F32>(), 4u);
     auto* a = eval.VecInitS(vec4f,
                             Vector{
                                 constants.Get(f32(1)),
diff --git a/src/tint/lang/core/constant/eval_test.h b/src/tint/lang/core/constant/eval_test.h
index 0752b23..b874287 100644
--- a/src/tint/lang/core/constant/eval_test.h
+++ b/src/tint/lang/core/constant/eval_test.h
@@ -53,13 +53,13 @@
 inline void CollectScalars(const constant::Value* c, Vector<builder::Scalar, N>& scalars) {
     Switch(
         c->Type(),  //
-        [&](const type::AbstractInt*) { scalars.Push(c->ValueAs<AInt>()); },
-        [&](const type::AbstractFloat*) { scalars.Push(c->ValueAs<AFloat>()); },
-        [&](const type::Bool*) { scalars.Push(c->ValueAs<bool>()); },
-        [&](const type::I32*) { scalars.Push(c->ValueAs<i32>()); },
-        [&](const type::U32*) { scalars.Push(c->ValueAs<u32>()); },
-        [&](const type::F32*) { scalars.Push(c->ValueAs<f32>()); },
-        [&](const type::F16*) { scalars.Push(c->ValueAs<f16>()); },
+        [&](const core::type::AbstractInt*) { scalars.Push(c->ValueAs<AInt>()); },
+        [&](const core::type::AbstractFloat*) { scalars.Push(c->ValueAs<AFloat>()); },
+        [&](const core::type::Bool*) { scalars.Push(c->ValueAs<bool>()); },
+        [&](const core::type::I32*) { scalars.Push(c->ValueAs<i32>()); },
+        [&](const core::type::U32*) { scalars.Push(c->ValueAs<u32>()); },
+        [&](const core::type::F32*) { scalars.Push(c->ValueAs<f32>()); },
+        [&](const core::type::F16*) { scalars.Push(c->ValueAs<f16>()); },
         [&](Default) {
             size_t i = 0;
             while (auto* child = c->Index(i++)) {
diff --git a/src/tint/lang/core/constant/manager.cc b/src/tint/lang/core/constant/manager.cc
index 19d0b01..0a23ab4 100644
--- a/src/tint/lang/core/constant/manager.cc
+++ b/src/tint/lang/core/constant/manager.cc
@@ -37,7 +37,7 @@
 
 Manager::~Manager() = default;
 
-const constant::Value* Manager::Composite(const type::Type* type,
+const constant::Value* Manager::Composite(const core::type::Type* type,
                                           VectorRef<const constant::Value*> elements) {
     if (elements.IsEmpty()) {
         return nullptr;
@@ -68,7 +68,7 @@
     return Get<constant::Composite>(type, std::move(elements), all_zero, any_zero);
 }
 
-const constant::Splat* Manager::Splat(const type::Type* type,
+const constant::Splat* Manager::Splat(const core::type::Type* type,
                                       const constant::Value* element,
                                       size_t n) {
     return Get<constant::Splat>(type, element, n);
diff --git a/src/tint/lang/core/constant/manager.h b/src/tint/lang/core/constant/manager.h
index 1ce7188..3cc27be 100644
--- a/src/tint/lang/core/constant/manager.h
+++ b/src/tint/lang/core/constant/manager.h
@@ -63,7 +63,7 @@
     static Manager Wrap(const Manager& inner) {
         Manager out;
         out.values_.Wrap(inner.values_);
-        out.types = type::Manager::Wrap(inner.types);
+        out.types = core::type::Manager::Wrap(inner.types);
         return out;
     }
 
@@ -89,7 +89,7 @@
     /// @param type the composite type
     /// @param elements the composite elements
     /// @returns the value pointer
-    const constant::Value* Composite(const type::Type* type,
+    const constant::Value* Composite(const core::type::Type* type,
                                      VectorRef<const constant::Value*> elements);
 
     /// Constructs a splat constant.
@@ -97,7 +97,9 @@
     /// @param element the splat element
     /// @param n the number of elements
     /// @returns the value pointer
-    const constant::Splat* Splat(const type::Type* type, const constant::Value* element, size_t n);
+    const constant::Splat* Splat(const core::type::Type* type,
+                                 const constant::Value* element,
+                                 size_t n);
 
     /// @param value the constant value
     /// @return a Scalar holding the i32 value @p value
@@ -128,7 +130,7 @@
     const Scalar<AInt>* Get(AInt value);
 
     /// The type manager
-    type::Manager types;
+    core::type::Manager types;
 
   private:
     /// A specialization of Hasher for constant::Value
diff --git a/src/tint/lang/core/constant/manager_test.cc b/src/tint/lang/core/constant/manager_test.cc
index 6116644..f01a612 100644
--- a/src/tint/lang/core/constant/manager_test.cc
+++ b/src/tint/lang/core/constant/manager_test.cc
@@ -95,7 +95,7 @@
 
     auto* c = cm.Get(1_i);
     static_assert(std::is_same_v<const Scalar<i32>*, decltype(c)>);
-    ASSERT_TRUE(Is<type::I32>(c->Type()));
+    ASSERT_TRUE(Is<core::type::I32>(c->Type()));
     EXPECT_EQ(c->value, 1_i);
 }
 
@@ -104,7 +104,7 @@
 
     auto* c = cm.Get(1_u);
     static_assert(std::is_same_v<const Scalar<u32>*, decltype(c)>);
-    ASSERT_TRUE(Is<type::U32>(c->Type()));
+    ASSERT_TRUE(Is<core::type::U32>(c->Type()));
     EXPECT_EQ(c->value, 1_u);
 }
 
@@ -113,7 +113,7 @@
 
     auto* c = cm.Get(1_f);
     static_assert(std::is_same_v<const Scalar<f32>*, decltype(c)>);
-    ASSERT_TRUE(Is<type::F32>(c->Type()));
+    ASSERT_TRUE(Is<core::type::F32>(c->Type()));
     EXPECT_EQ(c->value, 1_f);
 }
 
@@ -122,7 +122,7 @@
 
     auto* c = cm.Get(1_h);
     static_assert(std::is_same_v<const Scalar<f16>*, decltype(c)>);
-    ASSERT_TRUE(Is<type::F16>(c->Type()));
+    ASSERT_TRUE(Is<core::type::F16>(c->Type()));
     EXPECT_EQ(c->value, 1_h);
 }
 
@@ -131,7 +131,7 @@
 
     auto* c = cm.Get(true);
     static_assert(std::is_same_v<const Scalar<bool>*, decltype(c)>);
-    ASSERT_TRUE(Is<type::Bool>(c->Type()));
+    ASSERT_TRUE(Is<core::type::Bool>(c->Type()));
     EXPECT_EQ(c->value, true);
 }
 
@@ -140,7 +140,7 @@
 
     auto* c = cm.Get(1._a);
     static_assert(std::is_same_v<const Scalar<AFloat>*, decltype(c)>);
-    ASSERT_TRUE(Is<type::AbstractFloat>(c->Type()));
+    ASSERT_TRUE(Is<core::type::AbstractFloat>(c->Type()));
     EXPECT_EQ(c->value, 1._a);
 }
 
@@ -149,7 +149,7 @@
 
     auto* c = cm.Get(1_a);
     static_assert(std::is_same_v<const Scalar<AInt>*, decltype(c)>);
-    ASSERT_TRUE(Is<type::AbstractInt>(c->Type()));
+    ASSERT_TRUE(Is<core::type::AbstractInt>(c->Type()));
     EXPECT_EQ(c->value, 1_a);
 }
 
@@ -172,12 +172,12 @@
     Manager inner;
     Manager outer = Manager::Wrap(inner);
 
-    inner.types.Get<type::I32>();
+    inner.types.Get<core::type::I32>();
 
     EXPECT_EQ(count(inner.types), 1u);
     EXPECT_EQ(count(outer.types), 0u);
 
-    outer.types.Get<type::U32>();
+    outer.types.Get<core::type::U32>();
 
     EXPECT_EQ(count(inner.types), 1u);
     EXPECT_EQ(count(outer.types), 1u);
diff --git a/src/tint/lang/core/constant/scalar.h b/src/tint/lang/core/constant/scalar.h
index 4db63dc..2389d44 100644
--- a/src/tint/lang/core/constant/scalar.h
+++ b/src/tint/lang/core/constant/scalar.h
@@ -41,7 +41,7 @@
     /// Constructor
     /// @param t the scalar type
     /// @param v the scalar value
-    Scalar(const type::Type* t, T v) : type(t), value(v) {
+    Scalar(const core::type::Type* t, T v) : type(t), value(v) {
         if constexpr (IsFloatingPoint<T>) {
             TINT_ASSERT(std::isfinite(v.value));
         }
@@ -49,7 +49,7 @@
     ~Scalar() override = default;
 
     /// @copydoc Value::Type()
-    const type::Type* Type() const override { return type; }
+    const core::type::Type* Type() const override { return type; }
 
     /// @return nullptr, as Scalar does not hold any elements.
     const Value* Index(size_t) const override { return nullptr; }
@@ -91,7 +91,7 @@
     }
 
     /// The scalar type
-    type::Type const* const type;
+    core::type::Type const* const type;
     /// The scalar value
     const T value;
 
diff --git a/src/tint/lang/core/constant/scalar_test.cc b/src/tint/lang/core/constant/scalar_test.cc
index 8b991d4..e4651de 100644
--- a/src/tint/lang/core/constant/scalar_test.cc
+++ b/src/tint/lang/core/constant/scalar_test.cc
@@ -167,11 +167,11 @@
     auto* val = constants.Get(12_i);
 
     constant::Manager mgr;
-    constant::CloneContext ctx{type::CloneContext{{nullptr}, {nullptr, &mgr.types}}, mgr};
+    constant::CloneContext ctx{core::type::CloneContext{{nullptr}, {nullptr, &mgr.types}}, mgr};
 
     auto* r = val->Clone(ctx);
     ASSERT_NE(r, nullptr);
-    EXPECT_TRUE(r->type->Is<type::I32>());
+    EXPECT_TRUE(r->type->Is<core::type::I32>());
     EXPECT_EQ(r->value, 12);
 }
 
diff --git a/src/tint/lang/core/constant/splat.cc b/src/tint/lang/core/constant/splat.cc
index 097010b..66e3ce9 100644
--- a/src/tint/lang/core/constant/splat.cc
+++ b/src/tint/lang/core/constant/splat.cc
@@ -20,7 +20,8 @@
 
 namespace tint::core::constant {
 
-Splat::Splat(const type::Type* t, const constant::Value* e, size_t n) : type(t), el(e), count(n) {}
+Splat::Splat(const core::type::Type* t, const constant::Value* e, size_t n)
+    : type(t), el(e), count(n) {}
 
 Splat::~Splat() = default;
 
diff --git a/src/tint/lang/core/constant/splat.h b/src/tint/lang/core/constant/splat.h
index 3ba3e13..9ea51ec 100644
--- a/src/tint/lang/core/constant/splat.h
+++ b/src/tint/lang/core/constant/splat.h
@@ -32,11 +32,11 @@
     /// @param t the splat type
     /// @param e the splat element
     /// @param n the number of items in the splat
-    Splat(const type::Type* t, const Value* e, size_t n);
+    Splat(const core::type::Type* t, const Value* e, size_t n);
     ~Splat() override;
 
     /// @returns the type of the splat
-    const type::Type* Type() const override { return type; }
+    const core::type::Type* Type() const override { return type; }
 
     /// Retrieve item at index @p i
     /// @param i the index to retrieve
@@ -60,7 +60,7 @@
     const Splat* Clone(CloneContext& ctx) const override;
 
     /// The type of the splat element
-    type::Type const* const type;
+    core::type::Type const* const type;
     /// The element stored in the splat
     const Value* el;
     /// The number of items in the splat
diff --git a/src/tint/lang/core/constant/splat_test.cc b/src/tint/lang/core/constant/splat_test.cc
index 796ab5f..8e3fa47 100644
--- a/src/tint/lang/core/constant/splat_test.cc
+++ b/src/tint/lang/core/constant/splat_test.cc
@@ -25,7 +25,7 @@
 using ConstantTest_Splat = TestHelper;
 
 TEST_F(ConstantTest_Splat, AllZero) {
-    auto* vec3f = create<type::Vector>(create<type::F32>(), 3u);
+    auto* vec3f = create<core::type::Vector>(create<core::type::F32>(), 3u);
 
     auto* fPos0 = constants.Get(0_f);
     auto* fNeg0 = constants.Get(-0_f);
@@ -41,7 +41,7 @@
 }
 
 TEST_F(ConstantTest_Splat, AnyZero) {
-    auto* vec3f = create<type::Vector>(create<type::F32>(), 3u);
+    auto* vec3f = create<core::type::Vector>(create<core::type::F32>(), 3u);
 
     auto* fPos0 = constants.Get(0_f);
     auto* fNeg0 = constants.Get(-0_f);
@@ -57,7 +57,7 @@
 }
 
 TEST_F(ConstantTest_Splat, Index) {
-    auto* vec3f = create<type::Vector>(create<type::F32>(), 3u);
+    auto* vec3f = create<core::type::Vector>(create<core::type::F32>(), 3u);
 
     auto* f1 = constants.Get(1_f);
     auto* sp = constants.Splat(vec3f, f1, 2);
@@ -71,16 +71,16 @@
 }
 
 TEST_F(ConstantTest_Splat, Clone) {
-    auto* vec3i = create<type::Vector>(create<type::I32>(), 3u);
+    auto* vec3i = create<core::type::Vector>(create<core::type::I32>(), 3u);
     auto* val = constants.Get(12_i);
     auto* sp = constants.Splat(vec3i, val, 2);
 
     constant::Manager mgr;
-    constant::CloneContext ctx{type::CloneContext{{nullptr}, {nullptr, &mgr.types}}, mgr};
+    constant::CloneContext ctx{core::type::CloneContext{{nullptr}, {nullptr, &mgr.types}}, mgr};
 
     auto* r = sp->Clone(ctx);
     ASSERT_NE(r, nullptr);
-    EXPECT_TRUE(r->type->Is<type::Vector>());
+    EXPECT_TRUE(r->type->Is<core::type::Vector>());
     EXPECT_TRUE(r->el->Is<Scalar<tint::i32>>());
     EXPECT_EQ(r->count, 2u);
 }
diff --git a/src/tint/lang/core/constant/value.cc b/src/tint/lang/core/constant/value.cc
index c078af4..22806f7 100644
--- a/src/tint/lang/core/constant/value.cc
+++ b/src/tint/lang/core/constant/value.cc
@@ -84,10 +84,10 @@
 
     return Switch(
         Type(),  //
-        [&](const type::Vector* vec) { return elements_equal(vec->Width()); },
-        [&](const type::Matrix* mat) { return elements_equal(mat->columns()); },
-        [&](const type::Struct* str) { return elements_equal(str->Members().Length()); },
-        [&](const type::Array* arr) {
+        [&](const core::type::Vector* vec) { return elements_equal(vec->Width()); },
+        [&](const core::type::Matrix* mat) { return elements_equal(mat->columns()); },
+        [&](const core::type::Struct* str) { return elements_equal(str->Members().Length()); },
+        [&](const core::type::Array* arr) {
             if (auto n = arr->ConstantCount()) {
                 return elements_equal(*n);
             }
diff --git a/src/tint/lang/core/constant/value.h b/src/tint/lang/core/constant/value.h
index 0e55b0c..b1bf5b3 100644
--- a/src/tint/lang/core/constant/value.h
+++ b/src/tint/lang/core/constant/value.h
@@ -35,7 +35,7 @@
     ~Value() override;
 
     /// @returns the type of the value
-    virtual const type::Type* Type() const = 0;
+    virtual const core::type::Type* Type() const = 0;
 
     /// @param i the index of the element
     /// @returns the child element with the given index, or nullptr if there are no children, or
diff --git a/src/tint/lang/core/constant/value_test.cc b/src/tint/lang/core/constant/value_test.cc
index 2fcc934..a8f9308 100644
--- a/src/tint/lang/core/constant/value_test.cc
+++ b/src/tint/lang/core/constant/value_test.cc
@@ -39,7 +39,7 @@
 }
 
 TEST_F(ConstantTest_Value, Equal_Splat_Splat) {
-    auto* vec3f = create<type::Vector>(create<type::F32>(), 3u);
+    auto* vec3f = create<core::type::Vector>(create<core::type::F32>(), 3u);
 
     auto* vec3f_1_1_1 = constants.Splat(vec3f, constants.Get(1_f), 3);
     auto* vec3f_2_2_2 = constants.Splat(vec3f, constants.Get(2_f), 3);
@@ -50,7 +50,7 @@
 }
 
 TEST_F(ConstantTest_Value, Equal_Composite_Composite) {
-    auto* vec3f = create<type::Vector>(create<type::F32>(), 3u);
+    auto* vec3f = create<core::type::Vector>(create<core::type::F32>(), 3u);
 
     auto* vec3f_1_1_2 = constants.Composite(
         vec3f, Vector{constants.Get(1_f), constants.Get(1_f), constants.Get(2_f)});
@@ -63,7 +63,7 @@
 }
 
 TEST_F(ConstantTest_Value, Equal_Splat_Composite) {
-    auto* vec3f = create<type::Vector>(create<type::F32>(), 3u);
+    auto* vec3f = create<core::type::Vector>(create<core::type::F32>(), 3u);
 
     auto* vec3f_1_1_1 = constants.Splat(vec3f, constants.Get(1_f), 3);
     auto* vec3f_1_2_1 = constants.Composite(
diff --git a/src/tint/lang/core/intrinsic/table.cc b/src/tint/lang/core/intrinsic/table.cc
index 65443b0..9c29b12 100644
--- a/src/tint/lang/core/intrinsic/table.cc
+++ b/src/tint/lang/core/intrinsic/table.cc
@@ -35,10 +35,10 @@
 const Number Number::any{Number::kAny};
 const Number Number::invalid{Number::kInvalid};
 
-Any::Any() : Base(0u, type::Flags{}) {}
+Any::Any() : Base(0u, core::type::Flags{}) {}
 Any::~Any() = default;
 
-bool Any::Equals(const type::UniqueNode&) const {
+bool Any::Equals(const core::type::UniqueNode&) const {
     return false;
 }
 
@@ -46,7 +46,7 @@
     return "<any>";
 }
 
-type::Type* Any::Clone(type::CloneContext&) const {
+core::type::Type* Any::Clone(core::type::CloneContext&) const {
     return nullptr;
 }
 
@@ -61,28 +61,28 @@
 /// Impl is the private implementation of the Table interface.
 class Impl : public Table {
   public:
-    Impl(const TableData& td, type::Manager& tys, SymbolTable& syms, diag::List& d);
+    Impl(const TableData& td, core::type::Manager& tys, SymbolTable& syms, diag::List& d);
 
     Result<Overload> Lookup(core::Function builtin_type,
-                            VectorRef<const type::Type*> args,
+                            VectorRef<const core::type::Type*> args,
                             EvaluationStage earliest_eval_stage,
                             const Source& source) override;
 
     Result<Overload> Lookup(core::UnaryOp op,
-                            const type::Type* arg,
+                            const core::type::Type* arg,
                             EvaluationStage earliest_eval_stage,
                             const Source& source) override;
 
     Result<Overload> Lookup(core::BinaryOp op,
-                            const type::Type* lhs,
-                            const type::Type* rhs,
+                            const core::type::Type* lhs,
+                            const core::type::Type* rhs,
                             EvaluationStage earliest_eval_stage,
                             const Source& source,
                             bool is_compound) override;
 
     Result<Overload> Lookup(CtorConv type,
-                            const type::Type* template_arg,
-                            VectorRef<const type::Type*> args,
+                            const core::type::Type* template_arg,
+                            VectorRef<const core::type::Type*> args,
                             EvaluationStage earliest_eval_stage,
                             const Source& source) override;
 
@@ -126,7 +126,7 @@
     /// @returns the matched intrinsic
     Result<Table::Overload> MatchIntrinsic(const IntrinsicInfo& intrinsic,
                                            const char* intrinsic_name,
-                                           VectorRef<const type::Type*> args,
+                                           VectorRef<const core::type::Type*> args,
                                            EvaluationStage earliest_eval_stage,
                                            TemplateState templates,
                                            const OnNoMatch& on_no_match) const;
@@ -139,7 +139,7 @@
     ///                  template as `f32`.
     /// @returns the evaluated Candidate information.
     Candidate ScoreOverload(const OverloadInfo& overload,
-                            VectorRef<const type::Type*> args,
+                            VectorRef<const core::type::Type*> args,
                             EvaluationStage earliest_eval_stage,
                             const TemplateState& templates) const;
 
@@ -155,7 +155,7 @@
     /// @returns the resolved Candidate.
     Candidate ResolveCandidate(Candidates&& candidates,
                                const char* intrinsic_name,
-                               VectorRef<const type::Type*> args,
+                               VectorRef<const core::type::Type*> args,
                                TemplateState templates) const;
 
     /// Match constructs a new MatchState
@@ -181,12 +181,12 @@
 
     /// Raises an error when no overload is a clear winner of overload resolution
     void ErrAmbiguousOverload(const char* intrinsic_name,
-                              VectorRef<const type::Type*> args,
+                              VectorRef<const core::type::Type*> args,
                               TemplateState templates,
                               VectorRef<Candidate> candidates) const;
 
     const TableData& data;
-    type::Manager& types;
+    core::type::Manager& types;
     SymbolTable& symbols;
     diag::List& diags;
 };
@@ -194,8 +194,8 @@
 /// @return a string representing a call to a builtin with the given argument
 /// types.
 std::string CallSignature(const char* intrinsic_name,
-                          VectorRef<const type::Type*> args,
-                          const type::Type* template_arg = nullptr) {
+                          VectorRef<const core::type::Type*> args,
+                          const core::type::Type* template_arg = nullptr) {
     StringStream ss;
     ss << intrinsic_name;
     if (template_arg) {
@@ -217,11 +217,11 @@
     return ss.str();
 }
 
-Impl::Impl(const TableData& td, type::Manager& tys, SymbolTable& syms, diag::List& d)
+Impl::Impl(const TableData& td, core::type::Manager& tys, SymbolTable& syms, diag::List& d)
     : data(td), types(tys), symbols(syms), diags(d) {}
 
 Result<Table::Overload> Impl::Lookup(core::Function builtin_type,
-                                     VectorRef<const type::Type*> args,
+                                     VectorRef<const core::type::Type*> args,
                                      EvaluationStage earliest_eval_stage,
                                      const Source& source) {
     const char* intrinsic_name = core::str(builtin_type);
@@ -245,7 +245,7 @@
 }
 
 Result<Table::Overload> Impl::Lookup(core::UnaryOp op,
-                                     const type::Type* arg,
+                                     const core::type::Type* arg,
                                      EvaluationStage earliest_eval_stage,
                                      const Source& source) {
     const IntrinsicInfo* intrinsic_info = nullptr;
@@ -289,8 +289,8 @@
 }
 
 Result<Table::Overload> Impl::Lookup(core::BinaryOp op,
-                                     const type::Type* lhs,
-                                     const type::Type* rhs,
+                                     const core::type::Type* lhs,
+                                     const core::type::Type* rhs,
                                      EvaluationStage earliest_eval_stage,
                                      const Source& source,
                                      bool is_compound) {
@@ -392,8 +392,8 @@
 }
 
 Result<Table::Overload> Impl::Lookup(CtorConv type,
-                                     const type::Type* template_arg,
-                                     VectorRef<const type::Type*> args,
+                                     const core::type::Type* template_arg,
+                                     VectorRef<const core::type::Type*> args,
                                      EvaluationStage earliest_eval_stage,
                                      const Source& source) {
     auto name = str(type);
@@ -439,7 +439,7 @@
 
 Result<Table::Overload> Impl::MatchIntrinsic(const IntrinsicInfo& intrinsic,
                                              const char* intrinsic_name,
-                                             VectorRef<const type::Type*> args,
+                                             VectorRef<const core::type::Type*> args,
                                              EvaluationStage earliest_eval_stage,
                                              TemplateState templates,
                                              const OnNoMatch& on_no_match) const {
@@ -479,7 +479,7 @@
     }
 
     // Build the return type
-    const type::Type* return_type = nullptr;
+    const core::type::Type* return_type = nullptr;
     if (auto* type_indices = data[match.overload->return_type_matcher_indices]) {
         auto* number_indices = data[match.overload->return_number_matcher_indices];
         Any any;
@@ -499,7 +499,7 @@
 }
 
 Impl::Candidate Impl::ScoreOverload(const OverloadInfo& overload,
-                                    VectorRef<const type::Type*> args,
+                                    VectorRef<const core::type::Type*> args,
                                     EvaluationStage earliest_eval_stage,
                                     const TemplateState& in_templates) const {
     // Penalty weights for overload mismatching.
@@ -617,7 +617,7 @@
 
 Impl::Candidate Impl::ResolveCandidate(Impl::Candidates&& candidates,
                                        const char* intrinsic_name,
-                                       VectorRef<const type::Type*> args,
+                                       VectorRef<const core::type::Type*> args,
                                        TemplateState templates) const {
     Vector<uint32_t, kNumFixedParams> best_ranks;
     best_ranks.Resize(args.Length(), 0xffffffff);
@@ -630,7 +630,7 @@
         bool some_won = false;   // An argument ranked less than the 'best' overload's argument
         bool some_lost = false;  // An argument ranked more than the 'best' overload's argument
         for (size_t i = 0; i < args.Length(); i++) {
-            auto rank = type::Type::ConversionRank(args[i], candidate.parameters[i].type);
+            auto rank = core::type::Type::ConversionRank(args[i], candidate.parameters[i].type);
             if (best_ranks[i] > rank) {
                 best_ranks[i] = rank;
                 some_won = true;
@@ -784,7 +784,7 @@
 }
 
 void Impl::ErrAmbiguousOverload(const char* intrinsic_name,
-                                VectorRef<const type::Type*> args,
+                                VectorRef<const core::type::Type*> args,
                                 TemplateState templates,
                                 VectorRef<Candidate> candidates) const {
     StringStream ss;
@@ -822,7 +822,7 @@
 }  // namespace
 
 std::unique_ptr<Table> Table::Create(const TableData& data,
-                                     type::Manager& types,
+                                     core::type::Manager& types,
                                      SymbolTable& symbols,
                                      diag::List& diags) {
     return std::make_unique<Impl>(data, types, symbols, diags);
diff --git a/src/tint/lang/core/intrinsic/table.h b/src/tint/lang/core/intrinsic/table.h
index 91bdbbe..faae544 100644
--- a/src/tint/lang/core/intrinsic/table.h
+++ b/src/tint/lang/core/intrinsic/table.h
@@ -45,7 +45,7 @@
     /// @param diags the diagnostic list to append errors to
     /// @return a pointer to a newly created Table
     static std::unique_ptr<Table> Create(const TableData& data,
-                                         type::Manager& types,
+                                         core::type::Manager& types,
                                          SymbolTable& symbols,
                                          diag::List& diags);
 
@@ -57,7 +57,7 @@
         /// Parameter describes a single parameter
         struct Parameter {
             /// Parameter type
-            const type::Type* const type;
+            const core::type::Type* const type;
             /// Parameter usage
             core::ParameterUsage const usage = core::ParameterUsage::kNone;
 
@@ -78,7 +78,7 @@
         const OverloadInfo* info = nullptr;
 
         /// The resolved overload return type
-        type::Type const* return_type = nullptr;
+        core::type::Type const* return_type = nullptr;
 
         /// The resolved overload parameters
         Vector<Parameter, 8> parameters;
@@ -113,7 +113,7 @@
     /// @param source the source of the builtin call
     /// @return the resolved builtin function overload
     virtual Result<Overload> Lookup(core::Function type,
-                                    VectorRef<const type::Type*> args,
+                                    VectorRef<const core::type::Type*> args,
                                     EvaluationStage earliest_eval_stage,
                                     const Source& source) = 0;
 
@@ -130,7 +130,7 @@
     /// @param source the source of the operator call
     /// @return the resolved unary operator overload
     virtual Result<Overload> Lookup(core::UnaryOp op,
-                                    const type::Type* arg,
+                                    const core::type::Type* arg,
                                     EvaluationStage earliest_eval_stage,
                                     const Source& source) = 0;
 
@@ -149,8 +149,8 @@
     /// @param is_compound true if the binary operator is being used as a compound assignment
     /// @return the resolved binary operator overload
     virtual Result<Overload> Lookup(core::BinaryOp op,
-                                    const type::Type* lhs,
-                                    const type::Type* rhs,
+                                    const core::type::Type* lhs,
+                                    const core::type::Type* rhs,
                                     EvaluationStage earliest_eval_stage,
                                     const Source& source,
                                     bool is_compound) = 0;
@@ -168,8 +168,8 @@
     /// @param source the source of the call
     /// @return the resolved type constructor or conversion function overload
     virtual Result<Overload> Lookup(CtorConv type,
-                                    const type::Type* template_arg,
-                                    VectorRef<const type::Type*> args,
+                                    const core::type::Type* template_arg,
+                                    VectorRef<const core::type::Type*> args,
                                     EvaluationStage earliest_eval_stage,
                                     const Source& source) = 0;
 };
diff --git a/src/tint/lang/core/intrinsic/table_data.h b/src/tint/lang/core/intrinsic/table_data.h
index 34c8083..baea171 100644
--- a/src/tint/lang/core/intrinsic/table_data.h
+++ b/src/tint/lang/core/intrinsic/table_data.h
@@ -256,17 +256,17 @@
 };
 
 /// A special type that matches all TypeMatchers
-class Any final : public Castable<Any, type::Type> {
+class Any final : public Castable<Any, core::type::Type> {
   public:
     Any();
     ~Any() override;
 
-    /// @copydoc type::UniqueNode::Equals
-    bool Equals(const type::UniqueNode& other) const override;
-    /// @copydoc type::Type::FriendlyName
+    /// @copydoc core::type::UniqueNode::Equals
+    bool Equals(const core::type::UniqueNode& other) const override;
+    /// @copydoc core::type::Type::FriendlyName
     std::string FriendlyName() const override;
-    /// @copydoc type::Type::Clone
-    type::Type* Clone(type::CloneContext& ctx) const override;
+    /// @copydoc core::type::Type::Clone
+    core::type::Type* Clone(core::type::CloneContext& ctx) const override;
 };
 
 /// TemplateState holds the state of the template numbers and types.
@@ -282,7 +282,7 @@
     /// @param idx the index of the template type
     /// @param ty the type
     /// @returns true on match or newly defined
-    const type::Type* Type(size_t idx, const type::Type* ty) {
+    const core::type::Type* Type(size_t idx, const core::type::Type* ty) {
         if (idx >= types_.Length()) {
             types_.Resize(idx + 1);
         }
@@ -291,7 +291,7 @@
             t = ty;
             return ty;
         }
-        ty = type::Type::Common(Vector{t, ty});
+        ty = core::type::Type::Common(Vector{t, ty});
         if (ty) {
             t = ty;
         }
@@ -319,7 +319,7 @@
     /// @param idx the index of the template type
     /// @returns the template type with index @p idx, or nullptr if the type was not
     /// defined.
-    const type::Type* Type(size_t idx) const {
+    const core::type::Type* Type(size_t idx) const {
         if (idx >= types_.Length()) {
             return nullptr;
         }
@@ -329,7 +329,7 @@
     /// SetType replaces the template type with index @p idx with type @p ty.
     /// @param idx the index of the template type
     /// @param ty the new type for the template
-    void SetType(size_t idx, const type::Type* ty) {
+    void SetType(size_t idx, const core::type::Type* ty) {
         if (idx >= types_.Length()) {
             types_.Resize(idx + 1);
         }
@@ -349,7 +349,7 @@
     size_t Count() const { return types_.Length() + numbers_.Length(); }
 
   private:
-    Vector<const type::Type*, 4> types_;
+    Vector<const core::type::Type*, 4> types_;
     Vector<Number, 2> numbers_;
 };
 
@@ -366,7 +366,7 @@
     /// @param type_matcher_indices the remaining type matcher indices
     /// @param number_matcher_indices the remaining number matcher indices
     /// @param s the required evaluation stage of the overload
-    MatchState(type::Manager& ty_mgr,
+    MatchState(core::type::Manager& ty_mgr,
                SymbolTable& syms,
                TemplateState& t,
                const TableData& d,
@@ -384,7 +384,7 @@
           number_matcher_indices_(number_matcher_indices) {}
 
     /// The type manager
-    type::Manager& types;
+    core::type::Manager& types;
 
     /// The symbol manager
     SymbolTable& symbols;
@@ -405,7 +405,7 @@
     /// @param ty the type to try matching
     /// @returns the canonical expected type if the type matches, otherwise nullptr.
     /// @note: The matcher indices are progressed on calling.
-    inline const type::Type* Type(const type::Type* ty);
+    inline const core::type::Type* Type(const core::type::Type* ty);
 
     /// Num uses the next NumMatcher from the matcher indices to match @p number.
     /// @param number the number to try matching
@@ -435,7 +435,7 @@
     /// Match may define and refine the template types and numbers in state.
     /// The parameter `type` is the type to match
     /// Returns the canonicalized type on match, otherwise nullptr
-    using MatchFn = const type::Type*(MatchState& state, const type::Type* type);
+    using MatchFn = const core::type::Type*(MatchState& state, const core::type::Type* type);
 
     /// @see #MatchFn
     MatchFn* const match;
@@ -604,7 +604,7 @@
     const IntrinsicInfo& unary_minus;
 };
 
-const type::Type* MatchState::Type(const type::Type* ty) {
+const core::type::Type* MatchState::Type(const core::type::Type* ty) {
     TypeMatcherIndex matcher_index{(*type_matcher_indices_++).value};
     auto& matcher = data[matcher_index];
     return matcher.match(*this, ty);
@@ -637,7 +637,7 @@
     /// The TypeMatcher for the template type with the index `INDEX`
     static constexpr TypeMatcher matcher{
         /* match */
-        [](MatchState& state, const type::Type* type) -> const type::Type* {
+        [](MatchState& state, const core::type::Type* type) -> const core::type::Type* {
             if (type->Is<Any>()) {
                 return state.templates.Type(INDEX);
             }
diff --git a/src/tint/lang/core/intrinsic/table_test.cc b/src/tint/lang/core/intrinsic/table_test.cc
index 3a63789..62aff6e 100644
--- a/src/tint/lang/core/intrinsic/table_test.cc
+++ b/src/tint/lang/core/intrinsic/table_test.cc
@@ -55,7 +55,7 @@
 };
 
 TEST_F(IntrinsicTableTest, MatchF32) {
-    auto* f32 = create<type::F32>();
+    auto* f32 = create<core::type::F32>();
     auto result =
         table->Lookup(core::Function::kCos, Vector{f32}, EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -66,7 +66,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchF32) {
-    auto* i32 = create<type::I32>();
+    auto* i32 = create<core::type::I32>();
     auto result =
         table->Lookup(core::Function::kCos, Vector{i32}, EvaluationStage::kConstant, Source{});
     ASSERT_FALSE(result);
@@ -74,9 +74,9 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchU32) {
-    auto* f32 = create<type::F32>();
-    auto* u32 = create<type::U32>();
-    auto* vec2_f32 = create<type::Vector>(f32, 2u);
+    auto* f32 = create<core::type::F32>();
+    auto* u32 = create<core::type::U32>();
+    auto* vec2_f32 = create<core::type::Vector>(f32, 2u);
     auto result = table->Lookup(core::Function::kUnpack2X16Float, Vector{u32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -87,7 +87,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchU32) {
-    auto* f32 = create<type::F32>();
+    auto* f32 = create<core::type::F32>();
     auto result = table->Lookup(core::Function::kUnpack2X16Float, Vector{f32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_FALSE(result);
@@ -95,10 +95,10 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchI32) {
-    auto* f32 = create<type::F32>();
-    auto* i32 = create<type::I32>();
-    auto* vec4_f32 = create<type::Vector>(f32, 4u);
-    auto* tex = create<type::SampledTexture>(type::TextureDimension::k1d, f32);
+    auto* f32 = create<core::type::F32>();
+    auto* i32 = create<core::type::I32>();
+    auto* vec4_f32 = create<core::type::Vector>(f32, 4u);
+    auto* tex = create<core::type::SampledTexture>(core::type::TextureDimension::k1d, f32);
     auto result = table->Lookup(core::Function::kTextureLoad, Vector{tex, i32, i32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -114,8 +114,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchI32) {
-    auto* f32 = create<type::F32>();
-    auto* tex = create<type::SampledTexture>(type::TextureDimension::k1d, f32);
+    auto* f32 = create<core::type::F32>();
+    auto* tex = create<core::type::SampledTexture>(core::type::TextureDimension::k1d, f32);
     auto result = table->Lookup(core::Function::kTextureLoad, Vector{tex, f32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_FALSE(result);
@@ -123,7 +123,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchIU32AsI32) {
-    auto* i32 = create<type::I32>();
+    auto* i32 = create<core::type::I32>();
     auto result = table->Lookup(core::Function::kCountOneBits, Vector{i32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -134,7 +134,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchIU32AsU32) {
-    auto* u32 = create<type::U32>();
+    auto* u32 = create<core::type::U32>();
     auto result = table->Lookup(core::Function::kCountOneBits, Vector{u32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -145,7 +145,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchIU32) {
-    auto* f32 = create<type::F32>();
+    auto* f32 = create<core::type::F32>();
     auto result = table->Lookup(core::Function::kCountOneBits, Vector{f32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_FALSE(result);
@@ -153,7 +153,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchFIU32AsI32) {
-    auto* i32 = create<type::I32>();
+    auto* i32 = create<core::type::I32>();
     auto result = table->Lookup(core::Function::kClamp, Vector{i32, i32, i32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -166,7 +166,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchFIU32AsU32) {
-    auto* u32 = create<type::U32>();
+    auto* u32 = create<core::type::U32>();
     auto result = table->Lookup(core::Function::kClamp, Vector{u32, u32, u32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -179,7 +179,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchFIU32AsF32) {
-    auto* f32 = create<type::F32>();
+    auto* f32 = create<core::type::F32>();
     auto result = table->Lookup(core::Function::kClamp, Vector{f32, f32, f32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -192,7 +192,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchFIU32) {
-    auto* bool_ = create<type::Bool>();
+    auto* bool_ = create<core::type::Bool>();
     auto result = table->Lookup(core::Function::kClamp, Vector{bool_, bool_, bool_},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_FALSE(result);
@@ -200,8 +200,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchBool) {
-    auto* f32 = create<type::F32>();
-    auto* bool_ = create<type::Bool>();
+    auto* f32 = create<core::type::F32>();
+    auto* bool_ = create<core::type::Bool>();
     auto result = table->Lookup(core::Function::kSelect, Vector{f32, f32, bool_},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -214,7 +214,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchBool) {
-    auto* f32 = create<type::F32>();
+    auto* f32 = create<core::type::F32>();
     auto result = table->Lookup(core::Function::kSelect, Vector{f32, f32, f32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_FALSE(result);
@@ -222,10 +222,10 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchPointer) {
-    auto* i32 = create<type::I32>();
-    auto* atomicI32 = create<type::Atomic>(i32);
-    auto* ptr =
-        create<type::Pointer>(core::AddressSpace::kWorkgroup, atomicI32, core::Access::kReadWrite);
+    auto* i32 = create<core::type::I32>();
+    auto* atomicI32 = create<core::type::Atomic>(i32);
+    auto* ptr = create<core::type::Pointer>(core::AddressSpace::kWorkgroup, atomicI32,
+                                            core::Access::kReadWrite);
     auto result = table->Lookup(core::Function::kAtomicLoad, Vector{ptr},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -236,8 +236,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchPointer) {
-    auto* i32 = create<type::I32>();
-    auto* atomicI32 = create<type::Atomic>(i32);
+    auto* i32 = create<core::type::I32>();
+    auto* atomicI32 = create<core::type::Atomic>(i32);
     auto result = table->Lookup(core::Function::kAtomicLoad, Vector{atomicI32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_FALSE(result);
@@ -245,23 +245,23 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchArray) {
-    auto* arr =
-        create<type::Array>(create<type::U32>(), create<type::RuntimeArrayCount>(), 4u, 4u, 4u, 4u);
+    auto* arr = create<core::type::Array>(create<core::type::U32>(),
+                                          create<core::type::RuntimeArrayCount>(), 4u, 4u, 4u, 4u);
     auto* arr_ptr =
-        create<type::Pointer>(core::AddressSpace::kStorage, arr, core::Access::kReadWrite);
+        create<core::type::Pointer>(core::AddressSpace::kStorage, arr, core::Access::kReadWrite);
     auto result = table->Lookup(core::Function::kArrayLength, Vector{arr_ptr},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
     ASSERT_EQ(Diagnostics().str(), "");
-    EXPECT_TRUE(result->return_type->Is<type::U32>());
+    EXPECT_TRUE(result->return_type->Is<core::type::U32>());
     ASSERT_EQ(result->parameters.Length(), 1u);
     auto* param_type = result->parameters[0].type;
-    ASSERT_TRUE(param_type->Is<type::Pointer>());
-    EXPECT_TRUE(param_type->As<type::Pointer>()->StoreType()->Is<type::Array>());
+    ASSERT_TRUE(param_type->Is<core::type::Pointer>());
+    EXPECT_TRUE(param_type->As<core::type::Pointer>()->StoreType()->Is<core::type::Array>());
 }
 
 TEST_F(IntrinsicTableTest, MismatchArray) {
-    auto* f32 = create<type::F32>();
+    auto* f32 = create<core::type::F32>();
     auto result = table->Lookup(core::Function::kArrayLength, Vector{f32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_FALSE(result);
@@ -269,11 +269,11 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchSampler) {
-    auto* f32 = create<type::F32>();
-    auto* vec2_f32 = create<type::Vector>(f32, 2u);
-    auto* vec4_f32 = create<type::Vector>(f32, 4u);
-    auto* tex = create<type::SampledTexture>(type::TextureDimension::k2d, f32);
-    auto* sampler = create<type::Sampler>(type::SamplerKind::kSampler);
+    auto* f32 = create<core::type::F32>();
+    auto* vec2_f32 = create<core::type::Vector>(f32, 2u);
+    auto* vec4_f32 = create<core::type::Vector>(f32, 4u);
+    auto* tex = create<core::type::SampledTexture>(core::type::TextureDimension::k2d, f32);
+    auto* sampler = create<core::type::Sampler>(core::type::SamplerKind::kSampler);
     auto result = table->Lookup(core::Function::kTextureSample, Vector{tex, sampler, vec2_f32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -289,9 +289,9 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchSampler) {
-    auto* f32 = create<type::F32>();
-    auto* vec2_f32 = create<type::Vector>(f32, 2u);
-    auto* tex = create<type::SampledTexture>(type::TextureDimension::k2d, f32);
+    auto* f32 = create<core::type::F32>();
+    auto* vec2_f32 = create<core::type::Vector>(f32, 2u);
+    auto* tex = create<core::type::SampledTexture>(core::type::TextureDimension::k2d, f32);
     auto result = table->Lookup(core::Function::kTextureSample, Vector{tex, f32, vec2_f32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_FALSE(result);
@@ -299,11 +299,11 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchSampledTexture) {
-    auto* i32 = create<type::I32>();
-    auto* f32 = create<type::F32>();
-    auto* vec2_i32 = create<type::Vector>(i32, 2u);
-    auto* vec4_f32 = create<type::Vector>(f32, 4u);
-    auto* tex = create<type::SampledTexture>(type::TextureDimension::k2d, f32);
+    auto* i32 = create<core::type::I32>();
+    auto* f32 = create<core::type::F32>();
+    auto* vec2_i32 = create<core::type::Vector>(i32, 2u);
+    auto* vec4_f32 = create<core::type::Vector>(f32, 4u);
+    auto* tex = create<core::type::SampledTexture>(core::type::TextureDimension::k2d, f32);
     auto result = table->Lookup(core::Function::kTextureLoad, Vector{tex, vec2_i32, i32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -319,11 +319,11 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchMultisampledTexture) {
-    auto* i32 = create<type::I32>();
-    auto* f32 = create<type::F32>();
-    auto* vec2_i32 = create<type::Vector>(i32, 2u);
-    auto* vec4_f32 = create<type::Vector>(f32, 4u);
-    auto* tex = create<type::MultisampledTexture>(type::TextureDimension::k2d, f32);
+    auto* i32 = create<core::type::I32>();
+    auto* f32 = create<core::type::F32>();
+    auto* vec2_i32 = create<core::type::Vector>(i32, 2u);
+    auto* vec4_f32 = create<core::type::Vector>(f32, 4u);
+    auto* tex = create<core::type::MultisampledTexture>(core::type::TextureDimension::k2d, f32);
     auto result = table->Lookup(core::Function::kTextureLoad, Vector{tex, vec2_i32, i32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -339,10 +339,10 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchDepthTexture) {
-    auto* f32 = create<type::F32>();
-    auto* i32 = create<type::I32>();
-    auto* vec2_i32 = create<type::Vector>(i32, 2u);
-    auto* tex = create<type::DepthTexture>(type::TextureDimension::k2d);
+    auto* f32 = create<core::type::F32>();
+    auto* i32 = create<core::type::I32>();
+    auto* vec2_i32 = create<core::type::Vector>(i32, 2u);
+    auto* tex = create<core::type::DepthTexture>(core::type::TextureDimension::k2d);
     auto result = table->Lookup(core::Function::kTextureLoad, Vector{tex, vec2_i32, i32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -358,10 +358,10 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchDepthMultisampledTexture) {
-    auto* f32 = create<type::F32>();
-    auto* i32 = create<type::I32>();
-    auto* vec2_i32 = create<type::Vector>(i32, 2u);
-    auto* tex = create<type::DepthMultisampledTexture>(type::TextureDimension::k2d);
+    auto* f32 = create<core::type::F32>();
+    auto* i32 = create<core::type::I32>();
+    auto* vec2_i32 = create<core::type::Vector>(i32, 2u);
+    auto* tex = create<core::type::DepthMultisampledTexture>(core::type::TextureDimension::k2d);
     auto result = table->Lookup(core::Function::kTextureLoad, Vector{tex, vec2_i32, i32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -377,11 +377,11 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchExternalTexture) {
-    auto* f32 = create<type::F32>();
-    auto* i32 = create<type::I32>();
-    auto* vec2_i32 = create<type::Vector>(i32, 2u);
-    auto* vec4_f32 = create<type::Vector>(f32, 4u);
-    auto* tex = create<type::ExternalTexture>();
+    auto* f32 = create<core::type::F32>();
+    auto* i32 = create<core::type::I32>();
+    auto* vec2_i32 = create<core::type::Vector>(i32, 2u);
+    auto* vec4_f32 = create<core::type::Vector>(f32, 4u);
+    auto* tex = create<core::type::ExternalTexture>();
     auto result = table->Lookup(core::Function::kTextureLoad, Vector{tex, vec2_i32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -395,13 +395,14 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchWOStorageTexture) {
-    auto* f32 = create<type::F32>();
-    auto* i32 = create<type::I32>();
-    auto* vec2_i32 = create<type::Vector>(i32, 2u);
-    auto* vec4_f32 = create<type::Vector>(f32, 4u);
-    auto* subtype = type::StorageTexture::SubtypeFor(core::TexelFormat::kR32Float, Types());
-    auto* tex = create<type::StorageTexture>(
-        type::TextureDimension::k2d, core::TexelFormat::kR32Float, core::Access::kWrite, subtype);
+    auto* f32 = create<core::type::F32>();
+    auto* i32 = create<core::type::I32>();
+    auto* vec2_i32 = create<core::type::Vector>(i32, 2u);
+    auto* vec4_f32 = create<core::type::Vector>(f32, 4u);
+    auto* subtype = core::type::StorageTexture::SubtypeFor(core::TexelFormat::kR32Float, Types());
+    auto* tex = create<core::type::StorageTexture>(core::type::TextureDimension::k2d,
+                                                   core::TexelFormat::kR32Float,
+                                                   core::Access::kWrite, subtype);
 
     auto result = table->Lookup(core::Function::kTextureStore, Vector{tex, vec2_i32, vec4_f32},
                                 EvaluationStage::kConstant, Source{});
@@ -418,9 +419,9 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchTexture) {
-    auto* f32 = create<type::F32>();
-    auto* i32 = create<type::I32>();
-    auto* vec2_i32 = create<type::Vector>(i32, 2u);
+    auto* f32 = create<core::type::F32>();
+    auto* i32 = create<core::type::I32>();
+    auto* vec2_i32 = create<core::type::Vector>(i32, 2u);
     auto result = table->Lookup(core::Function::kTextureLoad, Vector{f32, vec2_i32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_FALSE(result);
@@ -428,13 +429,13 @@
 }
 
 TEST_F(IntrinsicTableTest, ImplicitLoadOnReference) {
-    auto* f32 = create<type::F32>();
-    auto result = table->Lookup(
-        core::Function::kCos,
-        Vector{
-            create<type::Reference>(core::AddressSpace::kFunction, f32, core::Access::kReadWrite),
-        },
-        EvaluationStage::kConstant, Source{});
+    auto* f32 = create<core::type::F32>();
+    auto result = table->Lookup(core::Function::kCos,
+                                Vector{
+                                    create<core::type::Reference>(core::AddressSpace::kFunction,
+                                                                  f32, core::Access::kReadWrite),
+                                },
+                                EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
     ASSERT_EQ(Diagnostics().str(), "");
     EXPECT_EQ(result->return_type, f32);
@@ -443,7 +444,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchTemplateType) {
-    auto* f32 = create<type::F32>();
+    auto* f32 = create<core::type::F32>();
     auto result = table->Lookup(core::Function::kClamp, Vector{f32, f32, f32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -455,8 +456,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchTemplateType) {
-    auto* f32 = create<type::F32>();
-    auto* u32 = create<type::U32>();
+    auto* f32 = create<core::type::F32>();
+    auto* u32 = create<core::type::U32>();
     auto result = table->Lookup(core::Function::kClamp, Vector{f32, u32, f32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_FALSE(result);
@@ -464,8 +465,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchOpenSizeVector) {
-    auto* f32 = create<type::F32>();
-    auto* vec2_f32 = create<type::Vector>(f32, 2u);
+    auto* f32 = create<core::type::F32>();
+    auto* vec2_f32 = create<core::type::Vector>(f32, 2u);
     auto result = table->Lookup(core::Function::kClamp, Vector{vec2_f32, vec2_f32, vec2_f32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -478,9 +479,9 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchOpenSizeVector) {
-    auto* f32 = create<type::F32>();
-    auto* u32 = create<type::U32>();
-    auto* vec2_f32 = create<type::Vector>(f32, 2u);
+    auto* f32 = create<core::type::F32>();
+    auto* u32 = create<core::type::U32>();
+    auto* vec2_f32 = create<core::type::Vector>(f32, 2u);
     auto result = table->Lookup(core::Function::kClamp, Vector{vec2_f32, u32, vec2_f32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_FALSE(result);
@@ -488,9 +489,9 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchOpenSizeMatrix) {
-    auto* f32 = create<type::F32>();
-    auto* vec3_f32 = create<type::Vector>(f32, 3u);
-    auto* mat3_f32 = create<type::Matrix>(vec3_f32, 3u);
+    auto* f32 = create<core::type::F32>();
+    auto* vec3_f32 = create<core::type::Vector>(f32, 3u);
+    auto* mat3_f32 = create<core::type::Matrix>(vec3_f32, 3u);
     auto result = table->Lookup(core::Function::kDeterminant, Vector{mat3_f32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -501,9 +502,9 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchOpenSizeMatrix) {
-    auto* f32 = create<type::F32>();
-    auto* vec2_f32 = create<type::Vector>(f32, 2u);
-    auto* mat3x2_f32 = create<type::Matrix>(vec2_f32, 3u);
+    auto* f32 = create<core::type::F32>();
+    auto* vec2_f32 = create<core::type::Vector>(f32, 2u);
+    auto* mat3x2_f32 = create<core::type::Matrix>(vec2_f32, 3u);
     auto result = table->Lookup(core::Function::kDeterminant, Vector{mat3x2_f32},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_FALSE(result);
@@ -511,8 +512,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchDifferentArgsElementType_Builtin_ConstantEval) {
-    auto* af = create<type::AbstractFloat>();
-    auto* bool_ = create<type::Bool>();
+    auto* af = create<core::type::AbstractFloat>();
+    auto* bool_ = create<core::type::Bool>();
     auto result = table->Lookup(core::Function::kSelect, Vector{af, af, bool_},
                                 EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -526,24 +527,24 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchDifferentArgsElementType_Builtin_RuntimeEval) {
-    auto* af = create<type::AbstractFloat>();
-    auto* bool_ref = create<type::Reference>(core::AddressSpace::kFunction, create<type::Bool>(),
-                                             core::Access::kReadWrite);
+    auto* af = create<core::type::AbstractFloat>();
+    auto* bool_ref = create<core::type::Reference>(
+        core::AddressSpace::kFunction, create<core::type::Bool>(), core::Access::kReadWrite);
     auto result = table->Lookup(core::Function::kSelect, Vector{af, af, bool_ref},
                                 EvaluationStage::kRuntime, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
     ASSERT_EQ(Diagnostics().str(), "");
     EXPECT_NE(result->const_eval_fn, nullptr);
-    EXPECT_TRUE(result->return_type->Is<type::F32>());
+    EXPECT_TRUE(result->return_type->Is<core::type::F32>());
     ASSERT_EQ(result->parameters.Length(), 3u);
-    EXPECT_TRUE(result->parameters[0].type->Is<type::F32>());
-    EXPECT_TRUE(result->parameters[1].type->Is<type::F32>());
-    EXPECT_TRUE(result->parameters[2].type->Is<type::Bool>());
+    EXPECT_TRUE(result->parameters[0].type->Is<core::type::F32>());
+    EXPECT_TRUE(result->parameters[1].type->Is<core::type::F32>());
+    EXPECT_TRUE(result->parameters[2].type->Is<core::type::Bool>());
 }
 
 TEST_F(IntrinsicTableTest, MatchDifferentArgsElementType_Binary_ConstantEval) {
-    auto* ai = create<type::AbstractInt>();
-    auto* u32 = create<type::U32>();
+    auto* ai = create<core::type::AbstractInt>();
+    auto* u32 = create<core::type::U32>();
     auto result = table->Lookup(core::BinaryOp::kShiftLeft, ai, u32, EvaluationStage::kConstant,
                                 Source{}, false);
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -555,22 +556,22 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchDifferentArgsElementType_Binary_RuntimeEval) {
-    auto* ai = create<type::AbstractInt>();
-    auto* u32 = create<type::U32>();
+    auto* ai = create<core::type::AbstractInt>();
+    auto* u32 = create<core::type::U32>();
     auto result = table->Lookup(core::BinaryOp::kShiftLeft, ai, u32, EvaluationStage::kRuntime,
                                 Source{}, false);
     ASSERT_TRUE(result) << Diagnostics().str();
     ASSERT_NE(result->const_eval_fn, nullptr) << Diagnostics().str();
     ASSERT_EQ(Diagnostics().str(), "");
-    EXPECT_TRUE(result->return_type->Is<type::I32>());
-    EXPECT_TRUE(result->parameters[0].type->Is<type::I32>());
-    EXPECT_TRUE(result->parameters[1].type->Is<type::U32>());
+    EXPECT_TRUE(result->return_type->Is<core::type::I32>());
+    EXPECT_TRUE(result->parameters[0].type->Is<core::type::I32>());
+    EXPECT_TRUE(result->parameters[1].type->Is<core::type::U32>());
 }
 
 TEST_F(IntrinsicTableTest, OverloadOrderByNumberOfParameters) {
     // None of the arguments match, so expect the overloads with 2 parameters to
     // come first
-    auto* bool_ = create<type::Bool>();
+    auto* bool_ = create<core::type::Bool>();
     auto result = table->Lookup(core::Function::kTextureDimensions, Vector{bool_, bool_},
                                 EvaluationStage::kConstant, Source{});
     EXPECT_FALSE(result);
@@ -609,8 +610,8 @@
 }
 
 TEST_F(IntrinsicTableTest, OverloadOrderByMatchingParameter) {
-    auto* tex = create<type::DepthTexture>(type::TextureDimension::k2d);
-    auto* bool_ = create<type::Bool>();
+    auto* tex = create<core::type::DepthTexture>(core::type::TextureDimension::k2d);
+    auto* bool_ = create<core::type::Bool>();
     auto result = table->Lookup(core::Function::kTextureDimensions, Vector{tex, bool_},
                                 EvaluationStage::kConstant, Source{});
     EXPECT_FALSE(result);
@@ -649,8 +650,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchUnaryOp) {
-    auto* i32 = create<type::I32>();
-    auto* vec3_i32 = create<type::Vector>(i32, 3u);
+    auto* i32 = create<core::type::I32>();
+    auto* vec3_i32 = create<core::type::Vector>(i32, 3u);
     auto result = table->Lookup(core::UnaryOp::kNegation, vec3_i32, EvaluationStage::kConstant,
                                 Source{{12, 34}});
     EXPECT_EQ(result->return_type, vec3_i32);
@@ -658,7 +659,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchUnaryOp) {
-    auto* bool_ = create<type::Bool>();
+    auto* bool_ = create<core::type::Bool>();
     auto result = table->Lookup(core::UnaryOp::kNegation, bool_, EvaluationStage::kConstant,
                                 Source{{12, 34}});
     ASSERT_FALSE(result);
@@ -671,7 +672,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchUnaryOp_Constant) {
-    auto* ai = create<type::AbstractInt>();
+    auto* ai = create<core::type::AbstractInt>();
     auto result =
         table->Lookup(core::UnaryOp::kNegation, ai, EvaluationStage::kConstant, Source{{12, 34}});
     EXPECT_EQ(result->return_type, ai);
@@ -679,17 +680,17 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchUnaryOp_Runtime) {
-    auto* ai = create<type::AbstractInt>();
+    auto* ai = create<core::type::AbstractInt>();
     auto result =
         table->Lookup(core::UnaryOp::kNegation, ai, EvaluationStage::kRuntime, Source{{12, 34}});
     EXPECT_NE(result->return_type, ai);
-    EXPECT_TRUE(result->return_type->Is<type::I32>());
+    EXPECT_TRUE(result->return_type->Is<core::type::I32>());
     EXPECT_EQ(Diagnostics().str(), "");
 }
 
 TEST_F(IntrinsicTableTest, MatchBinaryOp) {
-    auto* i32 = create<type::I32>();
-    auto* vec3_i32 = create<type::Vector>(i32, 3u);
+    auto* i32 = create<core::type::I32>();
+    auto* vec3_i32 = create<core::type::Vector>(i32, 3u);
     auto result = table->Lookup(core::BinaryOp::kMultiply, i32, vec3_i32,
                                 EvaluationStage::kConstant, Source{{12, 34}},
                                 /* is_compound */ false);
@@ -700,8 +701,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchBinaryOp) {
-    auto* f32 = create<type::F32>();
-    auto* bool_ = create<type::Bool>();
+    auto* f32 = create<core::type::F32>();
+    auto* bool_ = create<core::type::Bool>();
     auto result = table->Lookup(core::BinaryOp::kMultiply, f32, bool_, EvaluationStage::kConstant,
                                 Source{{12, 34}},
                                 /* is_compound */ false);
@@ -722,8 +723,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchCompoundOp) {
-    auto* i32 = create<type::I32>();
-    auto* vec3_i32 = create<type::Vector>(i32, 3u);
+    auto* i32 = create<core::type::I32>();
+    auto* vec3_i32 = create<core::type::Vector>(i32, 3u);
     auto result = table->Lookup(core::BinaryOp::kMultiply, i32, vec3_i32,
                                 EvaluationStage::kConstant, Source{{12, 34}},
                                 /* is_compound */ true);
@@ -734,8 +735,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchCompoundOp) {
-    auto* f32 = create<type::F32>();
-    auto* bool_ = create<type::Bool>();
+    auto* f32 = create<core::type::F32>();
+    auto* bool_ = create<core::type::Bool>();
     auto result = table->Lookup(core::BinaryOp::kMultiply, f32, bool_, EvaluationStage::kConstant,
                                 Source{{12, 34}},
                                 /* is_compound */ true);
@@ -756,8 +757,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchTypeInitializerImplicit) {
-    auto* i32 = create<type::I32>();
-    auto* vec3_i32 = create<type::Vector>(i32, 3u);
+    auto* i32 = create<core::type::I32>();
+    auto* vec3_i32 = create<core::type::Vector>(i32, 3u);
     auto result = table->Lookup(CtorConv::kVec3, nullptr, Vector{i32, i32, i32},
                                 EvaluationStage::kConstant, Source{{12, 34}});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -771,8 +772,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchTypeInitializerExplicit) {
-    auto* i32 = create<type::I32>();
-    auto* vec3_i32 = create<type::Vector>(i32, 3u);
+    auto* i32 = create<core::type::I32>();
+    auto* vec3_i32 = create<core::type::Vector>(i32, 3u);
     auto result = table->Lookup(CtorConv::kVec3, i32, Vector{i32, i32, i32},
                                 EvaluationStage::kConstant, Source{{12, 34}});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -786,8 +787,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchTypeInitializerImplicit) {
-    auto* i32 = create<type::I32>();
-    auto* f32 = create<type::F32>();
+    auto* i32 = create<core::type::I32>();
+    auto* f32 = create<core::type::F32>();
     auto result = table->Lookup(CtorConv::kVec3, nullptr, Vector{i32, f32, i32},
                                 EvaluationStage::kConstant, Source{{12, 34}});
     ASSERT_FALSE(result);
@@ -813,8 +814,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchTypeInitializerExplicit) {
-    auto* i32 = create<type::I32>();
-    auto* f32 = create<type::F32>();
+    auto* i32 = create<core::type::I32>();
+    auto* f32 = create<core::type::F32>();
     auto result = table->Lookup(CtorConv::kVec3, i32, Vector{i32, f32, i32},
                                 EvaluationStage::kConstant, Source{{12, 34}});
     ASSERT_FALSE(result);
@@ -840,8 +841,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchTypeInitializerImplicitVecFromVecAbstract) {
-    auto* ai = create<type::AbstractInt>();
-    auto* vec3_ai = create<type::Vector>(ai, 3u);
+    auto* ai = create<core::type::AbstractInt>();
+    auto* vec3_ai = create<core::type::Vector>(ai, 3u);
     auto result = table->Lookup(CtorConv::kVec3, nullptr, Vector{vec3_ai},
                                 EvaluationStage::kConstant, Source{{12, 34}});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -853,10 +854,10 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchTypeInitializerImplicitMatFromVec) {
-    auto* af = create<type::AbstractFloat>();
-    auto* vec2_ai = create<type::Vector>(create<type::AbstractInt>(), 2u);
-    auto* vec2_af = create<type::Vector>(af, 2u);
-    auto* mat2x2_af = create<type::Matrix>(vec2_af, 2u);
+    auto* af = create<core::type::AbstractFloat>();
+    auto* vec2_ai = create<core::type::Vector>(create<core::type::AbstractInt>(), 2u);
+    auto* vec2_af = create<core::type::Vector>(af, 2u);
+    auto* mat2x2_af = create<core::type::Matrix>(vec2_af, 2u);
     auto result = table->Lookup(CtorConv::kMat2x2, nullptr, Vector{vec2_ai, vec2_ai},
                                 EvaluationStage::kConstant, Source{{12, 34}});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -869,8 +870,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchTypeInitializer_ConstantEval) {
-    auto* ai = create<type::AbstractInt>();
-    auto* vec3_ai = create<type::Vector>(ai, 3u);
+    auto* ai = create<core::type::AbstractInt>();
+    auto* vec3_ai = create<core::type::Vector>(ai, 3u);
     auto result = table->Lookup(CtorConv::kVec3, nullptr, Vector{ai, ai, ai},
                                 EvaluationStage::kConstant, Source{{12, 34}});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -885,7 +886,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchTypeInitializer_RuntimeEval) {
-    auto* ai = create<type::AbstractInt>();
+    auto* ai = create<core::type::AbstractInt>();
     auto result = table->Lookup(CtorConv::kVec3, nullptr, Vector{ai, ai, ai},
                                 EvaluationStage::kRuntime, Source{{12, 34}});
     auto* i32 = create<type::I32>();
@@ -902,10 +903,10 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchTypeConversion) {
-    auto* i32 = create<type::I32>();
-    auto* vec3_i32 = create<type::Vector>(i32, 3u);
-    auto* f32 = create<type::F32>();
-    auto* vec3_f32 = create<type::Vector>(f32, 3u);
+    auto* i32 = create<core::type::I32>();
+    auto* vec3_i32 = create<core::type::Vector>(i32, 3u);
+    auto* f32 = create<core::type::F32>();
+    auto* vec3_f32 = create<core::type::Vector>(f32, 3u);
     auto result = table->Lookup(CtorConv::kVec3, i32, Vector{vec3_f32}, EvaluationStage::kConstant,
                                 Source{{12, 34}});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -916,9 +917,9 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchTypeConversion) {
-    auto* arr =
-        create<type::Array>(create<type::U32>(), create<type::RuntimeArrayCount>(), 4u, 4u, 4u, 4u);
-    auto* f32 = create<type::F32>();
+    auto* arr = create<core::type::Array>(create<core::type::U32>(),
+                                          create<core::type::RuntimeArrayCount>(), 4u, 4u, 4u, 4u);
+    auto* f32 = create<core::type::F32>();
     auto result = table->Lookup(CtorConv::kVec3, f32, Vector{arr}, EvaluationStage::kConstant,
                                 Source{{12, 34}});
     ASSERT_FALSE(result);
@@ -944,11 +945,11 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchTypeConversion_ConstantEval) {
-    auto* ai = create<type::AbstractInt>();
-    auto* af = create<type::AbstractFloat>();
-    auto* vec3_ai = create<type::Vector>(ai, 3u);
-    auto* f32 = create<type::F32>();
-    auto* vec3_f32 = create<type::Vector>(f32, 3u);
+    auto* ai = create<core::type::AbstractInt>();
+    auto* af = create<core::type::AbstractFloat>();
+    auto* vec3_ai = create<core::type::Vector>(ai, 3u);
+    auto* f32 = create<core::type::F32>();
+    auto* vec3_f32 = create<core::type::Vector>(f32, 3u);
     auto result = table->Lookup(CtorConv::kVec3, af, Vector{vec3_ai}, EvaluationStage::kConstant,
                                 Source{{12, 34}});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -961,11 +962,11 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchTypeConversion_RuntimeEval) {
-    auto* ai = create<type::AbstractInt>();
-    auto* af = create<type::AbstractFloat>();
-    auto* vec3_ai = create<type::Vector>(ai, 3u);
-    auto* vec3_f32 = create<type::Vector>(create<type::F32>(), 3u);
-    auto* vec3_i32 = create<type::Vector>(create<type::I32>(), 3u);
+    auto* ai = create<core::type::AbstractInt>();
+    auto* af = create<core::type::AbstractFloat>();
+    auto* vec3_ai = create<core::type::Vector>(ai, 3u);
+    auto* vec3_f32 = create<core::type::Vector>(create<core::type::F32>(), 3u);
+    auto* vec3_i32 = create<core::type::Vector>(create<core::type::I32>(), 3u);
     auto result = table->Lookup(CtorConv::kVec3, af, Vector{vec3_ai}, EvaluationStage::kRuntime,
                                 Source{{12, 34}});
     ASSERT_TRUE(result) << Diagnostics().str();
@@ -977,8 +978,8 @@
 }
 
 TEST_F(IntrinsicTableTest, Err257Arguments) {  // crbug.com/1323605
-    auto* f32 = create<type::F32>();
-    Vector<const type::Type*, 0> arg_tys;
+    auto* f32 = create<core::type::F32>();
+    Vector<const core::type::Type*, 0> arg_tys;
     arg_tys.Resize(257, f32);
     auto result = table->Lookup(core::Function::kAbs, std::move(arg_tys),
                                 EvaluationStage::kConstant, Source{});
@@ -991,8 +992,8 @@
     //    ctor i32(i32) -> i32
     //    conv i32<T: scalar_no_i32>(T) -> i32
     // The first should win overload resolution.
-    auto* ai = create<type::AbstractInt>();
-    auto* i32 = create<type::I32>();
+    auto* ai = create<core::type::AbstractInt>();
+    auto* i32 = create<core::type::I32>();
     auto result =
         table->Lookup(CtorConv::kI32, nullptr, Vector{ai}, EvaluationStage::kConstant, Source{});
     ASSERT_TRUE(result) << Diagnostics().str();
diff --git a/src/tint/lang/core/intrinsic_data.cc b/src/tint/lang/core/intrinsic_data.cc
index 7329072..40a1655 100644
--- a/src/tint/lang/core/intrinsic_data.cc
+++ b/src/tint/lang/core/intrinsic_data.cc
@@ -48,7 +48,7 @@
 using TemplateNumberInfo = tint::core::intrinsic::TemplateNumberInfo;
 using TemplateTypeIndex = tint::core::intrinsic::TemplateTypeIndex;
 using TemplateTypeInfo = tint::core::intrinsic::TemplateTypeInfo;
-using Type = tint::type::Type;
+using Type = tint::core::type::Type;
 using TypeMatcher = tint::core::intrinsic::TypeMatcher;
 using TypeMatcherIndex = tint::core::intrinsic::TypeMatcherIndex;
 using TypeMatcherIndicesIndex = tint::core::intrinsic::TypeMatcherIndicesIndex;
diff --git a/src/tint/lang/core/intrinsic_type_matchers.h b/src/tint/lang/core/intrinsic_type_matchers.h
index 97d9904..2175958 100644
--- a/src/tint/lang/core/intrinsic_type_matchers.h
+++ b/src/tint/lang/core/intrinsic_type_matchers.h
@@ -42,75 +42,75 @@
 
 namespace tint::core {
 
-inline bool match_bool(intrinsic::MatchState&, const type::Type* ty) {
-    return ty->IsAnyOf<intrinsic::Any, type::Bool>();
+inline bool match_bool(intrinsic::MatchState&, const core::type::Type* ty) {
+    return ty->IsAnyOf<intrinsic::Any, core::type::Bool>();
 }
 
-inline const type::AbstractFloat* build_fa(intrinsic::MatchState& state) {
+inline const core::type::AbstractFloat* build_fa(intrinsic::MatchState& state) {
     return state.types.AFloat();
 }
 
-inline bool match_fa(intrinsic::MatchState& state, const type::Type* ty) {
+inline bool match_fa(intrinsic::MatchState& state, const core::type::Type* ty) {
     return (state.earliest_eval_stage <= EvaluationStage::kConstant) &&
-           ty->IsAnyOf<intrinsic::Any, type::AbstractNumeric>();
+           ty->IsAnyOf<intrinsic::Any, core::type::AbstractNumeric>();
 }
 
-inline const type::AbstractInt* build_ia(intrinsic::MatchState& state) {
+inline const core::type::AbstractInt* build_ia(intrinsic::MatchState& state) {
     return state.types.AInt();
 }
 
-inline bool match_ia(intrinsic::MatchState& state, const type::Type* ty) {
+inline bool match_ia(intrinsic::MatchState& state, const core::type::Type* ty) {
     return (state.earliest_eval_stage <= EvaluationStage::kConstant) &&
-           ty->IsAnyOf<intrinsic::Any, type::AbstractInt>();
+           ty->IsAnyOf<intrinsic::Any, core::type::AbstractInt>();
 }
 
-inline const type::Bool* build_bool(intrinsic::MatchState& state) {
+inline const core::type::Bool* build_bool(intrinsic::MatchState& state) {
     return state.types.bool_();
 }
 
-inline const type::F16* build_f16(intrinsic::MatchState& state) {
+inline const core::type::F16* build_f16(intrinsic::MatchState& state) {
     return state.types.f16();
 }
 
-inline bool match_f16(intrinsic::MatchState&, const type::Type* ty) {
-    return ty->IsAnyOf<intrinsic::Any, type::F16, type::AbstractNumeric>();
+inline bool match_f16(intrinsic::MatchState&, const core::type::Type* ty) {
+    return ty->IsAnyOf<intrinsic::Any, core::type::F16, core::type::AbstractNumeric>();
 }
 
-inline const type::F32* build_f32(intrinsic::MatchState& state) {
+inline const core::type::F32* build_f32(intrinsic::MatchState& state) {
     return state.types.f32();
 }
 
-inline bool match_f32(intrinsic::MatchState&, const type::Type* ty) {
-    return ty->IsAnyOf<intrinsic::Any, type::F32, type::AbstractNumeric>();
+inline bool match_f32(intrinsic::MatchState&, const core::type::Type* ty) {
+    return ty->IsAnyOf<intrinsic::Any, core::type::F32, core::type::AbstractNumeric>();
 }
 
-inline const type::I32* build_i32(intrinsic::MatchState& state) {
+inline const core::type::I32* build_i32(intrinsic::MatchState& state) {
     return state.types.i32();
 }
 
-inline bool match_i32(intrinsic::MatchState&, const type::Type* ty) {
-    return ty->IsAnyOf<intrinsic::Any, type::I32, type::AbstractInt>();
+inline bool match_i32(intrinsic::MatchState&, const core::type::Type* ty) {
+    return ty->IsAnyOf<intrinsic::Any, core::type::I32, core::type::AbstractInt>();
 }
 
-inline const type::U32* build_u32(intrinsic::MatchState& state) {
+inline const core::type::U32* build_u32(intrinsic::MatchState& state) {
     return state.types.u32();
 }
 
-inline bool match_u32(intrinsic::MatchState&, const type::Type* ty) {
-    return ty->IsAnyOf<intrinsic::Any, type::U32, type::AbstractInt>();
+inline bool match_u32(intrinsic::MatchState&, const core::type::Type* ty) {
+    return ty->IsAnyOf<intrinsic::Any, core::type::U32, core::type::AbstractInt>();
 }
 
 inline bool match_vec(intrinsic::MatchState&,
-                      const type::Type* ty,
+                      const core::type::Type* ty,
                       intrinsic::Number& N,
-                      const type::Type*& T) {
+                      const core::type::Type*& T) {
     if (ty->Is<intrinsic::Any>()) {
         N = intrinsic::Number::any;
         T = ty;
         return true;
     }
 
-    if (auto* v = ty->As<type::Vector>()) {
+    if (auto* v = ty->As<core::type::Vector>()) {
         N = v->Width();
         T = v->type();
         return true;
@@ -119,13 +119,15 @@
 }
 
 template <uint32_t N>
-inline bool match_vec(intrinsic::MatchState&, const type::Type* ty, const type::Type*& T) {
+inline bool match_vec(intrinsic::MatchState&,
+                      const core::type::Type* ty,
+                      const core::type::Type*& T) {
     if (ty->Is<intrinsic::Any>()) {
         T = ty;
         return true;
     }
 
-    if (auto* v = ty->As<type::Vector>()) {
+    if (auto* v = ty->As<core::type::Vector>()) {
         if (v->Width() == N) {
             T = v->type();
             return true;
@@ -134,14 +136,15 @@
     return false;
 }
 
-inline const type::Vector* build_vec(intrinsic::MatchState& state,
-                                     intrinsic::Number N,
-                                     const type::Type* el) {
+inline const core::type::Vector* build_vec(intrinsic::MatchState& state,
+                                           intrinsic::Number N,
+                                           const core::type::Type* el) {
     return state.types.vec(el, N.Value());
 }
 
 template <uint32_t N>
-inline const type::Vector* build_vec(intrinsic::MatchState& state, const type::Type* el) {
+inline const core::type::Vector* build_vec(intrinsic::MatchState& state,
+                                           const core::type::Type* el) {
     return state.types.vec(el, N);
 }
 
@@ -153,13 +156,15 @@
 constexpr auto build_vec3 = build_vec<3>;
 constexpr auto build_vec4 = build_vec<4>;
 
-inline bool match_packedVec3(intrinsic::MatchState&, const type::Type* ty, const type::Type*& T) {
+inline bool match_packedVec3(intrinsic::MatchState&,
+                             const core::type::Type* ty,
+                             const core::type::Type*& T) {
     if (ty->Is<intrinsic::Any>()) {
         T = ty;
         return true;
     }
 
-    if (auto* v = ty->As<type::Vector>()) {
+    if (auto* v = ty->As<core::type::Vector>()) {
         if (v->Packed()) {
             T = v->type();
             return true;
@@ -168,22 +173,23 @@
     return false;
 }
 
-inline const type::Vector* build_packedVec3(intrinsic::MatchState& state, const type::Type* el) {
-    return state.types.Get<type::Vector>(el, 3u, /* packed */ true);
+inline const core::type::Vector* build_packedVec3(intrinsic::MatchState& state,
+                                                  const core::type::Type* el) {
+    return state.types.Get<core::type::Vector>(el, 3u, /* packed */ true);
 }
 
 inline bool match_mat(intrinsic::MatchState&,
-                      const type::Type* ty,
+                      const core::type::Type* ty,
                       intrinsic::Number& M,
                       intrinsic::Number& N,
-                      const type::Type*& T) {
+                      const core::type::Type*& T) {
     if (ty->Is<intrinsic::Any>()) {
         M = intrinsic::Number::any;
         N = intrinsic::Number::any;
         T = ty;
         return true;
     }
-    if (auto* m = ty->As<type::Matrix>()) {
+    if (auto* m = ty->As<core::type::Matrix>()) {
         M = m->columns();
         N = m->ColumnType()->Width();
         T = m->type();
@@ -193,12 +199,14 @@
 }
 
 template <uint32_t C, uint32_t R>
-inline bool match_mat(intrinsic::MatchState&, const type::Type* ty, const type::Type*& T) {
+inline bool match_mat(intrinsic::MatchState&,
+                      const core::type::Type* ty,
+                      const core::type::Type*& T) {
     if (ty->Is<intrinsic::Any>()) {
         T = ty;
         return true;
     }
-    if (auto* m = ty->As<type::Matrix>()) {
+    if (auto* m = ty->As<core::type::Matrix>()) {
         if (m->columns() == C && m->rows() == R) {
             T = m->type();
             return true;
@@ -207,16 +215,17 @@
     return false;
 }
 
-inline const type::Matrix* build_mat(intrinsic::MatchState& state,
-                                     intrinsic::Number C,
-                                     intrinsic::Number R,
-                                     const type::Type* T) {
+inline const core::type::Matrix* build_mat(intrinsic::MatchState& state,
+                                           intrinsic::Number C,
+                                           intrinsic::Number R,
+                                           const core::type::Type* T) {
     auto* column_type = state.types.vec(T, R.Value());
     return state.types.mat(column_type, C.Value());
 }
 
 template <uint32_t C, uint32_t R>
-inline const type::Matrix* build_mat(intrinsic::MatchState& state, const type::Type* T) {
+inline const core::type::Matrix* build_mat(intrinsic::MatchState& state,
+                                           const core::type::Type* T) {
     auto* column_type = state.types.vec(T, R);
     return state.types.mat(column_type, C);
 }
@@ -241,14 +250,16 @@
 constexpr auto match_mat4x3 = match_mat<4, 3>;
 constexpr auto match_mat4x4 = match_mat<4, 4>;
 
-inline bool match_array(intrinsic::MatchState&, const type::Type* ty, const type::Type*& T) {
+inline bool match_array(intrinsic::MatchState&,
+                        const core::type::Type* ty,
+                        const core::type::Type*& T) {
     if (ty->Is<intrinsic::Any>()) {
         T = ty;
         return true;
     }
 
-    if (auto* a = ty->As<type::Array>()) {
-        if (a->Count()->Is<type::RuntimeArrayCount>()) {
+    if (auto* a = ty->As<core::type::Array>()) {
+        if (a->Count()->Is<core::type::RuntimeArrayCount>()) {
             T = a->ElemType();
             return true;
         }
@@ -256,19 +267,21 @@
     return false;
 }
 
-inline const type::Array* build_array(intrinsic::MatchState& state, const type::Type* el) {
-    return state.types.Get<type::Array>(el,
-                                        /* count */ state.types.Get<type::RuntimeArrayCount>(),
-                                        /* align */ 0u,
-                                        /* size */ 0u,
-                                        /* stride */ 0u,
-                                        /* stride_implicit */ 0u);
+inline const core::type::Array* build_array(intrinsic::MatchState& state,
+                                            const core::type::Type* el) {
+    return state.types.Get<core::type::Array>(
+        el,
+        /* count */ state.types.Get<core::type::RuntimeArrayCount>(),
+        /* align */ 0u,
+        /* size */ 0u,
+        /* stride */ 0u,
+        /* stride_implicit */ 0u);
 }
 
 inline bool match_ptr(intrinsic::MatchState&,
-                      const type::Type* ty,
+                      const core::type::Type* ty,
                       intrinsic::Number& S,
-                      const type::Type*& T,
+                      const core::type::Type*& T,
                       intrinsic::Number& A) {
     if (ty->Is<intrinsic::Any>()) {
         S = intrinsic::Number::any;
@@ -277,7 +290,7 @@
         return true;
     }
 
-    if (auto* p = ty->As<type::Pointer>()) {
+    if (auto* p = ty->As<core::type::Pointer>()) {
         S = intrinsic::Number(static_cast<uint32_t>(p->AddressSpace()));
         T = p->StoreType();
         A = intrinsic::Number(static_cast<uint32_t>(p->Access()));
@@ -286,63 +299,69 @@
     return false;
 }
 
-inline const type::Pointer* build_ptr(intrinsic::MatchState& state,
-                                      intrinsic::Number S,
-                                      const type::Type* T,
-                                      intrinsic::Number& A) {
+inline const core::type::Pointer* build_ptr(intrinsic::MatchState& state,
+                                            intrinsic::Number S,
+                                            const core::type::Type* T,
+                                            intrinsic::Number& A) {
     return state.types.ptr(static_cast<core::AddressSpace>(S.Value()), T,
                            static_cast<core::Access>(A.Value()));
 }
 
-inline bool match_atomic(intrinsic::MatchState&, const type::Type* ty, const type::Type*& T) {
+inline bool match_atomic(intrinsic::MatchState&,
+                         const core::type::Type* ty,
+                         const core::type::Type*& T) {
     if (ty->Is<intrinsic::Any>()) {
         T = ty;
         return true;
     }
 
-    if (auto* a = ty->As<type::Atomic>()) {
+    if (auto* a = ty->As<core::type::Atomic>()) {
         T = a->Type();
         return true;
     }
     return false;
 }
 
-inline const type::Atomic* build_atomic(intrinsic::MatchState& state, const type::Type* T) {
+inline const core::type::Atomic* build_atomic(intrinsic::MatchState& state,
+                                              const core::type::Type* T) {
     return state.types.atomic(T);
 }
 
-inline bool match_sampler(intrinsic::MatchState&, const type::Type* ty) {
+inline bool match_sampler(intrinsic::MatchState&, const core::type::Type* ty) {
     if (ty->Is<intrinsic::Any>()) {
         return true;
     }
-    return ty->Is([](const type::Sampler* s) { return s->kind() == type::SamplerKind::kSampler; });
+    return ty->Is([](const core::type::Sampler* s) {
+        return s->kind() == core::type::SamplerKind::kSampler;
+    });
 }
 
-inline const type::Sampler* build_sampler(intrinsic::MatchState& state) {
+inline const core::type::Sampler* build_sampler(intrinsic::MatchState& state) {
     return state.types.sampler();
 }
 
-inline bool match_sampler_comparison(intrinsic::MatchState&, const type::Type* ty) {
+inline bool match_sampler_comparison(intrinsic::MatchState&, const core::type::Type* ty) {
     if (ty->Is<intrinsic::Any>()) {
         return true;
     }
-    return ty->Is(
-        [](const type::Sampler* s) { return s->kind() == type::SamplerKind::kComparisonSampler; });
+    return ty->Is([](const core::type::Sampler* s) {
+        return s->kind() == core::type::SamplerKind::kComparisonSampler;
+    });
 }
 
-inline const type::Sampler* build_sampler_comparison(intrinsic::MatchState& state) {
+inline const core::type::Sampler* build_sampler_comparison(intrinsic::MatchState& state) {
     return state.types.comparison_sampler();
 }
 
 inline bool match_texture(intrinsic::MatchState&,
-                          const type::Type* ty,
-                          type::TextureDimension dim,
-                          const type::Type*& T) {
+                          const core::type::Type* ty,
+                          core::type::TextureDimension dim,
+                          const core::type::Type*& T) {
     if (ty->Is<intrinsic::Any>()) {
         T = ty;
         return true;
     }
-    if (auto* v = ty->As<type::SampledTexture>()) {
+    if (auto* v = ty->As<core::type::SampledTexture>()) {
         if (v->dim() == dim) {
             T = v->type();
             return true;
@@ -353,33 +372,33 @@
 
 #define JOIN(a, b) a##b
 
-#define DECLARE_SAMPLED_TEXTURE(suffix, dim)                                                       \
-    inline bool JOIN(match_texture_, suffix)(intrinsic::MatchState & state, const type::Type* ty,  \
-                                             const type::Type*& T) {                               \
-        return match_texture(state, ty, dim, T);                                                   \
-    }                                                                                              \
-    inline const type::SampledTexture* JOIN(build_texture_, suffix)(intrinsic::MatchState & state, \
-                                                                    const type::Type* T) {         \
-        return state.types.Get<type::SampledTexture>(dim, T);                                      \
+#define DECLARE_SAMPLED_TEXTURE(suffix, dim)                                                     \
+    inline bool JOIN(match_texture_, suffix)(                                                    \
+        intrinsic::MatchState & state, const core::type::Type* ty, const core::type::Type*& T) { \
+        return match_texture(state, ty, dim, T);                                                 \
+    }                                                                                            \
+    inline const core::type::SampledTexture* JOIN(build_texture_, suffix)(                       \
+        intrinsic::MatchState & state, const core::type::Type* T) {                              \
+        return state.types.Get<core::type::SampledTexture>(dim, T);                              \
     }
 
-DECLARE_SAMPLED_TEXTURE(1d, type::TextureDimension::k1d)
-DECLARE_SAMPLED_TEXTURE(2d, type::TextureDimension::k2d)
-DECLARE_SAMPLED_TEXTURE(2d_array, type::TextureDimension::k2dArray)
-DECLARE_SAMPLED_TEXTURE(3d, type::TextureDimension::k3d)
-DECLARE_SAMPLED_TEXTURE(cube, type::TextureDimension::kCube)
-DECLARE_SAMPLED_TEXTURE(cube_array, type::TextureDimension::kCubeArray)
+DECLARE_SAMPLED_TEXTURE(1d, core::type::TextureDimension::k1d)
+DECLARE_SAMPLED_TEXTURE(2d, core::type::TextureDimension::k2d)
+DECLARE_SAMPLED_TEXTURE(2d_array, core::type::TextureDimension::k2dArray)
+DECLARE_SAMPLED_TEXTURE(3d, core::type::TextureDimension::k3d)
+DECLARE_SAMPLED_TEXTURE(cube, core::type::TextureDimension::kCube)
+DECLARE_SAMPLED_TEXTURE(cube_array, core::type::TextureDimension::kCubeArray)
 #undef DECLARE_SAMPLED_TEXTURE
 
 inline bool match_texture_multisampled(intrinsic::MatchState&,
-                                       const type::Type* ty,
-                                       type::TextureDimension dim,
-                                       const type::Type*& T) {
+                                       const core::type::Type* ty,
+                                       core::type::TextureDimension dim,
+                                       const core::type::Type*& T) {
     if (ty->Is<intrinsic::Any>()) {
         T = ty;
         return true;
     }
-    if (auto* v = ty->As<type::MultisampledTexture>()) {
+    if (auto* v = ty->As<core::type::MultisampledTexture>()) {
         if (v->dim() == dim) {
             T = v->type();
             return true;
@@ -388,61 +407,62 @@
     return false;
 }
 
-#define DECLARE_MULTISAMPLED_TEXTURE(suffix, dim)                                      \
-    inline bool JOIN(match_texture_multisampled_, suffix)(                             \
-        intrinsic::MatchState & state, const type::Type* ty, const type::Type*& T) {   \
-        return match_texture_multisampled(state, ty, dim, T);                          \
-    }                                                                                  \
-    inline const type::MultisampledTexture* JOIN(build_texture_multisampled_, suffix)( \
-        intrinsic::MatchState & state, const type::Type* T) {                          \
-        return state.types.Get<type::MultisampledTexture>(dim, T);                     \
+#define DECLARE_MULTISAMPLED_TEXTURE(suffix, dim)                                                \
+    inline bool JOIN(match_texture_multisampled_, suffix)(                                       \
+        intrinsic::MatchState & state, const core::type::Type* ty, const core::type::Type*& T) { \
+        return match_texture_multisampled(state, ty, dim, T);                                    \
+    }                                                                                            \
+    inline const core::type::MultisampledTexture* JOIN(build_texture_multisampled_, suffix)(     \
+        intrinsic::MatchState & state, const core::type::Type* T) {                              \
+        return state.types.Get<core::type::MultisampledTexture>(dim, T);                         \
     }
 
-DECLARE_MULTISAMPLED_TEXTURE(2d, type::TextureDimension::k2d)
+DECLARE_MULTISAMPLED_TEXTURE(2d, core::type::TextureDimension::k2d)
 #undef DECLARE_MULTISAMPLED_TEXTURE
 
 inline bool match_texture_depth(intrinsic::MatchState&,
-                                const type::Type* ty,
-                                type::TextureDimension dim) {
+                                const core::type::Type* ty,
+                                core::type::TextureDimension dim) {
     if (ty->Is<intrinsic::Any>()) {
         return true;
     }
-    return ty->Is([&](const type::DepthTexture* t) { return t->dim() == dim; });
+    return ty->Is([&](const core::type::DepthTexture* t) { return t->dim() == dim; });
 }
 
-#define DECLARE_DEPTH_TEXTURE(suffix, dim)                                         \
-    inline bool JOIN(match_texture_depth_, suffix)(intrinsic::MatchState & state,  \
-                                                   const type::Type* ty) {         \
-        return match_texture_depth(state, ty, dim);                                \
-    }                                                                              \
-    inline const type::DepthTexture* JOIN(build_texture_depth_,                    \
-                                          suffix)(intrinsic::MatchState & state) { \
-        return state.types.Get<type::DepthTexture>(dim);                           \
+#define DECLARE_DEPTH_TEXTURE(suffix, dim)                                               \
+    inline bool JOIN(match_texture_depth_, suffix)(intrinsic::MatchState & state,        \
+                                                   const core::type::Type* ty) {         \
+        return match_texture_depth(state, ty, dim);                                      \
+    }                                                                                    \
+    inline const core::type::DepthTexture* JOIN(build_texture_depth_,                    \
+                                                suffix)(intrinsic::MatchState & state) { \
+        return state.types.Get<core::type::DepthTexture>(dim);                           \
     }
 
-DECLARE_DEPTH_TEXTURE(2d, type::TextureDimension::k2d)
-DECLARE_DEPTH_TEXTURE(2d_array, type::TextureDimension::k2dArray)
-DECLARE_DEPTH_TEXTURE(cube, type::TextureDimension::kCube)
-DECLARE_DEPTH_TEXTURE(cube_array, type::TextureDimension::kCubeArray)
+DECLARE_DEPTH_TEXTURE(2d, core::type::TextureDimension::k2d)
+DECLARE_DEPTH_TEXTURE(2d_array, core::type::TextureDimension::k2dArray)
+DECLARE_DEPTH_TEXTURE(cube, core::type::TextureDimension::kCube)
+DECLARE_DEPTH_TEXTURE(cube_array, core::type::TextureDimension::kCubeArray)
 #undef DECLARE_DEPTH_TEXTURE
 
-inline bool match_texture_depth_multisampled_2d(intrinsic::MatchState&, const type::Type* ty) {
+inline bool match_texture_depth_multisampled_2d(intrinsic::MatchState&,
+                                                const core::type::Type* ty) {
     if (ty->Is<intrinsic::Any>()) {
         return true;
     }
-    return ty->Is([&](const type::DepthMultisampledTexture* t) {
-        return t->dim() == type::TextureDimension::k2d;
+    return ty->Is([&](const core::type::DepthMultisampledTexture* t) {
+        return t->dim() == core::type::TextureDimension::k2d;
     });
 }
 
-inline type::DepthMultisampledTexture* build_texture_depth_multisampled_2d(
+inline core::type::DepthMultisampledTexture* build_texture_depth_multisampled_2d(
     intrinsic::MatchState& state) {
-    return state.types.Get<type::DepthMultisampledTexture>(type::TextureDimension::k2d);
+    return state.types.Get<core::type::DepthMultisampledTexture>(core::type::TextureDimension::k2d);
 }
 
 inline bool match_texture_storage(intrinsic::MatchState&,
-                                  const type::Type* ty,
-                                  type::TextureDimension dim,
+                                  const core::type::Type* ty,
+                                  core::type::TextureDimension dim,
                                   intrinsic::Number& F,
                                   intrinsic::Number& A) {
     if (ty->Is<intrinsic::Any>()) {
@@ -450,7 +470,7 @@
         A = intrinsic::Number::any;
         return true;
     }
-    if (auto* v = ty->As<type::StorageTexture>()) {
+    if (auto* v = ty->As<core::type::StorageTexture>()) {
         if (v->dim() == dim) {
             F = intrinsic::Number(static_cast<uint32_t>(v->texel_format()));
             A = intrinsic::Number(static_cast<uint32_t>(v->access()));
@@ -460,38 +480,40 @@
     return false;
 }
 
-#define DECLARE_STORAGE_TEXTURE(suffix, dim)                                                     \
-    inline bool JOIN(match_texture_storage_, suffix)(intrinsic::MatchState & state,              \
-                                                     const type::Type* ty, intrinsic::Number& F, \
-                                                     intrinsic::Number& A) {                     \
-        return match_texture_storage(state, ty, dim, F, A);                                      \
-    }                                                                                            \
-    inline const type::StorageTexture* JOIN(build_texture_storage_, suffix)(                     \
-        intrinsic::MatchState & state, intrinsic::Number F, intrinsic::Number A) {               \
-        auto format = static_cast<TexelFormat>(F.Value());                                       \
-        auto access = static_cast<Access>(A.Value());                                            \
-        auto* T = type::StorageTexture::SubtypeFor(format, state.types);                         \
-        return state.types.Get<type::StorageTexture>(dim, format, access, T);                    \
+#define DECLARE_STORAGE_TEXTURE(suffix, dim)                                                       \
+    inline bool JOIN(match_texture_storage_, suffix)(intrinsic::MatchState & state,                \
+                                                     const core::type::Type* ty,                   \
+                                                     intrinsic::Number& F, intrinsic::Number& A) { \
+        return match_texture_storage(state, ty, dim, F, A);                                        \
+    }                                                                                              \
+    inline const core::type::StorageTexture* JOIN(build_texture_storage_, suffix)(                 \
+        intrinsic::MatchState & state, intrinsic::Number F, intrinsic::Number A) {                 \
+        auto format = static_cast<TexelFormat>(F.Value());                                         \
+        auto access = static_cast<Access>(A.Value());                                              \
+        auto* T = core::type::StorageTexture::SubtypeFor(format, state.types);                     \
+        return state.types.Get<core::type::StorageTexture>(dim, format, access, T);                \
     }
 
-DECLARE_STORAGE_TEXTURE(1d, type::TextureDimension::k1d)
-DECLARE_STORAGE_TEXTURE(2d, type::TextureDimension::k2d)
-DECLARE_STORAGE_TEXTURE(2d_array, type::TextureDimension::k2dArray)
-DECLARE_STORAGE_TEXTURE(3d, type::TextureDimension::k3d)
+DECLARE_STORAGE_TEXTURE(1d, core::type::TextureDimension::k1d)
+DECLARE_STORAGE_TEXTURE(2d, core::type::TextureDimension::k2d)
+DECLARE_STORAGE_TEXTURE(2d_array, core::type::TextureDimension::k2dArray)
+DECLARE_STORAGE_TEXTURE(3d, core::type::TextureDimension::k3d)
 #undef DECLARE_STORAGE_TEXTURE
 
-inline bool match_texture_external(intrinsic::MatchState&, const type::Type* ty) {
-    return ty->IsAnyOf<intrinsic::Any, type::ExternalTexture>();
+inline bool match_texture_external(intrinsic::MatchState&, const core::type::Type* ty) {
+    return ty->IsAnyOf<intrinsic::Any, core::type::ExternalTexture>();
 }
 
-inline const type::ExternalTexture* build_texture_external(intrinsic::MatchState& state) {
-    return state.types.Get<type::ExternalTexture>();
+inline const core::type::ExternalTexture* build_texture_external(intrinsic::MatchState& state) {
+    return state.types.Get<core::type::ExternalTexture>();
 }
 
 // Builtin types starting with a _ prefix cannot be declared in WGSL, so they
 // can only be used as return types. Because of this, they must only match Any,
 // which is used as the return type matcher.
-inline bool match_modf_result(intrinsic::MatchState&, const type::Type* ty, const type::Type*& T) {
+inline bool match_modf_result(intrinsic::MatchState&,
+                              const core::type::Type* ty,
+                              const core::type::Type*& T) {
     if (!ty->Is<intrinsic::Any>()) {
         return false;
     }
@@ -499,9 +521,9 @@
     return true;
 }
 inline bool match_modf_result_vec(intrinsic::MatchState&,
-                                  const type::Type* ty,
+                                  const core::type::Type* ty,
                                   intrinsic::Number& N,
-                                  const type::Type*& T) {
+                                  const core::type::Type*& T) {
     if (!ty->Is<intrinsic::Any>()) {
         return false;
     }
@@ -509,7 +531,9 @@
     T = ty;
     return true;
 }
-inline bool match_frexp_result(intrinsic::MatchState&, const type::Type* ty, const type::Type*& T) {
+inline bool match_frexp_result(intrinsic::MatchState&,
+                               const core::type::Type* ty,
+                               const core::type::Type*& T) {
     if (!ty->Is<intrinsic::Any>()) {
         return false;
     }
@@ -517,9 +541,9 @@
     return true;
 }
 inline bool match_frexp_result_vec(intrinsic::MatchState&,
-                                   const type::Type* ty,
+                                   const core::type::Type* ty,
                                    intrinsic::Number& N,
-                                   const type::Type*& T) {
+                                   const core::type::Type*& T) {
     if (!ty->Is<intrinsic::Any>()) {
         return false;
     }
@@ -529,8 +553,8 @@
 }
 
 inline bool match_atomic_compare_exchange_result(intrinsic::MatchState&,
-                                                 const type::Type* ty,
-                                                 const type::Type*& T) {
+                                                 const core::type::Type* ty,
+                                                 const core::type::Type*& T) {
     if (ty->Is<intrinsic::Any>()) {
         T = ty;
         return true;
@@ -538,31 +562,33 @@
     return false;
 }
 
-inline const type::Struct* build_modf_result(intrinsic::MatchState& state, const type::Type* el) {
-    return type::CreateModfResult(state.types, state.symbols, el);
+inline const core::type::Struct* build_modf_result(intrinsic::MatchState& state,
+                                                   const core::type::Type* el) {
+    return core::type::CreateModfResult(state.types, state.symbols, el);
 }
 
-inline const type::Struct* build_modf_result_vec(intrinsic::MatchState& state,
-                                                 intrinsic::Number& n,
-                                                 const type::Type* el) {
+inline const core::type::Struct* build_modf_result_vec(intrinsic::MatchState& state,
+                                                       intrinsic::Number& n,
+                                                       const core::type::Type* el) {
     auto* vec = state.types.vec(el, n.Value());
-    return type::CreateModfResult(state.types, state.symbols, vec);
+    return core::type::CreateModfResult(state.types, state.symbols, vec);
 }
 
-inline const type::Struct* build_frexp_result(intrinsic::MatchState& state, const type::Type* el) {
-    return type::CreateFrexpResult(state.types, state.symbols, el);
+inline const core::type::Struct* build_frexp_result(intrinsic::MatchState& state,
+                                                    const core::type::Type* el) {
+    return core::type::CreateFrexpResult(state.types, state.symbols, el);
 }
 
-inline const type::Struct* build_frexp_result_vec(intrinsic::MatchState& state,
-                                                  intrinsic::Number& n,
-                                                  const type::Type* el) {
+inline const core::type::Struct* build_frexp_result_vec(intrinsic::MatchState& state,
+                                                        intrinsic::Number& n,
+                                                        const core::type::Type* el) {
     auto* vec = state.types.vec(el, n.Value());
-    return type::CreateFrexpResult(state.types, state.symbols, vec);
+    return core::type::CreateFrexpResult(state.types, state.symbols, vec);
 }
 
-inline const type::Struct* build_atomic_compare_exchange_result(intrinsic::MatchState& state,
-                                                                const type::Type* ty) {
-    return type::CreateAtomicCompareExchangeResult(state.types, state.symbols, ty);
+inline const core::type::Struct* build_atomic_compare_exchange_result(intrinsic::MatchState& state,
+                                                                      const core::type::Type* ty) {
+    return core::type::CreateAtomicCompareExchangeResult(state.types, state.symbols, ty);
 }
 
 }  // namespace tint::core
diff --git a/src/tint/lang/core/ir/block_param.cc b/src/tint/lang/core/ir/block_param.cc
index 46a4070..4f031c4 100644
--- a/src/tint/lang/core/ir/block_param.cc
+++ b/src/tint/lang/core/ir/block_param.cc
@@ -19,7 +19,7 @@
 
 namespace tint::ir {
 
-BlockParam::BlockParam(const type::Type* ty) : type_(ty) {
+BlockParam::BlockParam(const core::type::Type* ty) : type_(ty) {
     TINT_ASSERT(type_ != nullptr);
 }
 
diff --git a/src/tint/lang/core/ir/block_param.h b/src/tint/lang/core/ir/block_param.h
index e694540..73e7853 100644
--- a/src/tint/lang/core/ir/block_param.h
+++ b/src/tint/lang/core/ir/block_param.h
@@ -25,15 +25,15 @@
   public:
     /// Constructor
     /// @param type the type of the var
-    explicit BlockParam(const type::Type* type);
+    explicit BlockParam(const core::type::Type* type);
     ~BlockParam() override;
 
     /// @returns the type of the var
-    const type::Type* Type() override { return type_; }
+    const core::type::Type* Type() override { return type_; }
 
   private:
     /// the result type of the instruction
-    const type::Type* type_ = nullptr;
+    const core::type::Type* type_ = nullptr;
 };
 
 }  // namespace tint::ir
diff --git a/src/tint/lang/core/ir/builder.cc b/src/tint/lang/core/ir/builder.cc
index 6a4dc8d..0cfc9d1 100644
--- a/src/tint/lang/core/ir/builder.cc
+++ b/src/tint/lang/core/ir/builder.cc
@@ -45,7 +45,7 @@
 }
 
 Function* Builder::Function(std::string_view name,
-                            const type::Type* return_type,
+                            const core::type::Type* return_type,
                             Function::PipelineStage stage,
                             std::optional<std::array<uint32_t, 3>> wg_size) {
     auto* ir_func = ir.values.Create<ir::Function>(return_type, stage, wg_size);
@@ -74,31 +74,31 @@
     return Append(ir.instructions.Create<ir::Discard>());
 }
 
-ir::Var* Builder::Var(const type::Pointer* type) {
+ir::Var* Builder::Var(const core::type::Pointer* type) {
     return Append(ir.instructions.Create<ir::Var>(InstructionResult(type)));
 }
 
-ir::Var* Builder::Var(std::string_view name, const type::Pointer* type) {
+ir::Var* Builder::Var(std::string_view name, const core::type::Pointer* type) {
     auto* var = Var(type);
     ir.SetName(var, name);
     return var;
 }
 
-ir::BlockParam* Builder::BlockParam(const type::Type* type) {
+ir::BlockParam* Builder::BlockParam(const core::type::Type* type) {
     return ir.values.Create<ir::BlockParam>(type);
 }
 
-ir::BlockParam* Builder::BlockParam(std::string_view name, const type::Type* type) {
+ir::BlockParam* Builder::BlockParam(std::string_view name, const core::type::Type* type) {
     auto* param = ir.values.Create<ir::BlockParam>(type);
     ir.SetName(param, name);
     return param;
 }
 
-ir::FunctionParam* Builder::FunctionParam(const type::Type* type) {
+ir::FunctionParam* Builder::FunctionParam(const core::type::Type* type) {
     return ir.values.Create<ir::FunctionParam>(type);
 }
 
-ir::FunctionParam* Builder::FunctionParam(std::string_view name, const type::Type* type) {
+ir::FunctionParam* Builder::FunctionParam(std::string_view name, const core::type::Type* type) {
     auto* param = ir.values.Create<ir::FunctionParam>(type);
     ir.SetName(param, name);
     return param;
@@ -112,11 +112,11 @@
     return Append(ir.instructions.Create<ir::Unreachable>());
 }
 
-const type::Type* Builder::VectorPtrElementType(const type::Type* type) {
-    auto* vec_ptr_ty = type->As<type::Pointer>();
+const core::type::Type* Builder::VectorPtrElementType(const core::type::Type* type) {
+    auto* vec_ptr_ty = type->As<core::type::Pointer>();
     TINT_ASSERT(vec_ptr_ty);
     if (TINT_LIKELY(vec_ptr_ty)) {
-        auto* vec_ty = vec_ptr_ty->StoreType()->As<type::Vector>();
+        auto* vec_ty = vec_ptr_ty->StoreType()->As<core::type::Vector>();
         TINT_ASSERT(vec_ty);
         if (TINT_LIKELY(vec_ty)) {
             return vec_ty->type();
diff --git a/src/tint/lang/core/ir/builder.h b/src/tint/lang/core/ir/builder.h
index 3510eec..b67303e 100644
--- a/src/tint/lang/core/ir/builder.h
+++ b/src/tint/lang/core/ir/builder.h
@@ -173,7 +173,7 @@
     /// @param wg_size the workgroup_size
     /// @returns the instruction
     ir::Function* Function(std::string_view name,
-                           const type::Type* return_type,
+                           const core::type::Type* return_type,
                            Function::PipelineStage stage = Function::PipelineStage::kUndefined,
                            std::optional<std::array<uint32_t, 3>> wg_size = {});
 
@@ -285,7 +285,7 @@
     /// @param size the number of items
     /// @returns the new constant
     template <typename ARG>
-    ir::Constant* Splat(const type::Type* ty, ARG&& value, size_t size) {
+    ir::Constant* Splat(const core::type::Type* ty, ARG&& value, size_t size) {
         return Constant(
             ir.constant_values.Splat(ty, ConstantValue(std::forward<ARG>(value)), size));
     }
@@ -295,7 +295,7 @@
     /// @param values the composite values
     /// @returns the new constant
     template <typename... ARGS, typename = DisableIfVectorLike<ARGS...>>
-    ir::Constant* Composite(const type::Type* ty, ARGS&&... values) {
+    ir::Constant* Composite(const core::type::Type* ty, ARGS&&... values) {
         return Constant(
             ir.constant_values.Composite(ty, Vector{ConstantValue(std::forward<ARGS>(values))...}));
     }
@@ -362,7 +362,7 @@
     /// @param rhs the right-hand-side of the operation
     /// @returns the operation
     template <typename LHS, typename RHS>
-    ir::Binary* Binary(enum Binary::Kind kind, const type::Type* type, LHS&& lhs, RHS&& rhs) {
+    ir::Binary* Binary(enum Binary::Kind kind, const core::type::Type* type, LHS&& lhs, RHS&& rhs) {
         CheckForNonDeterministicEvaluation<LHS, RHS>();
         auto* lhs_val = Value(std::forward<LHS>(lhs));
         auto* rhs_val = Value(std::forward<RHS>(rhs));
@@ -376,7 +376,7 @@
     /// @param rhs the rhs of the add
     /// @returns the operation
     template <typename LHS, typename RHS>
-    ir::Binary* And(const type::Type* type, LHS&& lhs, RHS&& rhs) {
+    ir::Binary* And(const core::type::Type* type, LHS&& lhs, RHS&& rhs) {
         return Binary(ir::Binary::Kind::kAnd, type, std::forward<LHS>(lhs), std::forward<RHS>(rhs));
     }
 
@@ -386,7 +386,7 @@
     /// @param rhs the rhs of the add
     /// @returns the operation
     template <typename LHS, typename RHS>
-    ir::Binary* Or(const type::Type* type, LHS&& lhs, RHS&& rhs) {
+    ir::Binary* Or(const core::type::Type* type, LHS&& lhs, RHS&& rhs) {
         return Binary(ir::Binary::Kind::kOr, type, std::forward<LHS>(lhs), std::forward<RHS>(rhs));
     }
 
@@ -396,7 +396,7 @@
     /// @param rhs the rhs of the add
     /// @returns the operation
     template <typename LHS, typename RHS>
-    ir::Binary* Xor(const type::Type* type, LHS&& lhs, RHS&& rhs) {
+    ir::Binary* Xor(const core::type::Type* type, LHS&& lhs, RHS&& rhs) {
         return Binary(ir::Binary::Kind::kXor, type, std::forward<LHS>(lhs), std::forward<RHS>(rhs));
     }
 
@@ -406,7 +406,7 @@
     /// @param rhs the rhs of the add
     /// @returns the operation
     template <typename LHS, typename RHS>
-    ir::Binary* Equal(const type::Type* type, LHS&& lhs, RHS&& rhs) {
+    ir::Binary* Equal(const core::type::Type* type, LHS&& lhs, RHS&& rhs) {
         return Binary(ir::Binary::Kind::kEqual, type, std::forward<LHS>(lhs),
                       std::forward<RHS>(rhs));
     }
@@ -417,7 +417,7 @@
     /// @param rhs the rhs of the add
     /// @returns the operation
     template <typename LHS, typename RHS>
-    ir::Binary* NotEqual(const type::Type* type, LHS&& lhs, RHS&& rhs) {
+    ir::Binary* NotEqual(const core::type::Type* type, LHS&& lhs, RHS&& rhs) {
         return Binary(ir::Binary::Kind::kNotEqual, type, std::forward<LHS>(lhs),
                       std::forward<RHS>(rhs));
     }
@@ -428,7 +428,7 @@
     /// @param rhs the rhs of the add
     /// @returns the operation
     template <typename LHS, typename RHS>
-    ir::Binary* LessThan(const type::Type* type, LHS&& lhs, RHS&& rhs) {
+    ir::Binary* LessThan(const core::type::Type* type, LHS&& lhs, RHS&& rhs) {
         return Binary(ir::Binary::Kind::kLessThan, type, std::forward<LHS>(lhs),
                       std::forward<RHS>(rhs));
     }
@@ -439,7 +439,7 @@
     /// @param rhs the rhs of the add
     /// @returns the operation
     template <typename LHS, typename RHS>
-    ir::Binary* GreaterThan(const type::Type* type, LHS&& lhs, RHS&& rhs) {
+    ir::Binary* GreaterThan(const core::type::Type* type, LHS&& lhs, RHS&& rhs) {
         return Binary(ir::Binary::Kind::kGreaterThan, type, std::forward<LHS>(lhs),
                       std::forward<RHS>(rhs));
     }
@@ -450,7 +450,7 @@
     /// @param rhs the rhs of the add
     /// @returns the operation
     template <typename LHS, typename RHS>
-    ir::Binary* LessThanEqual(const type::Type* type, LHS&& lhs, RHS&& rhs) {
+    ir::Binary* LessThanEqual(const core::type::Type* type, LHS&& lhs, RHS&& rhs) {
         return Binary(ir::Binary::Kind::kLessThanEqual, type, std::forward<LHS>(lhs),
                       std::forward<RHS>(rhs));
     }
@@ -461,7 +461,7 @@
     /// @param rhs the rhs of the add
     /// @returns the operation
     template <typename LHS, typename RHS>
-    ir::Binary* GreaterThanEqual(const type::Type* type, LHS&& lhs, RHS&& rhs) {
+    ir::Binary* GreaterThanEqual(const core::type::Type* type, LHS&& lhs, RHS&& rhs) {
         return Binary(ir::Binary::Kind::kGreaterThanEqual, type, std::forward<LHS>(lhs),
                       std::forward<RHS>(rhs));
     }
@@ -472,7 +472,7 @@
     /// @param rhs the rhs of the add
     /// @returns the operation
     template <typename LHS, typename RHS>
-    ir::Binary* ShiftLeft(const type::Type* type, LHS&& lhs, RHS&& rhs) {
+    ir::Binary* ShiftLeft(const core::type::Type* type, LHS&& lhs, RHS&& rhs) {
         return Binary(ir::Binary::Kind::kShiftLeft, type, std::forward<LHS>(lhs),
                       std::forward<RHS>(rhs));
     }
@@ -483,7 +483,7 @@
     /// @param rhs the rhs of the add
     /// @returns the operation
     template <typename LHS, typename RHS>
-    ir::Binary* ShiftRight(const type::Type* type, LHS&& lhs, RHS&& rhs) {
+    ir::Binary* ShiftRight(const core::type::Type* type, LHS&& lhs, RHS&& rhs) {
         return Binary(ir::Binary::Kind::kShiftRight, type, std::forward<LHS>(lhs),
                       std::forward<RHS>(rhs));
     }
@@ -494,7 +494,7 @@
     /// @param rhs the rhs of the add
     /// @returns the operation
     template <typename LHS, typename RHS>
-    ir::Binary* Add(const type::Type* type, LHS&& lhs, RHS&& rhs) {
+    ir::Binary* Add(const core::type::Type* type, LHS&& lhs, RHS&& rhs) {
         return Binary(ir::Binary::Kind::kAdd, type, std::forward<LHS>(lhs), std::forward<RHS>(rhs));
     }
 
@@ -504,7 +504,7 @@
     /// @param rhs the rhs of the add
     /// @returns the operation
     template <typename LHS, typename RHS>
-    ir::Binary* Subtract(const type::Type* type, LHS&& lhs, RHS&& rhs) {
+    ir::Binary* Subtract(const core::type::Type* type, LHS&& lhs, RHS&& rhs) {
         return Binary(ir::Binary::Kind::kSubtract, type, std::forward<LHS>(lhs),
                       std::forward<RHS>(rhs));
     }
@@ -515,7 +515,7 @@
     /// @param rhs the rhs of the add
     /// @returns the operation
     template <typename LHS, typename RHS>
-    ir::Binary* Multiply(const type::Type* type, LHS&& lhs, RHS&& rhs) {
+    ir::Binary* Multiply(const core::type::Type* type, LHS&& lhs, RHS&& rhs) {
         return Binary(ir::Binary::Kind::kMultiply, type, std::forward<LHS>(lhs),
                       std::forward<RHS>(rhs));
     }
@@ -526,7 +526,7 @@
     /// @param rhs the rhs of the add
     /// @returns the operation
     template <typename LHS, typename RHS>
-    ir::Binary* Divide(const type::Type* type, LHS&& lhs, RHS&& rhs) {
+    ir::Binary* Divide(const core::type::Type* type, LHS&& lhs, RHS&& rhs) {
         return Binary(ir::Binary::Kind::kDivide, type, std::forward<LHS>(lhs),
                       std::forward<RHS>(rhs));
     }
@@ -537,7 +537,7 @@
     /// @param rhs the rhs of the add
     /// @returns the operation
     template <typename LHS, typename RHS>
-    ir::Binary* Modulo(const type::Type* type, LHS&& lhs, RHS&& rhs) {
+    ir::Binary* Modulo(const core::type::Type* type, LHS&& lhs, RHS&& rhs) {
         return Binary(ir::Binary::Kind::kModulo, type, std::forward<LHS>(lhs),
                       std::forward<RHS>(rhs));
     }
@@ -548,7 +548,7 @@
     /// @param val the value of the operation
     /// @returns the operation
     template <typename VAL>
-    ir::Unary* Unary(enum Unary::Kind kind, const type::Type* type, VAL&& val) {
+    ir::Unary* Unary(enum Unary::Kind kind, const core::type::Type* type, VAL&& val) {
         auto* value = Value(std::forward<VAL>(val));
         return Append(ir.instructions.Create<ir::Unary>(InstructionResult(type), kind, value));
     }
@@ -558,7 +558,7 @@
     /// @param val the value
     /// @returns the operation
     template <typename VAL>
-    ir::Unary* Complement(const type::Type* type, VAL&& val) {
+    ir::Unary* Complement(const core::type::Type* type, VAL&& val) {
         return Unary(ir::Unary::Kind::kComplement, type, std::forward<VAL>(val));
     }
 
@@ -567,7 +567,7 @@
     /// @param val the value
     /// @returns the operation
     template <typename VAL>
-    ir::Unary* Negation(const type::Type* type, VAL&& val) {
+    ir::Unary* Negation(const core::type::Type* type, VAL&& val) {
         return Unary(ir::Unary::Kind::kNegation, type, std::forward<VAL>(val));
     }
 
@@ -576,8 +576,8 @@
     /// @param val the value
     /// @returns the operation
     template <typename VAL>
-    ir::Binary* Not(const type::Type* type, VAL&& val) {
-        if (auto* vec = type->As<type::Vector>()) {
+    ir::Binary* Not(const core::type::Type* type, VAL&& val) {
+        if (auto* vec = type->As<core::type::Vector>()) {
             return Equal(type, std::forward<VAL>(val), Splat(vec, false, vec->Width()));
         } else {
             return Equal(type, std::forward<VAL>(val), Constant(false));
@@ -589,7 +589,7 @@
     /// @param val the value being bitcast
     /// @returns the instruction
     template <typename VAL>
-    ir::Bitcast* Bitcast(const type::Type* type, VAL&& val) {
+    ir::Bitcast* Bitcast(const core::type::Type* type, VAL&& val) {
         auto* value = Value(std::forward<VAL>(val));
         return Append(ir.instructions.Create<ir::Bitcast>(InstructionResult(type), value));
     }
@@ -604,7 +604,7 @@
     /// @param args the call arguments
     /// @returns the instruction
     template <typename... ARGS>
-    ir::UserCall* Call(const type::Type* type, ir::Function* func, ARGS&&... args) {
+    ir::UserCall* Call(const core::type::Type* type, ir::Function* func, ARGS&&... args) {
         return Append(ir.instructions.Create<ir::UserCall>(InstructionResult(type), func,
                                                            Values(std::forward<ARGS>(args)...)));
     }
@@ -615,7 +615,7 @@
     /// @param args the call arguments
     /// @returns the instruction
     template <typename... ARGS>
-    ir::CoreBuiltinCall* Call(const type::Type* type, core::Function func, ARGS&&... args) {
+    ir::CoreBuiltinCall* Call(const core::type::Type* type, core::Function func, ARGS&&... args) {
         return Append(ir.instructions.Create<ir::CoreBuiltinCall>(
             InstructionResult(type), func, Values(std::forward<ARGS>(args)...)));
     }
@@ -626,7 +626,9 @@
     /// @param args the call arguments
     /// @returns the intrinsic call instruction
     template <typename... ARGS>
-    ir::IntrinsicCall* Call(const type::Type* type, enum IntrinsicCall::Kind kind, ARGS&&... args) {
+    ir::IntrinsicCall* Call(const core::type::Type* type,
+                            enum IntrinsicCall::Kind kind,
+                            ARGS&&... args) {
         return Append(ir.instructions.Create<ir::IntrinsicCall>(
             InstructionResult(type), kind, Values(std::forward<ARGS>(args)...)));
     }
@@ -636,7 +638,7 @@
     /// @param val the value to be converted
     /// @returns the instruction
     template <typename VAL>
-    ir::Convert* Convert(const type::Type* to, VAL&& val) {
+    ir::Convert* Convert(const core::type::Type* to, VAL&& val) {
         return Append(ir.instructions.Create<ir::Convert>(InstructionResult(to),
                                                           Value(std::forward<VAL>(val))));
     }
@@ -646,7 +648,7 @@
     /// @param args the arguments to the constructor
     /// @returns the instruction
     template <typename... ARGS>
-    ir::Construct* Construct(const type::Type* type, ARGS&&... args) {
+    ir::Construct* Construct(const core::type::Type* type, ARGS&&... args) {
         return Append(ir.instructions.Create<ir::Construct>(InstructionResult(type),
                                                             Values(std::forward<ARGS>(args)...)));
     }
@@ -703,13 +705,13 @@
     /// Creates a new `var` declaration
     /// @param type the var type
     /// @returns the instruction
-    ir::Var* Var(const type::Pointer* type);
+    ir::Var* Var(const core::type::Pointer* type);
 
     /// Creates a new `var` declaration with a name
     /// @param name the var name
     /// @param type the var type
     /// @returns the instruction
-    ir::Var* Var(std::string_view name, const type::Pointer* type);
+    ir::Var* Var(std::string_view name, const core::type::Pointer* type);
 
     /// Creates a new `let` declaration
     /// @param name the let name
@@ -828,24 +830,24 @@
     /// Creates a new `BlockParam`
     /// @param type the parameter type
     /// @returns the value
-    ir::BlockParam* BlockParam(const type::Type* type);
+    ir::BlockParam* BlockParam(const core::type::Type* type);
 
     /// Creates a new `BlockParam` with a name.
     /// @param name the parameter name
     /// @param type the parameter type
     /// @returns the value
-    ir::BlockParam* BlockParam(std::string_view name, const type::Type* type);
+    ir::BlockParam* BlockParam(std::string_view name, const core::type::Type* type);
 
     /// Creates a new `FunctionParam`
     /// @param type the parameter type
     /// @returns the value
-    ir::FunctionParam* FunctionParam(const type::Type* type);
+    ir::FunctionParam* FunctionParam(const core::type::Type* type);
 
     /// Creates a new `FunctionParam` with a name.
     /// @param name the parameter name
     /// @param type the parameter type
     /// @returns the value
-    ir::FunctionParam* FunctionParam(std::string_view name, const type::Type* type);
+    ir::FunctionParam* FunctionParam(std::string_view name, const core::type::Type* type);
 
     /// Creates a new `Access`
     /// @param type the return type
@@ -853,7 +855,7 @@
     /// @param indices the access indices
     /// @returns the instruction
     template <typename OBJ, typename... ARGS>
-    ir::Access* Access(const type::Type* type, OBJ&& object, ARGS&&... indices) {
+    ir::Access* Access(const core::type::Type* type, OBJ&& object, ARGS&&... indices) {
         CheckForNonDeterministicEvaluation<OBJ, ARGS...>();
         auto* obj_val = Value(std::forward<OBJ>(object));
         return Append(ir.instructions.Create<ir::Access>(InstructionResult(type), obj_val,
@@ -866,7 +868,7 @@
     /// @param indices the swizzle indices
     /// @returns the instruction
     template <typename OBJ>
-    ir::Swizzle* Swizzle(const type::Type* type, OBJ&& object, VectorRef<uint32_t> indices) {
+    ir::Swizzle* Swizzle(const core::type::Type* type, OBJ&& object, VectorRef<uint32_t> indices) {
         auto* obj_val = Value(std::forward<OBJ>(object));
         return Append(ir.instructions.Create<ir::Swizzle>(InstructionResult(type), obj_val,
                                                           std::move(indices)));
@@ -878,7 +880,7 @@
     /// @param indices the swizzle indices
     /// @returns the instruction
     template <typename OBJ>
-    ir::Swizzle* Swizzle(const type::Type* type,
+    ir::Swizzle* Swizzle(const core::type::Type* type,
                          OBJ&& object,
                          std::initializer_list<uint32_t> indices) {
         auto* obj_val = Value(std::forward<OBJ>(object));
@@ -901,7 +903,7 @@
     /// Creates a new runtime value
     /// @param type the return type
     /// @returns the value
-    ir::InstructionResult* InstructionResult(const type::Type* type) {
+    ir::InstructionResult* InstructionResult(const core::type::Type* type) {
         return ir.values.Create<ir::InstructionResult>(type);
     }
 
@@ -912,7 +914,7 @@
     /// @param step the loop index step amount
     /// @param cb the callback to call for the loop body
     template <typename START, typename END, typename STEP, typename FUNCTION>
-    void LoopRange(type::Manager& ty, START&& start, END&& end, STEP&& step, FUNCTION&& cb) {
+    void LoopRange(core::type::Manager& ty, START&& start, END&& end, STEP&& step, FUNCTION&& cb) {
         auto* start_value = Value(std::forward<START>(start));
         auto* end_value = Value(std::forward<END>(end));
         auto* step_value = Value(std::forward<STEP>(step));
@@ -948,7 +950,7 @@
   private:
     /// @returns the element type of the vector-pointer type
     /// Asserts and return i32 if @p type is not a pointer to a vector
-    const type::Type* VectorPtrElementType(const type::Type* type);
+    const core::type::Type* VectorPtrElementType(const core::type::Type* type);
 };
 
 }  // namespace tint::ir
diff --git a/src/tint/lang/core/ir/constant.h b/src/tint/lang/core/ir/constant.h
index 3dde430..6a75e91 100644
--- a/src/tint/lang/core/ir/constant.h
+++ b/src/tint/lang/core/ir/constant.h
@@ -32,7 +32,7 @@
     const core::constant::Value* Value() { return value_; }
 
     /// @returns the type of the constant
-    const type::Type* Type() override { return value_->Type(); }
+    const core::type::Type* Type() override { return value_->Type(); }
 
   private:
     const core::constant::Value* const value_ = nullptr;
diff --git a/src/tint/lang/core/ir/disassembler.cc b/src/tint/lang/core/ir/disassembler.cc
index c5a339d..71bd370 100644
--- a/src/tint/lang/core/ir/disassembler.cc
+++ b/src/tint/lang/core/ir/disassembler.cc
@@ -145,7 +145,7 @@
 
 std::string Disassembler::Disassemble() {
     for (auto* ty : mod_.Types()) {
-        if (auto* str = ty->As<type::Struct>()) {
+        if (auto* str = ty->As<core::type::Struct>()) {
             EmitStructDecl(str);
         }
     }
@@ -894,9 +894,9 @@
     sm.Store(u);
 }
 
-void Disassembler::EmitStructDecl(const type::Struct* str) {
+void Disassembler::EmitStructDecl(const core::type::Struct* str) {
     out_ << str->Name().Name() << " = struct @align(" << str->Align() << ")";
-    if (str->StructFlags().Contains(type::StructFlag::kBlock)) {
+    if (str->StructFlags().Contains(core::type::StructFlag::kBlock)) {
         out_ << ", @block";
     }
     out_ << " {";
diff --git a/src/tint/lang/core/ir/disassembler.h b/src/tint/lang/core/ir/disassembler.h
index 27c8518..39ca61d 100644
--- a/src/tint/lang/core/ir/disassembler.h
+++ b/src/tint/lang/core/ir/disassembler.h
@@ -30,7 +30,7 @@
 #include "src/tint/utils/text/string_stream.h"
 
 // Forward declarations.
-namespace tint::type {
+namespace tint::core::type {
 class Struct;
 }
 
@@ -140,7 +140,7 @@
     void EmitSwitch(Switch* s);
     void EmitLoop(Loop* l);
     void EmitIf(If* i);
-    void EmitStructDecl(const type::Struct* str);
+    void EmitStructDecl(const core::type::Struct* str);
     void EmitLine();
     void EmitOperand(Instruction* inst, size_t index);
     void EmitOperandList(Instruction* inst, size_t start_index = 0);
diff --git a/src/tint/lang/core/ir/function.cc b/src/tint/lang/core/ir/function.cc
index dbee758..b5bf71b 100644
--- a/src/tint/lang/core/ir/function.cc
+++ b/src/tint/lang/core/ir/function.cc
@@ -21,7 +21,7 @@
 
 namespace tint::ir {
 
-Function::Function(const type::Type* rt,
+Function::Function(const core::type::Type* rt,
                    PipelineStage stage,
                    std::optional<std::array<uint32_t, 3>> wg_size)
     : pipeline_stage_(stage), workgroup_size_(wg_size) {
diff --git a/src/tint/lang/core/ir/function.h b/src/tint/lang/core/ir/function.h
index 624e763..135abea 100644
--- a/src/tint/lang/core/ir/function.h
+++ b/src/tint/lang/core/ir/function.h
@@ -62,7 +62,7 @@
     /// @param rt the function return type
     /// @param stage the function stage
     /// @param wg_size the workgroup_size
-    Function(const type::Type* rt,
+    Function(const core::type::Type* rt,
              PipelineStage stage = PipelineStage::kUndefined,
              std::optional<std::array<uint32_t, 3>> wg_size = {});
     ~Function() override;
@@ -87,7 +87,7 @@
     std::optional<std::array<uint32_t, 3>> WorkgroupSize() { return workgroup_size_; }
 
     /// @returns the return type for the function
-    const type::Type* ReturnType() { return return_.type; }
+    const core::type::Type* ReturnType() { return return_.type; }
 
     /// Sets the return attributes
     /// @param builtin the builtin to set
@@ -142,7 +142,7 @@
     std::optional<std::array<uint32_t, 3>> workgroup_size_;
 
     struct {
-        const type::Type* type = nullptr;
+        const core::type::Type* type = nullptr;
         std::optional<enum ReturnBuiltin> builtin;
         std::optional<Location> location;
         bool invariant = false;
diff --git a/src/tint/lang/core/ir/function_param.cc b/src/tint/lang/core/ir/function_param.cc
index 5d9dbbe..a016342 100644
--- a/src/tint/lang/core/ir/function_param.cc
+++ b/src/tint/lang/core/ir/function_param.cc
@@ -20,7 +20,7 @@
 
 namespace tint::ir {
 
-FunctionParam::FunctionParam(const type::Type* ty) : type_(ty) {
+FunctionParam::FunctionParam(const core::type::Type* ty) : type_(ty) {
     TINT_ASSERT(ty != nullptr);
 }
 
diff --git a/src/tint/lang/core/ir/function_param.h b/src/tint/lang/core/ir/function_param.h
index 8a4e589..0484dca 100644
--- a/src/tint/lang/core/ir/function_param.h
+++ b/src/tint/lang/core/ir/function_param.h
@@ -57,11 +57,11 @@
 
     /// Constructor
     /// @param type the type of the var
-    explicit FunctionParam(const type::Type* type);
+    explicit FunctionParam(const core::type::Type* type);
     ~FunctionParam() override;
 
     /// @returns the type of the var
-    const type::Type* Type() override { return type_; }
+    const core::type::Type* Type() override { return type_; }
 
     /// Sets the builtin information. Note, it is currently an error if the builtin is already set.
     /// @param val the builtin to set
@@ -99,7 +99,7 @@
     std::optional<struct BindingPoint>& BindingPoint() { return binding_point_; }
 
   private:
-    const type::Type* type_ = nullptr;
+    const core::type::Type* type_ = nullptr;
     std::optional<enum FunctionParam::Builtin> builtin_;
     std::optional<struct Location> location_;
     std::optional<struct BindingPoint> binding_point_;
diff --git a/src/tint/lang/core/ir/instruction_result.cc b/src/tint/lang/core/ir/instruction_result.cc
index 300eca3..531f716 100644
--- a/src/tint/lang/core/ir/instruction_result.cc
+++ b/src/tint/lang/core/ir/instruction_result.cc
@@ -22,7 +22,7 @@
 
 namespace tint::ir {
 
-InstructionResult::InstructionResult(const type::Type* type) : type_(type) {
+InstructionResult::InstructionResult(const core::type::Type* type) : type_(type) {
     TINT_ASSERT(type_ != nullptr);
 }
 
diff --git a/src/tint/lang/core/ir/instruction_result.h b/src/tint/lang/core/ir/instruction_result.h
index f2bdd9c..1b7d21a 100644
--- a/src/tint/lang/core/ir/instruction_result.h
+++ b/src/tint/lang/core/ir/instruction_result.h
@@ -25,7 +25,7 @@
   public:
     /// Constructor
     /// @param type the type of the value
-    explicit InstructionResult(const type::Type* type);
+    explicit InstructionResult(const core::type::Type* type);
 
     /// Destructor
     ~InstructionResult() override;
@@ -34,11 +34,11 @@
     void Destroy() override;
 
     /// @returns the type of the value
-    const type::Type* Type() override { return type_; }
+    const core::type::Type* Type() override { return type_; }
 
     /// Sets the type of the value to @p type
     /// @param type the new type of the value
-    void SetType(const type::Type* type) { type_ = type; }
+    void SetType(const core::type::Type* type) { type_ = type; }
 
     /// Sets the source instruction for this value
     /// @param inst the instruction to set
@@ -49,7 +49,7 @@
 
   private:
     Instruction* source_ = nullptr;
-    const type::Type* type_ = nullptr;
+    const core::type::Type* type_ = nullptr;
 };
 
 }  // namespace tint::ir
diff --git a/src/tint/lang/core/ir/ir_helper_test.h b/src/tint/lang/core/ir/ir_helper_test.h
index bb62518..bdb2b6c 100644
--- a/src/tint/lang/core/ir/ir_helper_test.h
+++ b/src/tint/lang/core/ir/ir_helper_test.h
@@ -33,7 +33,7 @@
     /// The IR builder
     Builder b{mod};
     /// The type manager
-    type::Manager& ty{mod.Types()};
+    core::type::Manager& ty{mod.Types()};
 };
 
 using IRTestHelper = IRTestHelperBase<testing::Test>;
diff --git a/src/tint/lang/core/ir/load.cc b/src/tint/lang/core/ir/load.cc
index 3ed33f1..b4cbd78 100644
--- a/src/tint/lang/core/ir/load.cc
+++ b/src/tint/lang/core/ir/load.cc
@@ -24,7 +24,7 @@
 Load::Load(InstructionResult* result, Value* from) {
     flags_.Add(Flag::kSequenced);
 
-    TINT_ASSERT(from->Type()->Is<type::Pointer>());
+    TINT_ASSERT(from->Type()->Is<core::type::Pointer>());
     TINT_ASSERT(from && from->Type()->UnwrapPtr() == result->Type());
 
     AddOperand(Load::kFromOperandOffset, from);
diff --git a/src/tint/lang/core/ir/module.h b/src/tint/lang/core/ir/module.h
index 8466f24..f5b638d 100644
--- a/src/tint/lang/core/ir/module.h
+++ b/src/tint/lang/core/ir/module.h
@@ -79,7 +79,7 @@
     void SetName(Value* value, Symbol name);
 
     /// @return the type manager for the module
-    type::Manager& Types() { return constant_values.types; }
+    core::type::Manager& Types() { return constant_values.types; }
 
     /// The block allocator
     BlockAllocator<Block> blocks;
diff --git a/src/tint/lang/core/ir/transform/bgra8unorm_polyfill.cc b/src/tint/lang/core/ir/transform/bgra8unorm_polyfill.cc
index 2652c80..96c6ed5 100644
--- a/src/tint/lang/core/ir/transform/bgra8unorm_polyfill.cc
+++ b/src/tint/lang/core/ir/transform/bgra8unorm_polyfill.cc
@@ -38,7 +38,7 @@
     Builder b{*ir};
 
     /// The type manager.
-    type::Manager& ty{ir->Types()};
+    core::type::Manager& ty{ir->Types()};
 
     /// Process the module.
     void Process() {
@@ -50,11 +50,11 @@
                 if (!var) {
                     continue;
                 }
-                auto* ptr = var->Result()->Type()->As<type::Pointer>();
+                auto* ptr = var->Result()->Type()->As<core::type::Pointer>();
                 if (!ptr) {
                     continue;
                 }
-                auto* storage_texture = ptr->StoreType()->As<type::StorageTexture>();
+                auto* storage_texture = ptr->StoreType()->As<core::type::StorageTexture>();
                 if (storage_texture &&
                     storage_texture->texel_format() == core::TexelFormat::kBgra8Unorm) {
                     ReplaceVar(var, storage_texture);
@@ -70,7 +70,7 @@
         for (auto* func : ir->functions) {
             for (uint32_t index = 0; index < func->Params().Length(); index++) {
                 auto* param = func->Params()[index];
-                auto* storage_texture = param->Type()->As<type::StorageTexture>();
+                auto* storage_texture = param->Type()->As<core::type::StorageTexture>();
                 if (storage_texture &&
                     storage_texture->texel_format() == core::TexelFormat::kBgra8Unorm) {
                     ReplaceParameter(func, param, index, storage_texture);
@@ -82,10 +82,10 @@
     /// Replace a variable declaration with one that uses rgba8unorm instead of bgra8unorm.
     /// @param old_var the variable declaration to replace
     /// @param bgra8 the bgra8unorm texture type
-    void ReplaceVar(Var* old_var, const type::StorageTexture* bgra8) {
+    void ReplaceVar(Var* old_var, const core::type::StorageTexture* bgra8) {
         // Redeclare the variable with a rgba8unorm texel format.
-        auto* rgba8 = ty.Get<type::StorageTexture>(bgra8->dim(), core::TexelFormat::kRgba8Unorm,
-                                                   bgra8->access(), bgra8->type());
+        auto* rgba8 = ty.Get<core::type::StorageTexture>(
+            bgra8->dim(), core::TexelFormat::kRgba8Unorm, bgra8->access(), bgra8->type());
         auto* new_var = b.Var(ty.ptr(handle, rgba8));
         auto bp = old_var->BindingPoint();
         new_var->SetBindingPoint(bp->group, bp->binding);
@@ -106,10 +106,10 @@
     void ReplaceParameter(Function* func,
                           FunctionParam* old_param,
                           uint32_t index,
-                          const type::StorageTexture* bgra8) {
+                          const core::type::StorageTexture* bgra8) {
         // Redeclare the parameter with a rgba8unorm texel format.
-        auto* rgba8 = ty.Get<type::StorageTexture>(bgra8->dim(), core::TexelFormat::kRgba8Unorm,
-                                                   bgra8->access(), bgra8->type());
+        auto* rgba8 = ty.Get<core::type::StorageTexture>(
+            bgra8->dim(), core::TexelFormat::kRgba8Unorm, bgra8->access(), bgra8->type());
         auto* new_param = b.FunctionParam(rgba8);
         if (auto name = ir->NameOf(old_param)) {
             ir->SetName(new_param, name.NameView());
@@ -142,8 +142,8 @@
                     call->SetOperand(use.operand_index, new_value);
                     if (call->Func() == core::Function::kTextureStore) {
                         // Swizzle the value argument of a `textureStore()` builtin.
-                        auto* tex = old_value->Type()->As<type::StorageTexture>();
-                        auto index = type::IsTextureArray(tex->dim()) ? 3u : 2u;
+                        auto* tex = old_value->Type()->As<core::type::StorageTexture>();
+                        auto index = core::type::IsTextureArray(tex->dim()) ? 3u : 2u;
                         auto* value = call->Args()[index];
                         auto* swizzle = b.Swizzle(value->Type(), value, Vector{2u, 1u, 0u, 3u});
                         swizzle->InsertBefore(call);
diff --git a/src/tint/lang/core/ir/transform/bgra8unorm_polyfill_test.cc b/src/tint/lang/core/ir/transform/bgra8unorm_polyfill_test.cc
index 2c229f4..4cf15d0 100644
--- a/src/tint/lang/core/ir/transform/bgra8unorm_polyfill_test.cc
+++ b/src/tint/lang/core/ir/transform/bgra8unorm_polyfill_test.cc
@@ -46,8 +46,9 @@
 
 TEST_F(IR_Bgra8UnormPolyfillTest, NoModify_ModuleScopeVariable_Rgba) {
     auto format = core::TexelFormat::kRgba8Unorm;
-    auto* texture_ty = ty.Get<type::StorageTexture>(type::TextureDimension::k2d, format, write,
-                                                    type::StorageTexture::SubtypeFor(format, ty));
+    auto* texture_ty =
+        ty.Get<core::type::StorageTexture>(core::type::TextureDimension::k2d, format, write,
+                                           core::type::StorageTexture::SubtypeFor(format, ty));
 
     auto* var = b.Var("texture", ty.ptr(handle, texture_ty));
     var->SetBindingPoint(1, 2);
@@ -86,8 +87,9 @@
 
 TEST_F(IR_Bgra8UnormPolyfillTest, NoModify_UserFunctionParameter_Rgba) {
     auto format = core::TexelFormat::kRgba8Unorm;
-    auto* texture_ty = ty.Get<type::StorageTexture>(type::TextureDimension::k2d, format, write,
-                                                    type::StorageTexture::SubtypeFor(format, ty));
+    auto* texture_ty =
+        ty.Get<core::type::StorageTexture>(core::type::TextureDimension::k2d, format, write,
+                                           core::type::StorageTexture::SubtypeFor(format, ty));
 
     auto* func = b.Function("foo", ty.void_());
     auto* texture = b.FunctionParam("texture", texture_ty);
@@ -117,8 +119,9 @@
 
 TEST_F(IR_Bgra8UnormPolyfillTest, ModuleScopeVariable) {
     auto format = core::TexelFormat::kBgra8Unorm;
-    auto* texture_ty = ty.Get<type::StorageTexture>(type::TextureDimension::k2d, format, write,
-                                                    type::StorageTexture::SubtypeFor(format, ty));
+    auto* texture_ty =
+        ty.Get<core::type::StorageTexture>(core::type::TextureDimension::k2d, format, write,
+                                           core::type::StorageTexture::SubtypeFor(format, ty));
 
     auto* var = b.Var("texture", ty.ptr(handle, texture_ty));
     var->SetBindingPoint(1, 2);
@@ -170,8 +173,9 @@
 
 TEST_F(IR_Bgra8UnormPolyfillTest, UserFunctionParameter) {
     auto format = core::TexelFormat::kBgra8Unorm;
-    auto* texture_ty = ty.Get<type::StorageTexture>(type::TextureDimension::k2d, format, write,
-                                                    type::StorageTexture::SubtypeFor(format, ty));
+    auto* texture_ty =
+        ty.Get<core::type::StorageTexture>(core::type::TextureDimension::k2d, format, write,
+                                           core::type::StorageTexture::SubtypeFor(format, ty));
 
     auto* func = b.Function("foo", ty.void_());
     auto* texture = b.FunctionParam("texture", texture_ty);
@@ -209,8 +213,9 @@
 
 TEST_F(IR_Bgra8UnormPolyfillTest, ModuleScopePassedToUserFunction) {
     auto format = core::TexelFormat::kBgra8Unorm;
-    auto* texture_ty = ty.Get<type::StorageTexture>(type::TextureDimension::k2d, format, write,
-                                                    type::StorageTexture::SubtypeFor(format, ty));
+    auto* texture_ty =
+        ty.Get<core::type::StorageTexture>(core::type::TextureDimension::k2d, format, write,
+                                           core::type::StorageTexture::SubtypeFor(format, ty));
 
     auto* var = b.Var("texture", ty.ptr(handle, texture_ty));
     var->SetBindingPoint(1, 2);
@@ -288,8 +293,9 @@
 
 TEST_F(IR_Bgra8UnormPolyfillTest, ModuleScopePassedToUserFunction_MultipleTextures) {
     auto format = core::TexelFormat::kBgra8Unorm;
-    auto* texture_ty = ty.Get<type::StorageTexture>(type::TextureDimension::k2d, format, write,
-                                                    type::StorageTexture::SubtypeFor(format, ty));
+    auto* texture_ty =
+        ty.Get<core::type::StorageTexture>(core::type::TextureDimension::k2d, format, write,
+                                           core::type::StorageTexture::SubtypeFor(format, ty));
 
     auto* var_a = b.Var("texture_a", ty.ptr(handle, texture_ty));
     auto* var_b = b.Var("texture_b", ty.ptr(handle, texture_ty));
@@ -393,8 +399,9 @@
 
 TEST_F(IR_Bgra8UnormPolyfillTest, MutipleUsesOfOneTexture) {
     auto format = core::TexelFormat::kBgra8Unorm;
-    auto* texture_ty = ty.Get<type::StorageTexture>(type::TextureDimension::k2d, format, write,
-                                                    type::StorageTexture::SubtypeFor(format, ty));
+    auto* texture_ty =
+        ty.Get<core::type::StorageTexture>(core::type::TextureDimension::k2d, format, write,
+                                           core::type::StorageTexture::SubtypeFor(format, ty));
 
     auto* var_a = b.Var("texture", ty.ptr(handle, texture_ty));
     var_a->SetBindingPoint(1, 2);
@@ -493,8 +500,9 @@
 
 TEST_F(IR_Bgra8UnormPolyfillTest, ArrayedImage) {
     auto format = core::TexelFormat::kBgra8Unorm;
-    auto* texture_ty = ty.Get<type::StorageTexture>(type::TextureDimension::k2dArray, format, write,
-                                                    type::StorageTexture::SubtypeFor(format, ty));
+    auto* texture_ty =
+        ty.Get<core::type::StorageTexture>(core::type::TextureDimension::k2dArray, format, write,
+                                           core::type::StorageTexture::SubtypeFor(format, ty));
 
     auto* var = b.Var("texture", ty.ptr(handle, texture_ty));
     var->SetBindingPoint(1, 2);
@@ -547,8 +555,9 @@
 
 TEST_F(IR_Bgra8UnormPolyfillTest, TextureDimensions) {
     auto format = core::TexelFormat::kBgra8Unorm;
-    auto* texture_ty = ty.Get<type::StorageTexture>(type::TextureDimension::k2d, format, write,
-                                                    type::StorageTexture::SubtypeFor(format, ty));
+    auto* texture_ty =
+        ty.Get<core::type::StorageTexture>(core::type::TextureDimension::k2d, format, write,
+                                           core::type::StorageTexture::SubtypeFor(format, ty));
 
     auto* var = b.Var("texture", ty.ptr(handle, texture_ty));
     var->SetBindingPoint(1, 2);
diff --git a/src/tint/lang/core/ir/transform/block_decorated_structs.cc b/src/tint/lang/core/ir/transform/block_decorated_structs.cc
index 72a232a..befbbde 100644
--- a/src/tint/lang/core/ir/transform/block_decorated_structs.cc
+++ b/src/tint/lang/core/ir/transform/block_decorated_structs.cc
@@ -42,7 +42,7 @@
         if (!var) {
             continue;
         }
-        auto* ptr = var->Result()->Type()->As<type::Pointer>();
+        auto* ptr = var->Result()->Type()->As<core::type::Pointer>();
         if (!ptr || !core::IsHostShareable(ptr->AddressSpace())) {
             continue;
         }
@@ -51,14 +51,14 @@
 
     // Now process the buffer variables.
     for (auto* var : buffer_variables) {
-        auto* ptr = var->Result()->Type()->As<type::Pointer>();
+        auto* ptr = var->Result()->Type()->As<core::type::Pointer>();
         auto* store_ty = ptr->StoreType();
 
         bool wrapped = false;
-        Vector<const type::StructMember*, 4> members;
+        Vector<const core::type::StructMember*, 4> members;
 
         // Build the member list for the block-decorated structure.
-        if (auto* str = store_ty->As<type::Struct>(); str && !str->HasFixedFootprint()) {
+        if (auto* str = store_ty->As<core::type::Struct>(); str && !str->HasFixedFootprint()) {
             // We know the original struct will only ever be used as the store type of a buffer, so
             // just redeclare it as a block-decorated struct.
             for (auto* member : str->Members()) {
@@ -67,25 +67,25 @@
         } else {
             // The original struct might be used in other places, so create a new block-decorated
             // struct that wraps the original struct.
-            members.Push(ir->Types().Get<type::StructMember>(
+            members.Push(ir->Types().Get<core::type::StructMember>(
                 /* name */ ir->symbols.New(),
                 /* type */ store_ty,
                 /* index */ 0u,
                 /* offset */ 0u,
                 /* align */ store_ty->Align(),
                 /* size */ store_ty->Size(),
-                /* attributes */ type::StructMemberAttributes{}));
+                /* attributes */ core::type::StructMemberAttributes{}));
             wrapped = true;
         }
 
         // Create the block-decorated struct.
-        auto* block_struct = ir->Types().Get<type::Struct>(
+        auto* block_struct = ir->Types().Get<core::type::Struct>(
             /* name */ ir->symbols.New(),
             /* members */ members,
             /* align */ store_ty->Align(),
             /* size */ tint::RoundUp(store_ty->Align(), store_ty->Size()),
             /* size_no_padding */ store_ty->Size());
-        block_struct->SetStructFlag(type::StructFlag::kBlock);
+        block_struct->SetStructFlag(core::type::StructFlag::kBlock);
 
         // Replace the old variable declaration with one that uses the block-decorated struct type.
         auto* new_var =
diff --git a/src/tint/lang/core/ir/transform/builtin_polyfill.cc b/src/tint/lang/core/ir/transform/builtin_polyfill.cc
index f20cf06..57e94e6 100644
--- a/src/tint/lang/core/ir/transform/builtin_polyfill.cc
+++ b/src/tint/lang/core/ir/transform/builtin_polyfill.cc
@@ -40,7 +40,7 @@
     Builder b{*ir};
 
     /// The type manager.
-    type::Manager& ty{ir->Types()};
+    core::type::Manager& ty{ir->Types()};
 
     /// The symbol table.
     SymbolTable& sym{ir->symbols};
@@ -82,9 +82,10 @@
                         break;
                     case core::Function::kTextureSampleBaseClampToEdge:
                         if (config.texture_sample_base_clamp_to_edge_2d_f32) {
-                            auto* tex = builtin->Args()[0]->Type()->As<type::SampledTexture>();
-                            if (tex && tex->dim() == type::TextureDimension::k2d &&
-                                tex->type()->Is<type::F32>()) {
+                            auto* tex =
+                                builtin->Args()[0]->Type()->As<core::type::SampledTexture>();
+                            if (tex && tex->dim() == core::type::TextureDimension::k2d &&
+                                tex->type()->Is<core::type::F32>()) {
                                 worklist.Push(builtin);
                             }
                         }
@@ -136,8 +137,9 @@
     /// @param el_ty the type to extend
     /// @param match the type to match the component count of
     /// @returns a type with the same number of vector components as @p match
-    const type::Type* MatchWidth(const type::Type* el_ty, const type::Type* match) {
-        if (auto* vec = match->As<type::Vector>()) {
+    const core::type::Type* MatchWidth(const core::type::Type* el_ty,
+                                       const core::type::Type* match) {
+        if (auto* vec = match->As<core::type::Vector>()) {
             return ty.vec(el_ty, vec->Width());
         }
         return el_ty;
@@ -148,8 +150,8 @@
     /// @param element the value to extend
     /// @param match the type to match the component count of
     /// @returns a value with the same number of vector components as @p match
-    ir::Constant* MatchWidth(ir::Constant* element, const type::Type* match) {
-        if (auto* vec = match->As<type::Vector>()) {
+    ir::Constant* MatchWidth(ir::Constant* element, const core::type::Type* match) {
+        if (auto* vec = match->As<core::type::Vector>()) {
             return b.Splat(MatchWidth(element->Type(), match), element, vec->Width());
         }
         return element;
@@ -412,10 +414,10 @@
         auto* type = call->Result()->Type();
         ir::Constant* zero = nullptr;
         ir::Constant* one = nullptr;
-        if (type->DeepestElement()->Is<type::F32>()) {
+        if (type->DeepestElement()->Is<core::type::F32>()) {
             zero = MatchWidth(b.Constant(0_f), type);
             one = MatchWidth(b.Constant(1_f), type);
-        } else if (type->DeepestElement()->Is<type::F16>()) {
+        } else if (type->DeepestElement()->Is<core::type::F16>()) {
             zero = MatchWidth(b.Constant(0_h), type);
             one = MatchWidth(b.Constant(1_h), type);
         }
diff --git a/src/tint/lang/core/ir/transform/builtin_polyfill_test.cc b/src/tint/lang/core/ir/transform/builtin_polyfill_test.cc
index eb23968..3c57235 100644
--- a/src/tint/lang/core/ir/transform/builtin_polyfill_test.cc
+++ b/src/tint/lang/core/ir/transform/builtin_polyfill_test.cc
@@ -32,8 +32,8 @@
     /// @param result_ty the result type of the builtin call
     /// @param arg_types the arguments types for the builtin call
     void Build(core::Function builtin,
-               const type::Type* result_ty,
-               VectorRef<const type::Type*> arg_types) {
+               const core::type::Type* result_ty,
+               VectorRef<const core::type::Type*> arg_types) {
         Vector<FunctionParam*, 4> args;
         for (auto* arg_ty : arg_types) {
             args.Push(b.FunctionParam("arg", arg_ty));
@@ -1059,7 +1059,8 @@
 }
 
 TEST_F(IR_BuiltinPolyfillTest, TextureSampleBaseClampToEdge_2d_f32_NoPolyfill) {
-    auto* texture_ty = ty.Get<type::SampledTexture>(type::TextureDimension::k2d, ty.f32());
+    auto* texture_ty =
+        ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2d, ty.f32());
     Build(core::Function::kTextureSampleBaseClampToEdge, ty.vec4<f32>(),
           Vector{texture_ty, ty.sampler(), ty.vec2<f32>()});
     auto* src = R"(
@@ -1081,7 +1082,8 @@
 }
 
 TEST_F(IR_BuiltinPolyfillTest, TextureSampleBaseClampToEdge_2d_f32) {
-    auto* texture_ty = ty.Get<type::SampledTexture>(type::TextureDimension::k2d, ty.f32());
+    auto* texture_ty =
+        ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2d, ty.f32());
     Build(core::Function::kTextureSampleBaseClampToEdge, ty.vec4<f32>(),
           Vector{texture_ty, ty.sampler(), ty.vec2<f32>()});
     auto* src = R"(
diff --git a/src/tint/lang/core/ir/transform/demote_to_helper.cc b/src/tint/lang/core/ir/transform/demote_to_helper.cc
index e60b3a6..d07ee4a 100644
--- a/src/tint/lang/core/ir/transform/demote_to_helper.cc
+++ b/src/tint/lang/core/ir/transform/demote_to_helper.cc
@@ -37,7 +37,7 @@
     Builder b{*ir};
 
     /// The type manager.
-    type::Manager& ty{ir->Types()};
+    core::type::Manager& ty{ir->Types()};
 
     /// The global "has not discarded" flag.
     Var* continue_execution = nullptr;
@@ -139,7 +139,7 @@
             auto* result = ifelse->True()->Append(inst);
 
             TINT_ASSERT(!inst->HasMultiResults());
-            if (inst->HasResults() && !inst->Result()->Type()->Is<type::Void>()) {
+            if (inst->HasResults() && !inst->Result()->Type()->Is<core::type::Void>()) {
                 // The original instruction had a result, so return it from the if instruction.
                 ifelse->SetResults(Vector{b.InstructionResult(inst->Result()->Type())});
                 inst->Result()->ReplaceAllUsesWith(ifelse->Result());
@@ -169,7 +169,7 @@
                 },
                 [&](Store* store) {
                     // Conditionalize stores to host-visible address spaces.
-                    auto* ptr = store->To()->Type()->As<type::Pointer>();
+                    auto* ptr = store->To()->Type()->As<core::type::Pointer>();
                     if (ptr && ptr->AddressSpace() == core::AddressSpace::kStorage) {
                         conditionalize(store);
                     }
diff --git a/src/tint/lang/core/ir/transform/demote_to_helper_test.cc b/src/tint/lang/core/ir/transform/demote_to_helper_test.cc
index 4b56bd7..721a983 100644
--- a/src/tint/lang/core/ir/transform/demote_to_helper_test.cc
+++ b/src/tint/lang/core/ir/transform/demote_to_helper_test.cc
@@ -517,9 +517,9 @@
     auto format = core::TexelFormat::kR32Float;
     auto* texture =
         b.Var("texture", ty.ptr(core::AddressSpace::kHandle,
-                                ty.Get<type::StorageTexture>(
-                                    type::TextureDimension::k2d, format, core::Access::kWrite,
-                                    type::StorageTexture::SubtypeFor(format, ty))));
+                                ty.Get<core::type::StorageTexture>(
+                                    core::type::TextureDimension::k2d, format, core::Access::kWrite,
+                                    core::type::StorageTexture::SubtypeFor(format, ty))));
     texture->SetBindingPoint(0, 0);
     b.RootBlock()->Append(texture);
 
@@ -777,8 +777,9 @@
             b.Discard();
             b.ExitIf(ifelse);
         });
-        auto* result = b.Call(type::CreateAtomicCompareExchangeResult(ty, mod.symbols, ty.i32()),
-                              core::Function::kAtomicCompareExchangeWeak, buffer, 0_i, 42_i);
+        auto* result =
+            b.Call(core::type::CreateAtomicCompareExchangeResult(ty, mod.symbols, ty.i32()),
+                   core::Function::kAtomicCompareExchangeWeak, buffer, 0_i, 42_i);
         b.Add(ty.i32(), b.Access(ty.i32(), result, 0_i), 1_i);
         b.Return(ep, 0.5_f);
     });
diff --git a/src/tint/lang/core/ir/transform/helper_test.h b/src/tint/lang/core/ir/transform/helper_test.h
index 32d2919..10552c5 100644
--- a/src/tint/lang/core/ir/transform/helper_test.h
+++ b/src/tint/lang/core/ir/transform/helper_test.h
@@ -60,7 +60,7 @@
     /// The test IR builder.
     ir::Builder b{mod};
     /// The type manager.
-    type::Manager& ty{mod.Types()};
+    core::type::Manager& ty{mod.Types()};
 };
 
 using TransformTest = TransformTestBase<testing::Test>;
diff --git a/src/tint/lang/core/ir/transform/shader_io.cc b/src/tint/lang/core/ir/transform/shader_io.cc
index 51e8e615..1858a39 100644
--- a/src/tint/lang/core/ir/transform/shader_io.cc
+++ b/src/tint/lang/core/ir/transform/shader_io.cc
@@ -75,9 +75,9 @@
     /// The IR builder.
     Builder b{*ir};
     /// The type manager.
-    type::Manager& ty{ir->Types()};
+    core::type::Manager& ty{ir->Types()};
     /// The set of struct members that need to have their IO attributes stripped.
-    Hashset<const type::StructMember*, 8> members_to_strip;
+    Hashset<const core::type::StructMember*, 8> members_to_strip;
 
     /// The entry point currently being processed.
     Function* func = nullptr;
@@ -132,7 +132,7 @@
     /// Gather the shader inputs.
     void GatherInputs() {
         for (auto* param : func->Params()) {
-            if (auto* str = param->Type()->As<type::Struct>()) {
+            if (auto* str = param->Type()->As<core::type::Struct>()) {
                 for (auto* member : str->Members()) {
                     auto name = str->Name().Name() + "_" + member->Name().Name();
                     backend->AddInput(ir->symbols.Register(name), member->Type(),
@@ -141,7 +141,7 @@
                 }
             } else {
                 // Pull out the IO attributes and remove them from the parameter.
-                type::StructMemberAttributes attributes;
+                core::type::StructMemberAttributes attributes;
                 if (auto loc = param->Location()) {
                     attributes.location = loc->value;
                     if (loc->interpolation) {
@@ -163,11 +163,11 @@
 
     /// Gather the shader outputs.
     void GatherOutput() {
-        if (func->ReturnType()->Is<type::Void>()) {
+        if (func->ReturnType()->Is<core::type::Void>()) {
             return;
         }
 
-        if (auto* str = func->ReturnType()->As<type::Struct>()) {
+        if (auto* str = func->ReturnType()->As<core::type::Struct>()) {
             for (auto* member : str->Members()) {
                 auto name = str->Name().Name() + "_" + member->Name().Name();
                 backend->AddOutput(ir->symbols.Register(name), member->Type(),
@@ -176,7 +176,7 @@
             }
         } else {
             // Pull out the IO attributes and remove them from the original function.
-            type::StructMemberAttributes attributes;
+            core::type::StructMemberAttributes attributes;
             if (auto loc = func->ReturnLocation()) {
                 attributes.location = loc->value;
                 func->ClearReturnLocation();
@@ -198,7 +198,7 @@
         uint32_t input_idx = 0;
         Vector<Value*, 4> args;
         for (auto* param : func->Params()) {
-            if (auto* str = param->Type()->As<type::Struct>()) {
+            if (auto* str = param->Type()->As<core::type::Struct>()) {
                 Vector<Value*, 4> construct_args;
                 for (uint32_t i = 0; i < str->Members().Length(); i++) {
                     construct_args.Push(backend->GetInput(builder, input_idx++));
@@ -216,13 +216,13 @@
     /// @param builder the IR builder for new instructions
     /// @param inner_result the return value from calling the original entry point function
     void SetOutputs(Builder& builder, Value* inner_result) {
-        if (auto* str = inner_result->Type()->As<type::Struct>()) {
+        if (auto* str = inner_result->Type()->As<core::type::Struct>()) {
             for (auto* member : str->Members()) {
                 Value* from =
                     builder.Access(member->Type(), inner_result, u32(member->Index()))->Result();
                 backend->SetOutput(builder, member->Index(), from);
             }
-        } else if (!inner_result->Type()->Is<type::Void>()) {
+        } else if (!inner_result->Type()->Is<core::type::Void>()) {
             backend->SetOutput(builder, 0u, inner_result);
         }
     }
@@ -232,7 +232,7 @@
         // Remove IO attributes from all structure members that had them prior to this transform.
         for (auto* member : members_to_strip) {
             // TODO(crbug.com/tint/745): Remove the const_cast.
-            const_cast<type::StructMember*>(member)->SetAttributes({});
+            const_cast<core::type::StructMember*>(member)->SetAttributes({});
         }
     }
 };
@@ -248,7 +248,7 @@
         }
 
         // Skip entry points with no inputs or outputs.
-        if (func->Params().IsEmpty() && func->ReturnType()->Is<type::Void>()) {
+        if (func->Params().IsEmpty() && func->ReturnType()->Is<core::type::Void>()) {
             continue;
         }
 
diff --git a/src/tint/lang/core/ir/transform/shader_io.h b/src/tint/lang/core/ir/transform/shader_io.h
index e5b865f..23c20b5 100644
--- a/src/tint/lang/core/ir/transform/shader_io.h
+++ b/src/tint/lang/core/ir/transform/shader_io.h
@@ -38,8 +38,8 @@
     /// @param type the type of the input
     /// @param attributes the IO attributes
     virtual void AddInput(Symbol name,
-                          const type::Type* type,
-                          type::StructMemberAttributes attributes) {
+                          const core::type::Type* type,
+                          core::type::StructMemberAttributes attributes) {
         inputs.Push({name, type, std::move(attributes)});
     }
 
@@ -48,8 +48,8 @@
     /// @param type the type of the output
     /// @param attributes the IO attributes
     virtual void AddOutput(Symbol name,
-                           const type::Type* type,
-                           type::StructMemberAttributes attributes) {
+                           const core::type::Type* type,
+                           core::type::StructMemberAttributes attributes) {
         outputs.Push({name, type, std::move(attributes)});
     }
 
@@ -81,16 +81,16 @@
     Builder b{*ir};
 
     /// The type manager.
-    type::Manager& ty{ir->Types()};
+    core::type::Manager& ty{ir->Types()};
 
     /// The original entry point function.
     Function* func = nullptr;
 
     /// The list of shader inputs.
-    Vector<type::Manager::StructMemberDesc, 4> inputs;
+    Vector<core::type::Manager::StructMemberDesc, 4> inputs;
 
     /// The list of shader outputs.
-    Vector<type::Manager::StructMemberDesc, 4> outputs;
+    Vector<core::type::Manager::StructMemberDesc, 4> outputs;
 };
 
 /// The signature for a function that creates a backend state object.
diff --git a/src/tint/lang/core/ir/transform/std140.cc b/src/tint/lang/core/ir/transform/std140.cc
index 47c1562..3a1430b 100644
--- a/src/tint/lang/core/ir/transform/std140.cc
+++ b/src/tint/lang/core/ir/transform/std140.cc
@@ -39,19 +39,19 @@
     Builder b{*ir};
 
     /// The type manager.
-    type::Manager& ty{ir->Types()};
+    core::type::Manager& ty{ir->Types()};
 
     /// The symbol table.
     SymbolTable& sym{ir->symbols};
 
     /// Map from original type to a new type with decomposed matrices.
-    Hashmap<const type::Type*, const type::Type*, 4> rewritten_types{};
+    Hashmap<const core::type::Type*, const core::type::Type*, 4> rewritten_types{};
 
     /// Map from struct member to its new index.
-    Hashmap<const type::StructMember*, uint32_t, 4> member_index_map{};
+    Hashmap<const core::type::StructMember*, uint32_t, 4> member_index_map{};
 
     /// Map from a type to a helper function that will convert its rewritten form back to it.
-    Hashmap<const type::Struct*, Function*, 4> convert_helpers{};
+    Hashmap<const core::type::Struct*, Function*, 4> convert_helpers{};
 
     /// Process the module.
     void Process() {
@@ -66,7 +66,7 @@
             if (!var || !var->Alive()) {
                 continue;
             }
-            auto* ptr = var->Result()->Type()->As<type::Pointer>();
+            auto* ptr = var->Result()->Type()->As<core::type::Pointer>();
             if (!ptr || ptr->AddressSpace() != core::AddressSpace::kUniform) {
                 continue;
             }
@@ -80,7 +80,7 @@
         for (auto* var : buffer_variables) {
             // Create a new variable with the modified store type.
             const auto& bp = var->BindingPoint();
-            auto* store_type = var->Result()->Type()->As<type::Pointer>()->StoreType();
+            auto* store_type = var->Result()->Type()->As<core::type::Pointer>()->StoreType();
             auto* new_var = b.Var(ty.ptr(uniform, RewriteType(store_type)));
             new_var->SetBindingPoint(bp->group, bp->binding);
             if (auto name = ir->NameOf(var)) {
@@ -99,25 +99,25 @@
 
     /// @param mat the matrix type to check
     /// @returns true if @p mat needs to be decomposed
-    static bool NeedsDecomposing(const type::Matrix* mat) { return mat->ColumnStride() & 15; }
+    static bool NeedsDecomposing(const core::type::Matrix* mat) { return mat->ColumnStride() & 15; }
 
     /// Rewrite a type if necessary, decomposing contained matrices.
     /// @param type the type to rewrite
     /// @returns the new type
-    const type::Type* RewriteType(const type::Type* type) {
-        return rewritten_types.GetOrCreate(type, [&]() -> const type::Type* {
+    const core::type::Type* RewriteType(const core::type::Type* type) {
+        return rewritten_types.GetOrCreate(type, [&]() -> const core::type::Type* {
             return tint::Switch(
                 type,
-                [&](const type::Array* arr) -> const type::Type* {
+                [&](const core::type::Array* arr) -> const core::type::Type* {
                     // Create a new array with element type potentially rewritten.
                     return ty.array(RewriteType(arr->ElemType()), arr->ConstantCount().value());
                 },
-                [&](const type::Struct* str) -> const type::Type* {
+                [&](const core::type::Struct* str) -> const core::type::Type* {
                     bool needs_rewrite = false;
                     uint32_t member_index = 0;
-                    Vector<const type::StructMember*, 4> new_members;
+                    Vector<const core::type::StructMember*, 4> new_members;
                     for (auto* member : str->Members()) {
-                        auto* mat = member->Type()->As<type::Matrix>();
+                        auto* mat = member->Type()->As<core::type::Matrix>();
                         if (mat && NeedsDecomposing(mat)) {
                             // Decompose these matrices into a separate member for each column.
                             member_index_map.Add(member, member_index);
@@ -126,9 +126,9 @@
                             for (uint32_t i = 0; i < mat->columns(); i++) {
                                 StringStream ss;
                                 ss << member->Name().Name() << "_col" << std::to_string(i);
-                                new_members.Push(ty.Get<type::StructMember>(
+                                new_members.Push(ty.Get<core::type::StructMember>(
                                     sym.New(ss.str()), col, member_index, offset, col->Align(),
-                                    col->Size(), type::StructMemberAttributes{}));
+                                    col->Size(), core::type::StructMemberAttributes{}));
                                 offset += col->Align();
                                 member_index++;
                             }
@@ -136,9 +136,10 @@
                         } else {
                             // For all other types, recursively rewrite them as necessary.
                             auto* new_member_ty = RewriteType(member->Type());
-                            new_members.Push(ty.Get<type::StructMember>(
+                            new_members.Push(ty.Get<core::type::StructMember>(
                                 member->Name(), new_member_ty, member_index, member->Offset(),
-                                member->Align(), member->Size(), type::StructMemberAttributes{}));
+                                member->Align(), member->Size(),
+                                core::type::StructMemberAttributes{}));
                             member_index_map.Add(member, member_index);
                             member_index++;
                             if (new_member_ty != member->Type()) {
@@ -153,9 +154,9 @@
                     }
 
                     // Create a new struct with the rewritten members.
-                    auto* new_str = ty.Get<type::Struct>(sym.New(str->Name().Name() + "_std140"),
-                                                         std::move(new_members), str->Align(),
-                                                         str->Size(), str->SizeNoPadding());
+                    auto* new_str = ty.Get<core::type::Struct>(
+                        sym.New(str->Name().Name() + "_std140"), std::move(new_members),
+                        str->Align(), str->Size(), str->SizeNoPadding());
                     for (auto flag : str->StructFlags()) {
                         new_str->SetStructFlag(flag);
                     }
@@ -173,7 +174,7 @@
     /// @param root the root value being accessed into
     /// @param indices the access indices that get to the first column of the decomposed matrix
     /// @returns the loaded matrix
-    Value* LoadMatrix(const type::Matrix* mat, Value* root, Vector<Value*, 4> indices) {
+    Value* LoadMatrix(const core::type::Matrix* mat, Value* root, Vector<Value*, 4> indices) {
         // Load each column vector from the struct and reconstruct the original matrix type.
         Vector<Value*, 4> args;
         auto first_column = indices.Back()->As<Constant>()->Value()->ValueAs<uint32_t>();
@@ -189,17 +190,17 @@
     /// @param source the value to convert
     /// @param orig_ty the original type to convert type
     /// @returns the converted value
-    Value* Convert(Value* source, const type::Type* orig_ty) {
+    Value* Convert(Value* source, const core::type::Type* orig_ty) {
         if (source->Type() == orig_ty) {
             // The type was not rewritten, so just return the source value.
             return source;
         }
         return tint::Switch(
             orig_ty,  //
-            [&](const type::Struct* str) -> Value* {
+            [&](const core::type::Struct* str) -> Value* {
                 // Create a helper function that converts the struct to the original type.
                 auto* helper = convert_helpers.GetOrCreate(str, [&] {
-                    auto* input_str = source->Type()->As<type::Struct>();
+                    auto* input_str = source->Type()->As<core::type::Struct>();
                     auto* func = b.Function("convert_" + str->FriendlyName(), str);
                     auto* input = b.FunctionParam("input", input_str);
                     func->SetParams({input});
@@ -207,7 +208,7 @@
                         uint32_t index = 0;
                         Vector<Value*, 4> args;
                         for (auto* member : str->Members()) {
-                            if (auto* mat = member->Type()->As<type::Matrix>();
+                            if (auto* mat = member->Type()->As<core::type::Matrix>();
                                 mat && NeedsDecomposing(mat)) {
                                 // Extract each decomposed column and reconstruct the matrix.
                                 Vector<Value*, 4> columns;
@@ -235,7 +236,7 @@
                 // Call the helper function to convert the struct.
                 return b.Call(str, helper, source)->Result();
             },
-            [&](const type::Array* arr) -> Value* {
+            [&](const core::type::Array* arr) -> Value* {
                 // Create a loop that copies and converts each element of the array.
                 auto* el_ty = source->Type()->Elements().type;
                 auto* new_arr = b.Var(ty.ptr(function, arr));
@@ -262,7 +263,7 @@
                     auto* current_type = access->Object()->Type()->UnwrapPtr();
                     Vector<Value*, 4> indices;
                     for (auto idx : access->Indices()) {
-                        if (auto* str = current_type->As<type::Struct>()) {
+                        if (auto* str = current_type->As<core::type::Struct>()) {
                             uint32_t old_index = idx->As<Constant>()->Value()->ValueAs<uint32_t>();
                             uint32_t new_index = *member_index_map.Get(str->Members()[old_index]);
                             indices.Push(b.Constant(u32(new_index)));
@@ -275,7 +276,7 @@
                         // If we've hit a matrix that was decomposed, load the whole matrix.
                         // Any additional accesses will extract columns instead of producing
                         // pointers.
-                        if (auto* mat = current_type->As<type::Matrix>();
+                        if (auto* mat = current_type->As<core::type::Matrix>();
                             mat && NeedsDecomposing(mat)) {
                             replacement = LoadMatrix(mat, replacement, std::move(indices));
                             indices.Clear();
@@ -284,7 +285,7 @@
 
                     if (!indices.IsEmpty()) {
                         // Emit the access with the modified indices.
-                        if (replacement->Type()->Is<type::Pointer>()) {
+                        if (replacement->Type()->Is<core::type::Pointer>()) {
                             current_type = ty.ptr(uniform, RewriteType(current_type));
                         }
                         auto* new_access = b.Access(current_type, replacement, std::move(indices));
@@ -297,7 +298,7 @@
                     access->Destroy();
                 },
                 [&](Load* load) {
-                    if (!replacement->Type()->Is<type::Pointer>()) {
+                    if (!replacement->Type()->Is<core::type::Pointer>()) {
                         // We have already loaded to a value type, so this load just folds away.
                         load->Result()->ReplaceAllUsesWith(replacement);
                     } else {
@@ -311,7 +312,7 @@
                 [&](LoadVectorElement* load) {
                     // We should have loaded the decomposed matrix, reconstructed it, so this is now
                     // extracting from a value type.
-                    TINT_ASSERT(!replacement->Type()->Is<type::Pointer>());
+                    TINT_ASSERT(!replacement->Type()->Is<core::type::Pointer>());
                     auto* access = b.Access(load->Result()->Type(), replacement, load->Index());
                     load->Result()->ReplaceAllUsesWith(access->Result());
                     load->Destroy();
diff --git a/src/tint/lang/core/ir/transform/std140_test.cc b/src/tint/lang/core/ir/transform/std140_test.cc
index 58cc286..c5510f1 100644
--- a/src/tint/lang/core/ir/transform/std140_test.cc
+++ b/src/tint/lang/core/ir/transform/std140_test.cc
@@ -52,7 +52,7 @@
     auto* structure = ty.Struct(mod.symbols.New("MyStruct"), {
                                                                  {mod.symbols.New("a"), mat},
                                                              });
-    structure->SetStructFlag(type::kBlock);
+    structure->SetStructFlag(core::type::kBlock);
 
     auto* buffer = b.Var("buffer", ty.ptr(uniform, structure));
     buffer->SetBindingPoint(0, 0);
@@ -96,7 +96,7 @@
     auto* structure = ty.Struct(mod.symbols.New("MyStruct"), {
                                                                  {mod.symbols.New("a"), mat},
                                                              });
-    structure->SetStructFlag(type::kBlock);
+    structure->SetStructFlag(core::type::kBlock);
 
     auto* buffer = b.Var("buffer", ty.ptr(uniform, structure));
     buffer->SetBindingPoint(0, 0);
@@ -140,7 +140,7 @@
     auto* structure = ty.Struct(mod.symbols.New("MyStruct"), {
                                                                  {mod.symbols.New("a"), mat},
                                                              });
-    structure->SetStructFlag(type::kBlock);
+    structure->SetStructFlag(core::type::kBlock);
 
     auto* buffer = b.Var("buffer", ty.ptr(storage, structure));
     buffer->SetBindingPoint(0, 0);
@@ -186,7 +186,7 @@
         ty.Struct(mod.symbols.New("MyStruct"), {
                                                    {mod.symbols.New("arr"), ty.array(mat, 4u)},
                                                });
-    structure->SetStructFlag(type::kBlock);
+    structure->SetStructFlag(core::type::kBlock);
 
     auto* buffer = b.Var("buffer", ty.ptr(uniform, structure));
     buffer->SetBindingPoint(0, 0);
@@ -229,7 +229,7 @@
     auto* structure = ty.Struct(mod.symbols.New("MyStruct"), {
                                                                  {mod.symbols.New("a"), mat},
                                                              });
-    structure->SetStructFlag(type::kBlock);
+    structure->SetStructFlag(core::type::kBlock);
 
     auto* buffer = b.Var("buffer", ty.ptr(uniform, structure));
     buffer->SetBindingPoint(0, 0);
@@ -300,7 +300,7 @@
     auto* structure = ty.Struct(mod.symbols.New("MyStruct"), {
                                                                  {mod.symbols.New("a"), mat},
                                                              });
-    structure->SetStructFlag(type::kBlock);
+    structure->SetStructFlag(core::type::kBlock);
 
     auto* buffer = b.Var("buffer", ty.ptr(uniform, structure));
     buffer->SetBindingPoint(0, 0);
@@ -372,7 +372,7 @@
     auto* structure = ty.Struct(mod.symbols.New("MyStruct"), {
                                                                  {mod.symbols.New("a"), mat},
                                                              });
-    structure->SetStructFlag(type::kBlock);
+    structure->SetStructFlag(core::type::kBlock);
 
     auto* buffer = b.Var("buffer", ty.ptr(uniform, structure));
     buffer->SetBindingPoint(0, 0);
@@ -445,7 +445,7 @@
     auto* structure = ty.Struct(mod.symbols.New("MyStruct"), {
                                                                  {mod.symbols.New("a"), mat},
                                                              });
-    structure->SetStructFlag(type::kBlock);
+    structure->SetStructFlag(core::type::kBlock);
 
     auto* buffer = b.Var("buffer", ty.ptr(uniform, structure));
     buffer->SetBindingPoint(0, 0);
@@ -523,7 +523,7 @@
         ty.Struct(mod.symbols.New("Outer"), {
                                                 {mod.symbols.New("arr"), ty.array(inner, 4u)},
                                             });
-    outer->SetStructFlag(type::kBlock);
+    outer->SetStructFlag(core::type::kBlock);
 
     auto* buffer = b.Var("buffer", ty.ptr(uniform, outer));
     buffer->SetBindingPoint(0, 0);
@@ -643,7 +643,7 @@
     auto* outer = ty.Struct(mod.symbols.New("Outer"), {
                                                           {mod.symbols.New("inner"), inner},
                                                       });
-    outer->SetStructFlag(type::kBlock);
+    outer->SetStructFlag(core::type::kBlock);
 
     auto* buffer = b.Var("buffer", ty.ptr(uniform, outer));
     buffer->SetBindingPoint(0, 0);
@@ -734,7 +734,7 @@
                                                           {mod.symbols.New("m"), ty.mat3x2<f32>()},
                                                           {mod.symbols.New("inner"), inner},
                                                       });
-    outer->SetStructFlag(type::kBlock);
+    outer->SetStructFlag(core::type::kBlock);
 
     auto* buffer = b.Var("buffer", ty.ptr(uniform, outer));
     buffer->SetBindingPoint(0, 0);
@@ -828,7 +828,7 @@
                                                           {mod.symbols.New("arr"), arr},
                                                           {mod.symbols.New("d"), ty.i32()},
                                                       });
-    outer->SetStructFlag(type::kBlock);
+    outer->SetStructFlag(core::type::kBlock);
 
     auto* buffer = b.Var("buffer", ty.ptr(uniform, outer));
     buffer->SetBindingPoint(0, 0);
@@ -998,7 +998,7 @@
                                                           {mod.symbols.New("arr"), arr},
                                                           {mod.symbols.New("d"), ty.i32()},
                                                       });
-    outer->SetStructFlag(type::kBlock);
+    outer->SetStructFlag(core::type::kBlock);
 
     auto* buffer = b.Var("buffer", ty.ptr(uniform, outer));
     buffer->SetBindingPoint(0, 0);
@@ -1173,7 +1173,7 @@
                                                           {mod.symbols.New("arr"), arr},
                                                           {mod.symbols.New("d"), ty.i32()},
                                                       });
-    outer->SetStructFlag(type::kBlock);
+    outer->SetStructFlag(core::type::kBlock);
 
     auto* buffer = b.Var("buffer", ty.ptr(uniform, outer));
     buffer->SetBindingPoint(0, 0);
@@ -1336,18 +1336,18 @@
 
 TEST_F(IR_Std140Test, NonDefaultAlignAndSize) {
     auto* mat = ty.mat4x2<f32>();
-    auto* structure = ty.Get<type::Struct>(
+    auto* structure = ty.Get<core::type::Struct>(
         mod.symbols.New("MyStruct"),
         Vector{
-            ty.Get<type::StructMember>(mod.symbols.New("a"), ty.i32(), 0u, 0u, 0u, 16u,
-                                       type::StructMemberAttributes{}),
-            ty.Get<type::StructMember>(mod.symbols.New("m"), mat, 1u, 64u, 32u, 64u,
-                                       type::StructMemberAttributes{}),
-            ty.Get<type::StructMember>(mod.symbols.New("b"), ty.i32(), 2u, 128u, 8u, 32u,
-                                       type::StructMemberAttributes{}),
+            ty.Get<core::type::StructMember>(mod.symbols.New("a"), ty.i32(), 0u, 0u, 0u, 16u,
+                                             core::type::StructMemberAttributes{}),
+            ty.Get<core::type::StructMember>(mod.symbols.New("m"), mat, 1u, 64u, 32u, 64u,
+                                             core::type::StructMemberAttributes{}),
+            ty.Get<core::type::StructMember>(mod.symbols.New("b"), ty.i32(), 2u, 128u, 8u, 32u,
+                                             core::type::StructMemberAttributes{}),
         },
         128u, 256u, 160u);
-    structure->SetStructFlag(type::kBlock);
+    structure->SetStructFlag(core::type::kBlock);
 
     auto* buffer = b.Var("buffer", ty.ptr(uniform, structure));
     buffer->SetBindingPoint(0, 0);
@@ -1448,7 +1448,7 @@
                                                    {mod.symbols.New("c"), ty.mat4x3<f16>()},
                                                    {mod.symbols.New("d"), ty.mat4x4<f16>()},
                                                });
-    structure->SetStructFlag(type::kBlock);
+    structure->SetStructFlag(core::type::kBlock);
 
     auto* buffer = b.Var("buffer", ty.ptr(uniform, structure));
     buffer->SetBindingPoint(0, 0);
diff --git a/src/tint/lang/core/ir/validator.cc b/src/tint/lang/core/ir/validator.cc
index ca5eb5a..d9f17fa 100644
--- a/src/tint/lang/core/ir/validator.cc
+++ b/src/tint/lang/core/ir/validator.cc
@@ -321,7 +321,7 @@
 }
 
 void Validator::CheckAccess(ir::Access* a) {
-    bool is_ptr = a->Object()->Type()->Is<type::Pointer>();
+    bool is_ptr = a->Object()->Type()->Is<core::type::Pointer>();
     auto* ty = a->Object()->Type()->UnwrapPtr();
 
     auto current = [&] { return is_ptr ? "ptr<" + ty->FriendlyName() + ">" : ty->FriendlyName(); };
@@ -338,7 +338,7 @@
             return;
         }
 
-        if (is_ptr && ty->Is<type::Vector>()) {
+        if (is_ptr && ty->Is<core::type::Vector>()) {
             err("cannot obtain address of vector element");
             return;
         }
@@ -379,7 +379,7 @@
     }
 
     auto* want_ty = a->Result()->Type()->UnwrapPtr();
-    bool want_ptr = a->Result()->Type()->Is<type::Pointer>();
+    bool want_ptr = a->Result()->Type()->Is<core::type::Pointer>();
     if (TINT_UNLIKELY(ty != want_ty || is_ptr != want_ptr)) {
         std::string want =
             want_ptr ? "ptr<" + want_ty->FriendlyName() + ">" : want_ty->FriendlyName();
@@ -406,7 +406,7 @@
 void Validator::CheckIf(If* if_) {
     CheckOperandNotNull(if_, if_->Condition(), If::kConditionOperandOffset);
 
-    if (if_->Condition() && !if_->Condition()->Type()->Is<type::Bool>()) {
+    if (if_->Condition() && !if_->Condition()->Type()->Is<core::type::Bool>()) {
         AddError(if_, If::kConditionOperandOffset,
                  InstError(if_, "condition must be a `bool` type"));
     }
@@ -512,7 +512,7 @@
         AddError(ret, InstError(ret, "undefined function"));
         return;
     }
-    if (func->ReturnType()->Is<type::Void>()) {
+    if (func->ReturnType()->Is<core::type::Void>()) {
         if (ret->Value()) {
             AddError(ret, InstError(ret, "unexpected return value"));
         }
@@ -604,7 +604,7 @@
     }
 }
 
-const type::Type* Validator::GetVectorPtrElementType(Instruction* inst, size_t idx) {
+const core::type::Type* Validator::GetVectorPtrElementType(Instruction* inst, size_t idx) {
     auto* operand = inst->Operands()[idx];
     if (TINT_UNLIKELY(!operand)) {
         return nullptr;
@@ -615,9 +615,9 @@
         return nullptr;
     }
 
-    auto* vec_ptr_ty = type->As<type::Pointer>();
+    auto* vec_ptr_ty = type->As<core::type::Pointer>();
     if (TINT_LIKELY(vec_ptr_ty)) {
-        auto* vec_ty = vec_ptr_ty->StoreType()->As<type::Vector>();
+        auto* vec_ty = vec_ptr_ty->StoreType()->As<core::type::Vector>();
         if (TINT_LIKELY(vec_ty)) {
             return vec_ty->type();
         }
diff --git a/src/tint/lang/core/ir/validator.h b/src/tint/lang/core/ir/validator.h
index c409985..9448c7b 100644
--- a/src/tint/lang/core/ir/validator.h
+++ b/src/tint/lang/core/ir/validator.h
@@ -228,7 +228,7 @@
     /// @param inst the instruction
     /// @param idx the operand index
     /// @returns the vector pointer type for the given instruction operand
-    const type::Type* GetVectorPtrElementType(Instruction* inst, size_t idx);
+    const core::type::Type* GetVectorPtrElementType(Instruction* inst, size_t idx);
 
   private:
     Module& mod_;
diff --git a/src/tint/lang/core/ir/value.h b/src/tint/lang/core/ir/value.h
index 5871271..556f695 100644
--- a/src/tint/lang/core/ir/value.h
+++ b/src/tint/lang/core/ir/value.h
@@ -57,7 +57,7 @@
     ~Value() override;
 
     /// @returns the type of the value
-    virtual const type::Type* Type() { return nullptr; }
+    virtual const core::type::Type* Type() { return nullptr; }
 
     /// Destroys the Value. Once called, the Value must not be used again.
     /// The Value must not be in use by any instruction.
diff --git a/src/tint/lang/core/ir/var.cc b/src/tint/lang/core/ir/var.cc
index 3bf295c..cacf610 100644
--- a/src/tint/lang/core/ir/var.cc
+++ b/src/tint/lang/core/ir/var.cc
@@ -23,7 +23,7 @@
 
 Var::Var(InstructionResult* result) {
     if (result && result->Type()) {
-        TINT_ASSERT(result->Type()->Is<type::Pointer>());
+        TINT_ASSERT(result->Type()->Is<core::type::Pointer>());
     }
 
     // Default to no initializer.
diff --git a/src/tint/lang/core/type/abstract_float.cc b/src/tint/lang/core/type/abstract_float.cc
index 89791c4..e133e94 100644
--- a/src/tint/lang/core/type/abstract_float.cc
+++ b/src/tint/lang/core/type/abstract_float.cc
@@ -17,9 +17,9 @@
 #include "src/tint/lang/core/type/manager.h"
 #include "src/tint/utils/math/hash.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::AbstractFloat);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::AbstractFloat);
 
-namespace tint::type {
+namespace tint::core::type {
 
 AbstractFloat::AbstractFloat() : Base(Hash(tint::TypeInfo::Of<AbstractFloat>().full_hashcode)) {}
 
@@ -33,4 +33,4 @@
     return ctx.dst.mgr->Get<AbstractFloat>();
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/abstract_float.h b/src/tint/lang/core/type/abstract_float.h
index 857cf5e..59da480 100644
--- a/src/tint/lang/core/type/abstract_float.h
+++ b/src/tint/lang/core/type/abstract_float.h
@@ -19,7 +19,7 @@
 
 #include "src/tint/lang/core/type/abstract_numeric.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// An abstract-float type.
 /// @see https://www.w3.org/TR/WGSL/#abstractFloat
@@ -39,6 +39,6 @@
     AbstractFloat* Clone(CloneContext& ctx) const override;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_ABSTRACT_FLOAT_H_
diff --git a/src/tint/lang/core/type/abstract_int.cc b/src/tint/lang/core/type/abstract_int.cc
index ed2abe1..837d4cb 100644
--- a/src/tint/lang/core/type/abstract_int.cc
+++ b/src/tint/lang/core/type/abstract_int.cc
@@ -17,9 +17,9 @@
 #include "src/tint/lang/core/type/manager.h"
 #include "src/tint/utils/math/hash.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::AbstractInt);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::AbstractInt);
 
-namespace tint::type {
+namespace tint::core::type {
 
 AbstractInt::AbstractInt() : Base(Hash(tint::TypeInfo::Of<AbstractInt>().full_hashcode)) {}
 
@@ -33,4 +33,4 @@
     return ctx.dst.mgr->Get<AbstractInt>();
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/abstract_int.h b/src/tint/lang/core/type/abstract_int.h
index 71da42c..69d5aa0 100644
--- a/src/tint/lang/core/type/abstract_int.h
+++ b/src/tint/lang/core/type/abstract_int.h
@@ -19,7 +19,7 @@
 
 #include "src/tint/lang/core/type/abstract_numeric.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// An abstract-int type.
 /// @see https://www.w3.org/TR/WGSL/#abstractint
@@ -39,6 +39,6 @@
     AbstractInt* Clone(CloneContext& ctx) const override;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_ABSTRACT_INT_H_
diff --git a/src/tint/lang/core/type/abstract_numeric.cc b/src/tint/lang/core/type/abstract_numeric.cc
index 14bf9a9..e6ef24b 100644
--- a/src/tint/lang/core/type/abstract_numeric.cc
+++ b/src/tint/lang/core/type/abstract_numeric.cc
@@ -14,13 +14,13 @@
 
 #include "src/tint/lang/core/type/abstract_numeric.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::AbstractNumeric);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::AbstractNumeric);
 
-namespace tint::type {
+namespace tint::core::type {
 
 AbstractNumeric::AbstractNumeric(size_t hash)
     : Base(hash,
-           type::Flags{
+           core::type::Flags{
                Flag::kConstructable,
                Flag::kCreationFixedFootprint,
                Flag::kFixedFootprint,
@@ -35,4 +35,4 @@
     return 0;
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/abstract_numeric.h b/src/tint/lang/core/type/abstract_numeric.h
index 7a7670a..b76e7a7 100644
--- a/src/tint/lang/core/type/abstract_numeric.h
+++ b/src/tint/lang/core/type/abstract_numeric.h
@@ -19,7 +19,7 @@
 
 #include "src/tint/lang/core/type/numeric_scalar.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// The base class for abstract-int and abstract-float types.
 /// @see https://www.w3.org/TR/WGSL/#types-for-creation-time-constants
@@ -39,6 +39,6 @@
     uint32_t Align() const override;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_ABSTRACT_NUMERIC_H_
diff --git a/src/tint/lang/core/type/array.cc b/src/tint/lang/core/type/array.cc
index 59747ae..c76ba42 100644
--- a/src/tint/lang/core/type/array.cc
+++ b/src/tint/lang/core/type/array.cc
@@ -23,14 +23,14 @@
 #include "src/tint/utils/symbol/symbol_table.h"
 #include "src/tint/utils/text/string_stream.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::Array);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::Array);
 
-namespace tint::type {
+namespace tint::core::type {
 
 namespace {
 
-type::Flags FlagsFrom(const Type* element, const ArrayCount* count) {
-    type::Flags flags;
+core::type::Flags FlagsFrom(const Type* element, const ArrayCount* count) {
+    core::type::Flags flags;
     // Only constant-expression sized arrays are constructible
     if (count->Is<ConstantArrayCount>()) {
         if (element->IsConstructible()) {
@@ -128,4 +128,4 @@
     return ctx.dst.mgr->Get<Array>(elem_ty, count, align_, size_, stride_, implicit_stride_);
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/array.h b/src/tint/lang/core/type/array.h
index 1eb09c9..0f97911 100644
--- a/src/tint/lang/core/type/array.h
+++ b/src/tint/lang/core/type/array.h
@@ -25,7 +25,7 @@
 #include "src/tint/utils/containers/unique_vector.h"
 #include "src/tint/utils/macros/compiler.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// Array holds the type information for Array nodes.
 class Array final : public Castable<Array, Type> {
@@ -117,6 +117,6 @@
     const uint32_t implicit_stride_;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_ARRAY_H_
diff --git a/src/tint/lang/core/type/array_count.cc b/src/tint/lang/core/type/array_count.cc
index 3d6dc76..6b3f52f 100644
--- a/src/tint/lang/core/type/array_count.cc
+++ b/src/tint/lang/core/type/array_count.cc
@@ -16,11 +16,11 @@
 
 #include "src/tint/lang/core/type/manager.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::ArrayCount);
-TINT_INSTANTIATE_TYPEINFO(tint::type::ConstantArrayCount);
-TINT_INSTANTIATE_TYPEINFO(tint::type::RuntimeArrayCount);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::ArrayCount);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::ConstantArrayCount);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::RuntimeArrayCount);
 
-namespace tint::type {
+namespace tint::core::type {
 
 ArrayCount::ArrayCount(size_t hash) : Base(hash) {}
 ArrayCount::~ArrayCount() = default;
@@ -61,4 +61,4 @@
     return ctx.dst.mgr->Get<RuntimeArrayCount>();
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/array_count.h b/src/tint/lang/core/type/array_count.h
index 7ab196f..d3869c5 100644
--- a/src/tint/lang/core/type/array_count.h
+++ b/src/tint/lang/core/type/array_count.h
@@ -22,7 +22,7 @@
 #include "src/tint/lang/core/type/unique_node.h"
 #include "src/tint/utils/symbol/symbol_table.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// An array count
 class ArrayCount : public Castable<ArrayCount, UniqueNode> {
@@ -93,6 +93,6 @@
     RuntimeArrayCount* Clone(CloneContext& ctx) const override;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_ARRAY_COUNT_H_
diff --git a/src/tint/lang/core/type/array_test.cc b/src/tint/lang/core/type/array_test.cc
index d07d719..e82bebd 100644
--- a/src/tint/lang/core/type/array_test.cc
+++ b/src/tint/lang/core/type/array_test.cc
@@ -16,7 +16,7 @@
 #include "src/tint/lang/core/type/texture.h"
 #include "src/tint/lang/wgsl/sem/array_count.h"
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 using ArrayTest = TestHelper;
@@ -167,8 +167,8 @@
 TEST_F(ArrayTest, CloneSizedArray) {
     auto* ary = create<Array>(create<U32>(), create<ConstantArrayCount>(2u), 4u, 8u, 32u, 16u);
 
-    type::Manager mgr;
-    type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
+    core::type::Manager mgr;
+    core::type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* val = ary->Clone(ctx);
 
@@ -186,8 +186,8 @@
 TEST_F(ArrayTest, CloneRuntimeArray) {
     auto* ary = create<Array>(create<U32>(), create<RuntimeArrayCount>(), 4u, 8u, 32u, 32u);
 
-    type::Manager mgr;
-    type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
+    core::type::Manager mgr;
+    core::type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* val = ary->Clone(ctx);
     ASSERT_NE(val, nullptr);
@@ -201,4 +201,4 @@
 }
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/atomic.cc b/src/tint/lang/core/type/atomic.cc
index 4ff5607..20809f1 100644
--- a/src/tint/lang/core/type/atomic.cc
+++ b/src/tint/lang/core/type/atomic.cc
@@ -21,13 +21,13 @@
 #include "src/tint/utils/math/hash.h"
 #include "src/tint/utils/text/string_stream.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::Atomic);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::Atomic);
 
-namespace tint::type {
+namespace tint::core::type {
 
-Atomic::Atomic(const type::Type* subtype)
+Atomic::Atomic(const core::type::Type* subtype)
     : Base(Hash(tint::TypeInfo::Of<Atomic>().full_hashcode, subtype),
-           type::Flags{
+           core::type::Flags{
                Flag::kCreationFixedFootprint,
                Flag::kFixedFootprint,
            }),
@@ -35,7 +35,7 @@
     TINT_ASSERT(!subtype->Is<Reference>());
 }
 
-bool Atomic::Equals(const type::UniqueNode& other) const {
+bool Atomic::Equals(const core::type::UniqueNode& other) const {
     if (auto* o = other.As<Atomic>()) {
         return o->subtype_ == subtype_;
     }
@@ -63,4 +63,4 @@
     return ctx.dst.mgr->Get<Atomic>(ty);
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/atomic.h b/src/tint/lang/core/type/atomic.h
index 4680b45..6ca1938 100644
--- a/src/tint/lang/core/type/atomic.h
+++ b/src/tint/lang/core/type/atomic.h
@@ -19,24 +19,24 @@
 
 #include "src/tint/lang/core/type/type.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// A atomic type.
 class Atomic final : public Castable<Atomic, Type> {
   public:
     /// Constructor
     /// @param subtype the atomic type
-    explicit Atomic(const type::Type* subtype);
+    explicit Atomic(const core::type::Type* subtype);
 
     /// Destructor
     ~Atomic() override;
 
     /// @param other the other node to compare against
     /// @returns true if the this type is equal to @p other
-    bool Equals(const type::UniqueNode& other) const override;
+    bool Equals(const core::type::UniqueNode& other) const override;
 
     /// @returns the atomic type
-    const type::Type* Type() const { return subtype_; }
+    const core::type::Type* Type() const { return subtype_; }
 
     /// @returns the name for this type that closely resembles how it would be
     /// declared in WGSL.
@@ -53,9 +53,9 @@
     Atomic* Clone(CloneContext& ctx) const override;
 
   private:
-    type::Type const* const subtype_;
+    core::type::Type const* const subtype_;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_ATOMIC_H_
diff --git a/src/tint/lang/core/type/atomic_test.cc b/src/tint/lang/core/type/atomic_test.cc
index 8ff9232..e3f8b9f 100644
--- a/src/tint/lang/core/type/atomic_test.cc
+++ b/src/tint/lang/core/type/atomic_test.cc
@@ -16,7 +16,7 @@
 
 #include "src/tint/lang/core/type/helper_test.h"
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 using AtomicTest = TestHelper;
@@ -53,12 +53,12 @@
 TEST_F(AtomicTest, Clone) {
     auto* atomic = create<Atomic>(create<I32>());
 
-    type::Manager mgr;
-    type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
+    core::type::Manager mgr;
+    core::type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* val = atomic->Clone(ctx);
     EXPECT_TRUE(val->Type()->Is<I32>());
 }
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/bool.cc b/src/tint/lang/core/type/bool.cc
index 0c937a4..512aa00 100644
--- a/src/tint/lang/core/type/bool.cc
+++ b/src/tint/lang/core/type/bool.cc
@@ -16,13 +16,13 @@
 
 #include "src/tint/lang/core/type/manager.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::Bool);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::Bool);
 
-namespace tint::type {
+namespace tint::core::type {
 
 Bool::Bool()
     : Base(static_cast<size_t>(tint::TypeInfo::Of<Bool>().full_hashcode),
-           type::Flags{
+           core::type::Flags{
                Flag::kConstructable,
                Flag::kCreationFixedFootprint,
                Flag::kFixedFootprint,
@@ -46,4 +46,4 @@
     return ctx.dst.mgr->Get<Bool>();
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/bool.h b/src/tint/lang/core/type/bool.h
index 2a96db1..a0938e6 100644
--- a/src/tint/lang/core/type/bool.h
+++ b/src/tint/lang/core/type/bool.h
@@ -25,7 +25,7 @@
 #undef Bool
 #endif
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// A boolean type
 class Bool final : public Castable<Bool, Scalar> {
@@ -55,6 +55,6 @@
     Bool* Clone(CloneContext& ctx) const override;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_BOOL_H_
diff --git a/src/tint/lang/core/type/bool_test.cc b/src/tint/lang/core/type/bool_test.cc
index 39d08a4..e3a6347 100644
--- a/src/tint/lang/core/type/bool_test.cc
+++ b/src/tint/lang/core/type/bool_test.cc
@@ -15,7 +15,7 @@
 #include "src/tint/lang/core/type/helper_test.h"
 #include "src/tint/lang/core/type/texture.h"
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 using BoolTest = TestHelper;
@@ -46,12 +46,12 @@
 
 TEST_F(BoolTest, Clone) {
     auto* a = create<Bool>();
-    type::Manager mgr;
-    type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
+    core::type::Manager mgr;
+    core::type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* b = a->Clone(ctx);
     ASSERT_TRUE(b->Is<Bool>());
 }
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/builtin_structs.cc b/src/tint/lang/core/type/builtin_structs.cc
index fddf2b4..3d97986 100644
--- a/src/tint/lang/core/type/builtin_structs.cc
+++ b/src/tint/lang/core/type/builtin_structs.cc
@@ -32,7 +32,7 @@
 #include "src/tint/utils/symbol/symbol_table.h"
 #include "src/tint/utils/text/string.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// An array of `modf()` return type names for an argument of `vecN<f32>`.
 constexpr std::array kModfVecF32Names{
@@ -187,4 +187,4 @@
         });
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/builtin_structs.h b/src/tint/lang/core/type/builtin_structs.h
index c040af4..bd7fb8a 100644
--- a/src/tint/lang/core/type/builtin_structs.h
+++ b/src/tint/lang/core/type/builtin_structs.h
@@ -19,13 +19,13 @@
 namespace tint {
 class SymbolTable;
 }  // namespace tint
-namespace tint::type {
+namespace tint::core::type {
 class Manager;
 class Struct;
 class Type;
-}  // namespace tint::type
+}  // namespace tint::core::type
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// @param types the type manager
 /// @param symbols the symbol table
@@ -45,6 +45,6 @@
 /// @returns the builtin struct type for a atomic_compare_exchange() builtin call.
 Struct* CreateAtomicCompareExchangeResult(Manager& types, SymbolTable& symbols, const Type* ty);
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_BUILTIN_STRUCTS_H_
diff --git a/src/tint/lang/core/type/builtin_structs_test.cc b/src/tint/lang/core/type/builtin_structs_test.cc
index 478453b..a981b0e 100644
--- a/src/tint/lang/core/type/builtin_structs_test.cc
+++ b/src/tint/lang/core/type/builtin_structs_test.cc
@@ -29,7 +29,7 @@
 
 using namespace tint::number_suffixes;  // NOLINT
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 enum ElementType {
@@ -161,4 +161,4 @@
                          testing::Values(kI32, kU32));
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/clone_context.h b/src/tint/lang/core/type/clone_context.h
index c8d0ea3..8837e63 100644
--- a/src/tint/lang/core/type/clone_context.h
+++ b/src/tint/lang/core/type/clone_context.h
@@ -19,11 +19,11 @@
 namespace tint {
 class SymbolTable;
 }  // namespace tint
-namespace tint::type {
+namespace tint::core::type {
 class Manager;
-}  // namespace tint::type
+}  // namespace tint::core::type
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// Context information for cloning of types
 struct CloneContext {
@@ -42,6 +42,6 @@
     } dst;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_CLONE_CONTEXT_H_
diff --git a/src/tint/lang/core/type/depth_multisampled_texture.cc b/src/tint/lang/core/type/depth_multisampled_texture.cc
index 71983b9..3d30d83 100644
--- a/src/tint/lang/core/type/depth_multisampled_texture.cc
+++ b/src/tint/lang/core/type/depth_multisampled_texture.cc
@@ -21,9 +21,9 @@
 #include "src/tint/utils/math/hash.h"
 #include "src/tint/utils/text/string_stream.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::DepthMultisampledTexture);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::DepthMultisampledTexture);
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 bool IsValidDepthDimension(TextureDimension dim) {
@@ -56,4 +56,4 @@
     return ctx.dst.mgr->Get<DepthMultisampledTexture>(dim());
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/depth_multisampled_texture.h b/src/tint/lang/core/type/depth_multisampled_texture.h
index f5e1e35..c724775 100644
--- a/src/tint/lang/core/type/depth_multisampled_texture.h
+++ b/src/tint/lang/core/type/depth_multisampled_texture.h
@@ -20,7 +20,7 @@
 #include "src/tint/lang/core/type/texture.h"
 #include "src/tint/lang/core/type/texture_dimension.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// A multisampled depth texture type.
 class DepthMultisampledTexture final : public Castable<DepthMultisampledTexture, Texture> {
@@ -45,6 +45,6 @@
     DepthMultisampledTexture* Clone(CloneContext& ctx) const override;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_DEPTH_MULTISAMPLED_TEXTURE_H_
diff --git a/src/tint/lang/core/type/depth_multisampled_texture_test.cc b/src/tint/lang/core/type/depth_multisampled_texture_test.cc
index 04f6a1e..007e04d 100644
--- a/src/tint/lang/core/type/depth_multisampled_texture_test.cc
+++ b/src/tint/lang/core/type/depth_multisampled_texture_test.cc
@@ -20,7 +20,7 @@
 #include "src/tint/lang/core/type/storage_texture.h"
 #include "src/tint/lang/core/type/texture_dimension.h"
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 using DepthMultisampledTextureTest = TestHelper;
@@ -61,12 +61,12 @@
 TEST_F(DepthMultisampledTextureTest, Clone) {
     auto* a = create<DepthMultisampledTexture>(TextureDimension::k2d);
 
-    type::Manager mgr;
-    type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
+    core::type::Manager mgr;
+    core::type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* dt = a->Clone(ctx);
     EXPECT_EQ(dt->dim(), TextureDimension::k2d);
 }
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/depth_texture.cc b/src/tint/lang/core/type/depth_texture.cc
index 973bb56..d1ca5f5 100644
--- a/src/tint/lang/core/type/depth_texture.cc
+++ b/src/tint/lang/core/type/depth_texture.cc
@@ -21,9 +21,9 @@
 #include "src/tint/utils/math/hash.h"
 #include "src/tint/utils/text/string_stream.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::DepthTexture);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::DepthTexture);
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 bool IsValidDepthDimension(TextureDimension dim) {
@@ -57,4 +57,4 @@
     return ctx.dst.mgr->Get<DepthTexture>(dim());
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/depth_texture.h b/src/tint/lang/core/type/depth_texture.h
index 92692ed..4536fa6 100644
--- a/src/tint/lang/core/type/depth_texture.h
+++ b/src/tint/lang/core/type/depth_texture.h
@@ -20,7 +20,7 @@
 #include "src/tint/lang/core/type/texture.h"
 #include "src/tint/lang/core/type/texture_dimension.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// A depth texture type.
 class DepthTexture final : public Castable<DepthTexture, Texture> {
@@ -45,6 +45,6 @@
     DepthTexture* Clone(CloneContext& ctx) const override;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_DEPTH_TEXTURE_H_
diff --git a/src/tint/lang/core/type/depth_texture_test.cc b/src/tint/lang/core/type/depth_texture_test.cc
index b82ec7b..a0392369 100644
--- a/src/tint/lang/core/type/depth_texture_test.cc
+++ b/src/tint/lang/core/type/depth_texture_test.cc
@@ -20,7 +20,7 @@
 #include "src/tint/lang/core/type/storage_texture.h"
 #include "src/tint/lang/core/type/texture_dimension.h"
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 using DepthTextureTest = TestHelper;
@@ -73,12 +73,12 @@
 TEST_F(DepthTextureTest, Clone) {
     auto* a = create<DepthTexture>(TextureDimension::k2d);
 
-    type::Manager mgr;
-    type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
+    core::type::Manager mgr;
+    core::type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* dt = a->Clone(ctx);
     EXPECT_EQ(dt->dim(), TextureDimension::k2d);
 }
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/external_texture.cc b/src/tint/lang/core/type/external_texture.cc
index 13e5d44..24962ca 100644
--- a/src/tint/lang/core/type/external_texture.cc
+++ b/src/tint/lang/core/type/external_texture.cc
@@ -17,9 +17,9 @@
 #include "src/tint/lang/core/type/manager.h"
 #include "src/tint/lang/core/type/texture_dimension.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::ExternalTexture);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::ExternalTexture);
 
-namespace tint::type {
+namespace tint::core::type {
 
 ExternalTexture::ExternalTexture()
     : Base(static_cast<size_t>(tint::TypeInfo::Of<ExternalTexture>().full_hashcode),
@@ -39,4 +39,4 @@
     return ctx.dst.mgr->Get<ExternalTexture>();
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/external_texture.h b/src/tint/lang/core/type/external_texture.h
index 7f35697..d5ef929 100644
--- a/src/tint/lang/core/type/external_texture.h
+++ b/src/tint/lang/core/type/external_texture.h
@@ -19,7 +19,7 @@
 
 #include "src/tint/lang/core/type/texture.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// An external texture type
 class ExternalTexture final : public Castable<ExternalTexture, Texture> {
@@ -43,6 +43,6 @@
     ExternalTexture* Clone(CloneContext& ctx) const override;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_EXTERNAL_TEXTURE_H_
diff --git a/src/tint/lang/core/type/external_texture_test.cc b/src/tint/lang/core/type/external_texture_test.cc
index c850e9b..9ca5eb7 100644
--- a/src/tint/lang/core/type/external_texture_test.cc
+++ b/src/tint/lang/core/type/external_texture_test.cc
@@ -21,7 +21,7 @@
 #include "src/tint/lang/core/type/storage_texture.h"
 #include "src/tint/lang/core/type/texture_dimension.h"
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 using ExternalTextureTest = TestHelper;
@@ -70,12 +70,12 @@
 TEST_F(ExternalTextureTest, Clone) {
     auto* a = create<ExternalTexture>();
 
-    type::Manager mgr;
-    type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
+    core::type::Manager mgr;
+    core::type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* b = a->Clone(ctx);
     ASSERT_TRUE(b->Is<ExternalTexture>());
 }
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/f16.cc b/src/tint/lang/core/type/f16.cc
index f14db5a..8ff15cb 100644
--- a/src/tint/lang/core/type/f16.cc
+++ b/src/tint/lang/core/type/f16.cc
@@ -16,13 +16,13 @@
 
 #include "src/tint/lang/core/type/manager.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::F16);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::F16);
 
-namespace tint::type {
+namespace tint::core::type {
 
 F16::F16()
     : Base(static_cast<size_t>(tint::TypeInfo::Of<F16>().full_hashcode),
-           type::Flags{
+           core::type::Flags{
                Flag::kConstructable,
                Flag::kCreationFixedFootprint,
                Flag::kFixedFootprint,
@@ -46,4 +46,4 @@
     return ctx.dst.mgr->Get<F16>();
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/f16.h b/src/tint/lang/core/type/f16.h
index 4d310d8..bef6ead 100644
--- a/src/tint/lang/core/type/f16.h
+++ b/src/tint/lang/core/type/f16.h
@@ -19,7 +19,7 @@
 
 #include "src/tint/lang/core/type/numeric_scalar.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// A float 16 type
 class F16 final : public Castable<F16, NumericScalar> {
@@ -45,6 +45,6 @@
     F16* Clone(CloneContext& ctx) const override;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_F16_H_
diff --git a/src/tint/lang/core/type/f16_test.cc b/src/tint/lang/core/type/f16_test.cc
index f1b083e..61fa0dc 100644
--- a/src/tint/lang/core/type/f16_test.cc
+++ b/src/tint/lang/core/type/f16_test.cc
@@ -15,7 +15,7 @@
 #include "src/tint/lang/core/type/helper_test.h"
 #include "src/tint/lang/core/type/texture.h"
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 using F16Test = TestHelper;
@@ -47,12 +47,12 @@
 TEST_F(F16Test, Clone) {
     auto* a = create<F16>();
 
-    type::Manager mgr;
-    type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
+    core::type::Manager mgr;
+    core::type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* b = a->Clone(ctx);
     ASSERT_TRUE(b->Is<F16>());
 }
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/f32.cc b/src/tint/lang/core/type/f32.cc
index 2fb2693..1e5a676 100644
--- a/src/tint/lang/core/type/f32.cc
+++ b/src/tint/lang/core/type/f32.cc
@@ -16,13 +16,13 @@
 
 #include "src/tint/lang/core/type/manager.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::F32);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::F32);
 
-namespace tint::type {
+namespace tint::core::type {
 
 F32::F32()
     : Base(static_cast<size_t>(tint::TypeInfo::Of<F32>().full_hashcode),
-           type::Flags{
+           core::type::Flags{
                Flag::kConstructable,
                Flag::kCreationFixedFootprint,
                Flag::kFixedFootprint,
@@ -46,4 +46,4 @@
     return ctx.dst.mgr->Get<F32>();
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/f32.h b/src/tint/lang/core/type/f32.h
index 3c7f730..fe5af50 100644
--- a/src/tint/lang/core/type/f32.h
+++ b/src/tint/lang/core/type/f32.h
@@ -19,7 +19,7 @@
 
 #include "src/tint/lang/core/type/numeric_scalar.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// A float 32 type
 class F32 final : public Castable<F32, NumericScalar> {
@@ -45,6 +45,6 @@
     F32* Clone(CloneContext& ctx) const override;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_F32_H_
diff --git a/src/tint/lang/core/type/f32_test.cc b/src/tint/lang/core/type/f32_test.cc
index 5acab85..05b1546 100644
--- a/src/tint/lang/core/type/f32_test.cc
+++ b/src/tint/lang/core/type/f32_test.cc
@@ -15,7 +15,7 @@
 #include "src/tint/lang/core/type/helper_test.h"
 #include "src/tint/lang/core/type/texture.h"
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 using F32Test = TestHelper;
@@ -47,12 +47,12 @@
 TEST_F(F32Test, Clone) {
     auto* a = create<F32>();
 
-    type::Manager mgr;
-    type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
+    core::type::Manager mgr;
+    core::type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* b = a->Clone(ctx);
     ASSERT_TRUE(b->Is<F32>());
 }
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/helper_test.h b/src/tint/lang/core/type/helper_test.h
index 34b029d..7cb71bc 100644
--- a/src/tint/lang/core/type/helper_test.h
+++ b/src/tint/lang/core/type/helper_test.h
@@ -21,7 +21,7 @@
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/resolver/resolve.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// Helper class for testing
 template <typename BASE>
@@ -44,13 +44,13 @@
 template <typename T>
 using TestParamHelper = TestHelperBase<testing::TestWithParam<T>>;
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 /// Helper macro for testing that a type was as expected
 #define EXPECT_TYPE(GOT, EXPECT)                                                                \
     do {                                                                                        \
-        const type::Type* got = GOT;                                                            \
-        const type::Type* expect = EXPECT;                                                      \
+        const core::type::Type* got = GOT;                                                      \
+        const core::type::Type* expect = EXPECT;                                                \
         if (got != expect) {                                                                    \
             ADD_FAILURE() << #GOT " != " #EXPECT "\n"                                           \
                           << "  " #GOT ": " << (got ? got->FriendlyName() : "<null>") << "\n"   \
diff --git a/src/tint/lang/core/type/i32.cc b/src/tint/lang/core/type/i32.cc
index ceb53de..a2e7c9c 100644
--- a/src/tint/lang/core/type/i32.cc
+++ b/src/tint/lang/core/type/i32.cc
@@ -16,13 +16,13 @@
 
 #include "src/tint/lang/core/type/manager.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::I32);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::I32);
 
-namespace tint::type {
+namespace tint::core::type {
 
 I32::I32()
     : Base(static_cast<size_t>(tint::TypeInfo::Of<I32>().full_hashcode),
-           type::Flags{
+           core::type::Flags{
                Flag::kConstructable,
                Flag::kCreationFixedFootprint,
                Flag::kFixedFootprint,
@@ -46,4 +46,4 @@
     return ctx.dst.mgr->Get<I32>();
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/i32.h b/src/tint/lang/core/type/i32.h
index fae89d5..addcafa 100644
--- a/src/tint/lang/core/type/i32.h
+++ b/src/tint/lang/core/type/i32.h
@@ -19,7 +19,7 @@
 
 #include "src/tint/lang/core/type/numeric_scalar.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// A signed int 32 type.
 class I32 final : public Castable<I32, NumericScalar> {
@@ -45,6 +45,6 @@
     I32* Clone(CloneContext& ctx) const override;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_I32_H_
diff --git a/src/tint/lang/core/type/i32_test.cc b/src/tint/lang/core/type/i32_test.cc
index 5b9786c..8119a42 100644
--- a/src/tint/lang/core/type/i32_test.cc
+++ b/src/tint/lang/core/type/i32_test.cc
@@ -15,7 +15,7 @@
 #include "src/tint/lang/core/type/helper_test.h"
 #include "src/tint/lang/core/type/texture.h"
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 using I32Test = TestHelper;
@@ -47,12 +47,12 @@
 TEST_F(I32Test, Clone) {
     auto* a = create<I32>();
 
-    type::Manager mgr;
-    type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
+    core::type::Manager mgr;
+    core::type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* b = a->Clone(ctx);
     ASSERT_TRUE(b->Is<I32>());
 }
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/manager.cc b/src/tint/lang/core/type/manager.cc
index a1178f2..2a3436e 100644
--- a/src/tint/lang/core/type/manager.cc
+++ b/src/tint/lang/core/type/manager.cc
@@ -30,7 +30,7 @@
 #include "src/tint/lang/core/type/vector.h"
 #include "src/tint/lang/core/type/void.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 Manager::Manager() = default;
 
@@ -40,128 +40,131 @@
 
 Manager::~Manager() = default;
 
-const type::Void* Manager::void_() {
-    return Get<type::Void>();
+const core::type::Void* Manager::void_() {
+    return Get<core::type::Void>();
 }
 
-const type::Bool* Manager::bool_() {
-    return Get<type::Bool>();
+const core::type::Bool* Manager::bool_() {
+    return Get<core::type::Bool>();
 }
 
-const type::I32* Manager::i32() {
-    return Get<type::I32>();
+const core::type::I32* Manager::i32() {
+    return Get<core::type::I32>();
 }
 
-const type::U32* Manager::u32() {
-    return Get<type::U32>();
+const core::type::U32* Manager::u32() {
+    return Get<core::type::U32>();
 }
 
-const type::F32* Manager::f32() {
-    return Get<type::F32>();
+const core::type::F32* Manager::f32() {
+    return Get<core::type::F32>();
 }
 
-const type::F16* Manager::f16() {
-    return Get<type::F16>();
+const core::type::F16* Manager::f16() {
+    return Get<core::type::F16>();
 }
 
-const type::AbstractFloat* Manager::AFloat() {
-    return Get<type::AbstractFloat>();
+const core::type::AbstractFloat* Manager::AFloat() {
+    return Get<core::type::AbstractFloat>();
 }
 
-const type::AbstractInt* Manager::AInt() {
-    return Get<type::AbstractInt>();
+const core::type::AbstractInt* Manager::AInt() {
+    return Get<core::type::AbstractInt>();
 }
 
-const type::Atomic* Manager::atomic(const type::Type* inner) {
-    return Get<type::Atomic>(inner);
+const core::type::Atomic* Manager::atomic(const core::type::Type* inner) {
+    return Get<core::type::Atomic>(inner);
 }
 
-const type::Vector* Manager::packed_vec(const type::Type* inner, uint32_t size) {
-    return Get<type::Vector>(inner, size, true);
+const core::type::Vector* Manager::packed_vec(const core::type::Type* inner, uint32_t size) {
+    return Get<core::type::Vector>(inner, size, true);
 }
 
-const type::Vector* Manager::vec(const type::Type* inner, uint32_t size) {
-    return Get<type::Vector>(inner, size);
+const core::type::Vector* Manager::vec(const core::type::Type* inner, uint32_t size) {
+    return Get<core::type::Vector>(inner, size);
 }
 
-const type::Vector* Manager::vec2(const type::Type* inner) {
+const core::type::Vector* Manager::vec2(const core::type::Type* inner) {
     return vec(inner, 2);
 }
 
-const type::Vector* Manager::vec3(const type::Type* inner) {
+const core::type::Vector* Manager::vec3(const core::type::Type* inner) {
     return vec(inner, 3);
 }
 
-const type::Vector* Manager::vec4(const type::Type* inner) {
+const core::type::Vector* Manager::vec4(const core::type::Type* inner) {
     return vec(inner, 4);
 }
 
-const type::Matrix* Manager::mat(const type::Type* inner, uint32_t cols, uint32_t rows) {
-    return Get<type::Matrix>(vec(inner, rows), cols);
+const core::type::Matrix* Manager::mat(const core::type::Type* inner,
+                                       uint32_t cols,
+                                       uint32_t rows) {
+    return Get<core::type::Matrix>(vec(inner, rows), cols);
 }
 
-const type::Matrix* Manager::mat(const type::Vector* column_type, uint32_t cols) {
-    return Get<type::Matrix>(column_type, cols);
+const core::type::Matrix* Manager::mat(const core::type::Vector* column_type, uint32_t cols) {
+    return Get<core::type::Matrix>(column_type, cols);
 }
 
-const type::Matrix* Manager::mat2x2(const type::Type* inner) {
+const core::type::Matrix* Manager::mat2x2(const core::type::Type* inner) {
     return mat(inner, 2, 2);
 }
 
-const type::Matrix* Manager::mat2x3(const type::Type* inner) {
+const core::type::Matrix* Manager::mat2x3(const core::type::Type* inner) {
     return mat(inner, 2, 3);
 }
 
-const type::Matrix* Manager::mat2x4(const type::Type* inner) {
+const core::type::Matrix* Manager::mat2x4(const core::type::Type* inner) {
     return mat(inner, 2, 4);
 }
 
-const type::Matrix* Manager::mat3x2(const type::Type* inner) {
+const core::type::Matrix* Manager::mat3x2(const core::type::Type* inner) {
     return mat(inner, 3, 2);
 }
 
-const type::Matrix* Manager::mat3x3(const type::Type* inner) {
+const core::type::Matrix* Manager::mat3x3(const core::type::Type* inner) {
     return mat(inner, 3, 3);
 }
 
-const type::Matrix* Manager::mat3x4(const type::Type* inner) {
+const core::type::Matrix* Manager::mat3x4(const core::type::Type* inner) {
     return mat(inner, 3, 4);
 }
 
-const type::Matrix* Manager::mat4x2(const type::Type* inner) {
+const core::type::Matrix* Manager::mat4x2(const core::type::Type* inner) {
     return mat(inner, 4, 2);
 }
 
-const type::Matrix* Manager::mat4x3(const type::Type* inner) {
+const core::type::Matrix* Manager::mat4x3(const core::type::Type* inner) {
     return mat(inner, 4, 3);
 }
 
-const type::Matrix* Manager::mat4x4(const type::Type* inner) {
+const core::type::Matrix* Manager::mat4x4(const core::type::Type* inner) {
     return mat(inner, 4, 4);
 }
 
-const type::Array* Manager::array(const type::Type* elem_ty,
-                                  uint32_t count,
-                                  uint32_t stride /* = 0*/) {
+const core::type::Array* Manager::array(const core::type::Type* elem_ty,
+                                        uint32_t count,
+                                        uint32_t stride /* = 0*/) {
     uint32_t implicit_stride = tint::RoundUp(elem_ty->Align(), elem_ty->Size());
     if (stride == 0) {
         stride = implicit_stride;
     }
     TINT_ASSERT(stride >= implicit_stride);
 
-    return Get<type::Array>(/* element type */ elem_ty,
-                            /* element count */ Get<ConstantArrayCount>(count),
-                            /* array alignment */ elem_ty->Align(),
-                            /* array size */ count * stride,
-                            /* element stride */ stride,
-                            /* implicit stride */ implicit_stride);
+    return Get<core::type::Array>(/* element type */ elem_ty,
+                                  /* element count */ Get<ConstantArrayCount>(count),
+                                  /* array alignment */ elem_ty->Align(),
+                                  /* array size */ count * stride,
+                                  /* element stride */ stride,
+                                  /* implicit stride */ implicit_stride);
 }
 
-const type::Array* Manager::runtime_array(const type::Type* elem_ty, uint32_t stride /* = 0 */) {
+const core::type::Array* Manager::runtime_array(const core::type::Type* elem_ty,
+                                                uint32_t stride /* = 0 */) {
     if (stride == 0) {
         stride = elem_ty->Align();
     }
-    return Get<type::Array>(
+    return Get<core::type::Array>(
         /* element type */ elem_ty,
         /* element count */ Get<RuntimeArrayCount>(),
         /* array alignment */ elem_ty->Align(),
@@ -170,27 +173,27 @@
         /* implicit stride */ elem_ty->Align());
 }
 
-const type::Pointer* Manager::ptr(core::AddressSpace address_space,
-                                  const type::Type* subtype,
-                                  core::Access access /* = core::Access::kReadWrite */) {
-    return Get<type::Pointer>(address_space, subtype, access);
+const core::type::Pointer* Manager::ptr(core::AddressSpace address_space,
+                                        const core::type::Type* subtype,
+                                        core::Access access /* = core::Access::kReadWrite */) {
+    return Get<core::type::Pointer>(address_space, subtype, access);
 }
 
-type::Struct* Manager::Struct(Symbol name, VectorRef<StructMemberDesc> md) {
-    tint::Vector<const type::StructMember*, 4> members;
+core::type::Struct* Manager::Struct(Symbol name, VectorRef<StructMemberDesc> md) {
+    tint::Vector<const core::type::StructMember*, 4> members;
     uint32_t current_size = 0u;
     uint32_t max_align = 0u;
     for (const auto& m : md) {
         uint32_t index = static_cast<uint32_t>(members.Length());
         uint32_t align = std::max<uint32_t>(m.type->Align(), 1u);
         uint32_t offset = tint::RoundUp(align, current_size);
-        members.Push(Get<type::StructMember>(m.name, m.type, index, offset, align, m.type->Size(),
-                                             std::move(m.attributes)));
+        members.Push(Get<core::type::StructMember>(m.name, m.type, index, offset, align,
+                                                   m.type->Size(), std::move(m.attributes)));
         current_size = offset + m.type->Size();
         max_align = std::max(max_align, align);
     }
-    return Get<type::Struct>(name, members, max_align, tint::RoundUp(max_align, current_size),
-                             current_size);
+    return Get<core::type::Struct>(name, members, max_align, tint::RoundUp(max_align, current_size),
+                                   current_size);
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/manager.h b/src/tint/lang/core/type/manager.h
index 55def97..b3597d0 100644
--- a/src/tint/lang/core/type/manager.h
+++ b/src/tint/lang/core/type/manager.h
@@ -31,7 +31,7 @@
 #include "src/tint/utils/symbol/symbol.h"
 
 // Forward declarations
-namespace tint::type {
+namespace tint::core::type {
 class AbstractFloat;
 class AbstractInt;
 class Array;
@@ -44,9 +44,9 @@
 class U32;
 class Vector;
 class Void;
-}  // namespace tint::type
+}  // namespace tint::core::type
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// The type manager holds all the pointers to the known types.
 class Manager final {
@@ -86,28 +86,28 @@
 
     /// Constructs or returns an existing type, unique node or node
     /// @param args the arguments used to construct the type, unique node or node.
-    /// @tparam T a class deriving from type::Node, or a C-like type that's automatically translated
-    /// to the equivalent type node type. For example `Get<i32>()` is equivalent to
-    /// `Get<type::I32>()`
+    /// @tparam T a class deriving from core::type::Node, or a C-like type that's automatically
+    /// translated to the equivalent type node type. For example `Get<i32>()` is equivalent to
+    /// `Get<core::type::I32>()`
     /// @return a pointer to an instance of `T` with the provided arguments.
     /// If `T` derives from UniqueNode and an existing instance of `T` has been constructed, then
     /// the same pointer is returned.
     template <typename T, typename... ARGS>
     auto* Get(ARGS&&... args) {
         if constexpr (std::is_same_v<T, tint::AInt>) {
-            return Get<type::AbstractInt>(std::forward<ARGS>(args)...);
+            return Get<core::type::AbstractInt>(std::forward<ARGS>(args)...);
         } else if constexpr (std::is_same_v<T, tint::AFloat>) {
-            return Get<type::AbstractFloat>(std::forward<ARGS>(args)...);
+            return Get<core::type::AbstractFloat>(std::forward<ARGS>(args)...);
         } else if constexpr (std::is_same_v<T, tint::i32>) {
-            return Get<type::I32>(std::forward<ARGS>(args)...);
+            return Get<core::type::I32>(std::forward<ARGS>(args)...);
         } else if constexpr (std::is_same_v<T, tint::u32>) {
-            return Get<type::U32>(std::forward<ARGS>(args)...);
+            return Get<core::type::U32>(std::forward<ARGS>(args)...);
         } else if constexpr (std::is_same_v<T, tint::f32>) {
-            return Get<type::F32>(std::forward<ARGS>(args)...);
+            return Get<core::type::F32>(std::forward<ARGS>(args)...);
         } else if constexpr (std::is_same_v<T, tint::f16>) {
-            return Get<type::F16>(std::forward<ARGS>(args)...);
+            return Get<core::type::F16>(std::forward<ARGS>(args)...);
         } else if constexpr (std::is_same_v<T, bool>) {
-            return Get<type::Bool>(std::forward<ARGS>(args)...);
+            return Get<core::type::Bool>(std::forward<ARGS>(args)...);
         } else if constexpr (core::fluent_types::IsVector<T>) {
             return vec<typename T::type, T::width>(std::forward<ARGS>(args)...);
         } else if constexpr (core::fluent_types::IsMatrix<T>) {
@@ -136,67 +136,67 @@
     }
 
     /// @returns a void type
-    const type::Void* void_();
+    const core::type::Void* void_();
 
     /// @returns a bool type
-    const type::Bool* bool_();
+    const core::type::Bool* bool_();
 
     /// @returns an i32 type
-    const type::I32* i32();
+    const core::type::I32* i32();
 
     /// @returns a u32 type
-    const type::U32* u32();
+    const core::type::U32* u32();
 
     /// @returns an f32 type
-    const type::F32* f32();
+    const core::type::F32* f32();
 
     /// @returns an f16 type
-    const type::F16* f16();
+    const core::type::F16* f16();
 
     /// @returns a abstract-float type
-    const type::AbstractFloat* AFloat();
+    const core::type::AbstractFloat* AFloat();
 
     /// @returns a abstract-int type
-    const type::AbstractInt* AInt();
+    const core::type::AbstractInt* AInt();
 
     /// @param inner the inner type
     /// @returns an atomic type with the element type @p inner
-    const type::Atomic* atomic(const type::Type* inner);
+    const core::type::Atomic* atomic(const core::type::Type* inner);
 
     /// @tparam T the element type
     /// @returns the atomic type
     template <typename T>
-    const type::Atomic* atomic() {
+    const core::type::Atomic* atomic() {
         return atomic(Get<T>());
     }
 
     /// @param inner the inner type
     /// @param size the vector size
     /// @returns the vector type
-    const type::Vector* packed_vec(const type::Type* inner, uint32_t size);
+    const core::type::Vector* packed_vec(const core::type::Type* inner, uint32_t size);
 
     /// @param inner the inner type
     /// @param size the vector size
     /// @returns the vector type
-    const type::Vector* vec(const type::Type* inner, uint32_t size);
+    const core::type::Vector* vec(const core::type::Type* inner, uint32_t size);
 
     /// @param inner the inner type
     /// @returns a vec2 type with the element type @p inner
-    const type::Vector* vec2(const type::Type* inner);
+    const core::type::Vector* vec2(const core::type::Type* inner);
 
     /// @param inner the inner type
     /// @returns a vec3 type with the element type @p inner
-    const type::Vector* vec3(const type::Type* inner);
+    const core::type::Vector* vec3(const core::type::Type* inner);
 
     /// @param inner the inner type
     /// @returns a vec4 type with the element type @p inner
-    const type::Vector* vec4(const type::Type* inner);
+    const core::type::Vector* vec4(const core::type::Type* inner);
 
     /// @tparam T the element type
     /// @tparam N the vector width
     /// @returns the vector type
     template <typename T, size_t N>
-    const type::Vector* vec() {
+    const core::type::Vector* vec() {
         TINT_BEGIN_DISABLE_WARNING(UNREACHABLE_CODE);
         static_assert(N >= 2 && N <= 4);
         switch (N) {
@@ -214,21 +214,21 @@
     /// @tparam T the element type
     /// @returns a vec2 with the element type `T`
     template <typename T>
-    const type::Vector* vec2() {
+    const core::type::Vector* vec2() {
         return vec2(Get<T>());
     }
 
     /// @tparam T the element type
     /// @returns a vec2 with the element type `T`
     template <typename T>
-    const type::Vector* vec3() {
+    const core::type::Vector* vec3() {
         return vec3(Get<T>());
     }
 
     /// @tparam T the element type
     /// @returns a vec2 with the element type `T`
     template <typename T>
-    const type::Vector* vec4() {
+    const core::type::Vector* vec4() {
         return vec4(Get<T>());
     }
 
@@ -236,109 +236,109 @@
     /// @param cols the number of columns
     /// @param rows the number of rows
     /// @returns the matrix type
-    const type::Matrix* mat(const type::Type* inner, uint32_t cols, uint32_t rows);
+    const core::type::Matrix* mat(const core::type::Type* inner, uint32_t cols, uint32_t rows);
 
     /// @param column_type the column vector type
     /// @param cols the number of columns
     /// @returns the matrix type
-    const type::Matrix* mat(const type::Vector* column_type, uint32_t cols);
+    const core::type::Matrix* mat(const core::type::Vector* column_type, uint32_t cols);
 
     /// @param inner the inner type
     /// @returns a mat2x2 with the element @p inner
-    const type::Matrix* mat2x2(const type::Type* inner);
+    const core::type::Matrix* mat2x2(const core::type::Type* inner);
 
     /// @tparam T the element type
     /// @returns a mat2x2 with the element type `T`
     template <typename T>
-    const type::Matrix* mat2x2() {
+    const core::type::Matrix* mat2x2() {
         return mat2x2(Get<T>());
     }
 
     /// @param inner the inner type
     /// @returns a mat2x3 with the element @p inner
-    const type::Matrix* mat2x3(const type::Type* inner);
+    const core::type::Matrix* mat2x3(const core::type::Type* inner);
 
     /// @tparam T the element type
     /// @returns a mat2x3 with the element type `T`
     template <typename T>
-    const type::Matrix* mat2x3() {
+    const core::type::Matrix* mat2x3() {
         return mat2x3(Get<T>());
     }
 
     /// @param inner the inner type
     /// @returns a mat2x4 with the element @p inner
-    const type::Matrix* mat2x4(const type::Type* inner);
+    const core::type::Matrix* mat2x4(const core::type::Type* inner);
 
     /// @tparam T the element type
     /// @returns a mat2x4 with the element type `T`
     template <typename T>
-    const type::Matrix* mat2x4() {
+    const core::type::Matrix* mat2x4() {
         return mat2x4(Get<T>());
     }
 
     /// @param inner the inner type
     /// @returns a mat3x2 with the element @p inner
-    const type::Matrix* mat3x2(const type::Type* inner);
+    const core::type::Matrix* mat3x2(const core::type::Type* inner);
 
     /// @tparam T the element type
     /// @returns a mat3x2 with the element type `T`
     template <typename T>
-    const type::Matrix* mat3x2() {
+    const core::type::Matrix* mat3x2() {
         return mat3x2(Get<T>());
     }
 
     /// @param inner the inner type
     /// @returns a mat3x3 with the element @p inner
-    const type::Matrix* mat3x3(const type::Type* inner);
+    const core::type::Matrix* mat3x3(const core::type::Type* inner);
 
     /// @tparam T the element type
     /// @returns a mat3x3 with the element type `T`
     template <typename T>
-    const type::Matrix* mat3x3() {
+    const core::type::Matrix* mat3x3() {
         return mat3x3(Get<T>());
     }
 
     /// @param inner the inner type
     /// @returns a mat3x4 with the element @p inner
-    const type::Matrix* mat3x4(const type::Type* inner);
+    const core::type::Matrix* mat3x4(const core::type::Type* inner);
 
     /// @tparam T the element type
     /// @returns a mat3x4 with the element type `T`
     template <typename T>
-    const type::Matrix* mat3x4() {
+    const core::type::Matrix* mat3x4() {
         return mat3x4(Get<T>());
     }
 
     /// @param inner the inner type
     /// @returns a mat4x2 with the element @p inner
-    const type::Matrix* mat4x2(const type::Type* inner);
+    const core::type::Matrix* mat4x2(const core::type::Type* inner);
 
     /// @tparam T the element type
     /// @returns a mat4x2 with the element type `T`
     template <typename T>
-    const type::Matrix* mat4x2() {
+    const core::type::Matrix* mat4x2() {
         return mat4x2(Get<T>());
     }
 
     /// @param inner the inner type
     /// @returns a mat4x3 with the element @p inner
-    const type::Matrix* mat4x3(const type::Type* inner);
+    const core::type::Matrix* mat4x3(const core::type::Type* inner);
 
     /// @tparam T the element type
     /// @returns a mat4x3 with the element type `T`
     template <typename T>
-    const type::Matrix* mat4x3() {
+    const core::type::Matrix* mat4x3() {
         return mat4x3(Get<T>());
     }
 
     /// @param inner the inner type
     /// @returns a mat4x4 with the element @p inner
-    const type::Matrix* mat4x4(const type::Type* inner);
+    const core::type::Matrix* mat4x4(const core::type::Type* inner);
 
     /// @tparam T the element type
     /// @returns a mat4x4 with the element type `T`
     template <typename T>
-    const type::Matrix* mat4x4() {
+    const core::type::Matrix* mat4x4() {
         return mat4x4(Get<T>());
     }
 
@@ -347,7 +347,7 @@
     /// @tparam T the element type
     /// @returns a matrix with the given number of columns and rows
     template <typename T>
-    const type::Matrix* mat(uint32_t columns, uint32_t rows) {
+    const core::type::Matrix* mat(uint32_t columns, uint32_t rows) {
         return mat(Get<T>(), columns, rows);
     }
 
@@ -356,7 +356,7 @@
     /// @tparam T the element type
     /// @returns a matrix with the given number of columns and rows
     template <uint32_t C, uint32_t R, typename T>
-    const type::Matrix* mat() {
+    const core::type::Matrix* mat() {
         return mat(Get<T>(), C, R);
     }
 
@@ -364,19 +364,21 @@
     /// @param count the array element count
     /// @param stride the optional array element stride
     /// @returns the array type
-    const type::Array* array(const type::Type* elem_ty, uint32_t count, uint32_t stride = 0);
+    const core::type::Array* array(const core::type::Type* elem_ty,
+                                   uint32_t count,
+                                   uint32_t stride = 0);
 
     /// @param elem_ty the array element type
     /// @param stride the optional array element stride
     /// @returns the runtime array type
-    const type::Array* runtime_array(const type::Type* elem_ty, uint32_t stride = 0);
+    const core::type::Array* runtime_array(const core::type::Type* elem_ty, uint32_t stride = 0);
 
     /// @returns an array type with the element type `T` and size `N`.
     /// @tparam T the element type
     /// @tparam N the array length. If zero, then constructs a runtime-sized array.
     /// @param stride the optional array element stride
     template <typename T, size_t N = 0>
-    const type::Array* array(uint32_t stride = 0) {
+    const core::type::Array* array(uint32_t stride = 0) {
         if constexpr (N == 0) {
             return runtime_array(Get<T>(), stride);
         } else {
@@ -388,16 +390,16 @@
     /// @param subtype the pointer subtype
     /// @param access the access settings
     /// @returns the pointer type
-    const type::Pointer* ptr(core::AddressSpace address_space,
-                             const type::Type* subtype,
-                             core::Access access = core::Access::kReadWrite);
+    const core::type::Pointer* ptr(core::AddressSpace address_space,
+                                   const core::type::Type* subtype,
+                                   core::Access access = core::Access::kReadWrite);
 
     /// @tparam SPACE the address space
     /// @tparam T the storage type
     /// @tparam ACCESS the access mode
     /// @returns the pointer type with the templated address space, storage type and access.
     template <core::AddressSpace SPACE, typename T, core::Access ACCESS = core::Access::kReadWrite>
-    const type::Pointer* ptr() {
+    const core::type::Pointer* ptr() {
         return ptr(SPACE, Get<T>(), ACCESS);
     }
 
@@ -406,16 +408,18 @@
     /// @tparam ACCESS the access mode
     /// @returns the pointer type with the templated address space, storage type and access.
     template <core::AddressSpace SPACE, core::Access ACCESS = core::Access::kReadWrite>
-    const type::Pointer* ptr(const type::Type* subtype) {
+    const core::type::Pointer* ptr(const core::type::Type* subtype) {
         return ptr(SPACE, subtype, ACCESS);
     }
 
     /// @returns the sampler type
-    const type::Sampler* sampler() { return Get<type::Sampler>(type::SamplerKind::kSampler); }
+    const core::type::Sampler* sampler() {
+        return Get<core::type::Sampler>(core::type::SamplerKind::kSampler);
+    }
 
     /// @returns the comparison sampler type
-    const type::Sampler* comparison_sampler() {
-        return Get<type::Sampler>(type::SamplerKind::kComparisonSampler);
+    const core::type::Sampler* comparison_sampler() {
+        return Get<core::type::Sampler>(core::type::SamplerKind::kComparisonSampler);
     }
 
     /// A structure member descriptor.
@@ -423,22 +427,22 @@
         /// The name of the struct member.
         Symbol name;
         /// The type of the struct member.
-        const type::Type* type = nullptr;
+        const core::type::Type* type = nullptr;
         /// The optional struct member attributes.
-        type::StructMemberAttributes attributes = {};
+        core::type::StructMemberAttributes attributes = {};
     };
 
     /// Create a new structure declaration.
     /// @param name the name of the structure
     /// @param members the list of structure member descriptors
     /// @returns the structure type
-    type::Struct* Struct(Symbol name, VectorRef<StructMemberDesc> members);
+    core::type::Struct* Struct(Symbol name, VectorRef<StructMemberDesc> members);
 
     /// Create a new structure declaration.
     /// @param name the name of the structure
     /// @param members the list of structure member descriptors
     /// @returns the structure type
-    type::Struct* Struct(Symbol name, std::initializer_list<StructMemberDesc> members) {
+    core::type::Struct* Struct(Symbol name, std::initializer_list<StructMemberDesc> members) {
         return Struct(name, tint::Vector<StructMemberDesc, 4>(members));
     }
 
@@ -449,7 +453,7 @@
 
   private:
     /// ToType<T> is specialized for various `T` types and each specialization contains a single
-    /// `type` alias to the corresponding type deriving from `type::Type`.
+    /// `type` alias to the corresponding type deriving from `core::type::Type`.
     template <typename T>
     struct ToTypeImpl {
         using type = T;
@@ -466,6 +470,6 @@
     BlockAllocator<Node> nodes_;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_MANAGER_H_
diff --git a/src/tint/lang/core/type/manager_test.cc b/src/tint/lang/core/type/manager_test.cc
index 23f58f5..d22b6bc 100644
--- a/src/tint/lang/core/type/manager_test.cc
+++ b/src/tint/lang/core/type/manager_test.cc
@@ -21,7 +21,7 @@
 #include "src/tint/lang/core/type/i32.h"
 #include "src/tint/lang/core/type/u32.h"
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 template <typename T>
@@ -112,4 +112,4 @@
 }
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/matrix.cc b/src/tint/lang/core/type/matrix.cc
index 59e006a..6137170 100644
--- a/src/tint/lang/core/type/matrix.cc
+++ b/src/tint/lang/core/type/matrix.cc
@@ -21,13 +21,13 @@
 #include "src/tint/utils/math/hash.h"
 #include "src/tint/utils/text/string_stream.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::Matrix);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::Matrix);
 
-namespace tint::type {
+namespace tint::core::type {
 
 Matrix::Matrix(const Vector* column_type, uint32_t columns)
     : Base(Hash(tint::TypeInfo::Of<Vector>().full_hashcode, columns, column_type),
-           type::Flags{
+           core::type::Flags{
                Flag::kConstructable,
                Flag::kCreationFixedFootprint,
                Flag::kFixedFootprint,
@@ -83,4 +83,4 @@
     return ctx.dst.mgr->Get<Matrix>(col_ty, columns_);
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/matrix.h b/src/tint/lang/core/type/matrix.h
index 2a9cda5..080a2f3 100644
--- a/src/tint/lang/core/type/matrix.h
+++ b/src/tint/lang/core/type/matrix.h
@@ -20,11 +20,11 @@
 #include "src/tint/lang/core/type/vector.h"
 
 // Forward declarations
-namespace tint::type {
+namespace tint::core::type {
 class Vector;
-}  // namespace tint::type
+}  // namespace tint::core::type
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// A matrix type
 class Matrix final : public Castable<Matrix, Type> {
@@ -83,6 +83,6 @@
     const uint32_t columns_;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_MATRIX_H_
diff --git a/src/tint/lang/core/type/matrix_test.cc b/src/tint/lang/core/type/matrix_test.cc
index 914ade6..079b0e3 100644
--- a/src/tint/lang/core/type/matrix_test.cc
+++ b/src/tint/lang/core/type/matrix_test.cc
@@ -15,7 +15,7 @@
 #include "src/tint/lang/core/type/helper_test.h"
 #include "src/tint/lang/core/type/texture.h"
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 using MatrixTest = TestHelper;
@@ -68,8 +68,8 @@
 TEST_F(MatrixTest, Clone) {
     auto* a = create<Matrix>(create<Vector>(create<I32>(), 3u), 4u);
 
-    type::Manager mgr;
-    type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
+    core::type::Manager mgr;
+    core::type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* mat = a->Clone(ctx);
     EXPECT_TRUE(mat->type()->Is<I32>());
@@ -78,4 +78,4 @@
 }
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/multisampled_texture.cc b/src/tint/lang/core/type/multisampled_texture.cc
index 20b9da3..8a93f86 100644
--- a/src/tint/lang/core/type/multisampled_texture.cc
+++ b/src/tint/lang/core/type/multisampled_texture.cc
@@ -21,9 +21,9 @@
 #include "src/tint/utils/math/hash.h"
 #include "src/tint/utils/text/string_stream.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::MultisampledTexture);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::MultisampledTexture);
 
-namespace tint::type {
+namespace tint::core::type {
 
 MultisampledTexture::MultisampledTexture(TextureDimension dim, const Type* type)
     : Base(Hash(tint::TypeInfo::Of<MultisampledTexture>().full_hashcode, dim, type), dim),
@@ -51,4 +51,4 @@
     return ctx.dst.mgr->Get<MultisampledTexture>(dim(), ty);
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/multisampled_texture.h b/src/tint/lang/core/type/multisampled_texture.h
index 0a37556..017ad69 100644
--- a/src/tint/lang/core/type/multisampled_texture.h
+++ b/src/tint/lang/core/type/multisampled_texture.h
@@ -20,7 +20,7 @@
 #include "src/tint/lang/core/type/texture.h"
 #include "src/tint/lang/core/type/texture_dimension.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// A multisampled texture type.
 class MultisampledTexture final : public Castable<MultisampledTexture, Texture> {
@@ -52,6 +52,6 @@
     const Type* const type_;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_MULTISAMPLED_TEXTURE_H_
diff --git a/src/tint/lang/core/type/multisampled_texture_test.cc b/src/tint/lang/core/type/multisampled_texture_test.cc
index fcbd1d3..4a893b3 100644
--- a/src/tint/lang/core/type/multisampled_texture_test.cc
+++ b/src/tint/lang/core/type/multisampled_texture_test.cc
@@ -21,7 +21,7 @@
 #include "src/tint/lang/core/type/storage_texture.h"
 #include "src/tint/lang/core/type/texture_dimension.h"
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 using MultisampledTextureTest = TestHelper;
@@ -85,8 +85,8 @@
 TEST_F(MultisampledTextureTest, Clone) {
     auto* a = create<MultisampledTexture>(TextureDimension::k2d, create<F32>());
 
-    type::Manager mgr;
-    type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
+    core::type::Manager mgr;
+    core::type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* mt = a->Clone(ctx);
     EXPECT_EQ(mt->dim(), TextureDimension::k2d);
@@ -94,4 +94,4 @@
 }
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/node.cc b/src/tint/lang/core/type/node.cc
index 7b04892..5735efd 100644
--- a/src/tint/lang/core/type/node.cc
+++ b/src/tint/lang/core/type/node.cc
@@ -14,9 +14,9 @@
 
 #include "src/tint/lang/core/type/node.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::Node);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::Node);
 
-namespace tint::type {
+namespace tint::core::type {
 
 Node::Node() = default;
 
@@ -24,4 +24,4 @@
 
 Node::~Node() = default;
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/node.h b/src/tint/lang/core/type/node.h
index d4addf4..2cb4bdc 100644
--- a/src/tint/lang/core/type/node.h
+++ b/src/tint/lang/core/type/node.h
@@ -17,7 +17,7 @@
 
 #include "src/tint/utils/rtti/castable.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// Node is the base class for all type nodes
 class Node : public Castable<Node> {
@@ -32,6 +32,6 @@
     ~Node() override;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_NODE_H_
diff --git a/src/tint/lang/core/type/numeric_scalar.cc b/src/tint/lang/core/type/numeric_scalar.cc
index bce6b92..9813f4c 100644
--- a/src/tint/lang/core/type/numeric_scalar.cc
+++ b/src/tint/lang/core/type/numeric_scalar.cc
@@ -14,12 +14,12 @@
 
 #include "src/tint/lang/core/type/numeric_scalar.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::NumericScalar);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::NumericScalar);
 
-namespace tint::type {
+namespace tint::core::type {
 
-NumericScalar::NumericScalar(size_t hash, type::Flags flags) : Base(hash, flags) {}
+NumericScalar::NumericScalar(size_t hash, core::type::Flags flags) : Base(hash, flags) {}
 
 NumericScalar::~NumericScalar() = default;
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/numeric_scalar.h b/src/tint/lang/core/type/numeric_scalar.h
index 987921a..cdcd3fc 100644
--- a/src/tint/lang/core/type/numeric_scalar.h
+++ b/src/tint/lang/core/type/numeric_scalar.h
@@ -17,7 +17,7 @@
 
 #include "src/tint/lang/core/type/scalar.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// Base class for all numeric-scalar types
 /// @see https://www.w3.org/TR/WGSL/#scalar-types
@@ -30,9 +30,9 @@
     /// Constructor
     /// @param hash the immutable hash for the node
     /// @param flags the flags of this type
-    NumericScalar(size_t hash, type::Flags flags);
+    NumericScalar(size_t hash, core::type::Flags flags);
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_NUMERIC_SCALAR_H_
diff --git a/src/tint/lang/core/type/pointer.cc b/src/tint/lang/core/type/pointer.cc
index c89f25c..c73c0fa 100644
--- a/src/tint/lang/core/type/pointer.cc
+++ b/src/tint/lang/core/type/pointer.cc
@@ -21,13 +21,13 @@
 #include "src/tint/utils/math/hash.h"
 #include "src/tint/utils/text/string_stream.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::Pointer);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::Pointer);
 
-namespace tint::type {
+namespace tint::core::type {
 
 Pointer::Pointer(core::AddressSpace address_space, const Type* subtype, core::Access access)
     : Base(Hash(tint::TypeInfo::Of<Pointer>().full_hashcode, address_space, subtype, access),
-           type::Flags{}),
+           core::type::Flags{}),
       subtype_(subtype),
       address_space_(address_space),
       access_(access) {
@@ -61,4 +61,4 @@
     return ctx.dst.mgr->Get<Pointer>(address_space_, ty, access_);
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/pointer.h b/src/tint/lang/core/type/pointer.h
index ec3b673..69e5b80 100644
--- a/src/tint/lang/core/type/pointer.h
+++ b/src/tint/lang/core/type/pointer.h
@@ -21,7 +21,7 @@
 #include "src/tint/lang/core/address_space.h"
 #include "src/tint/lang/core/type/type.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// A pointer type.
 class Pointer final : public Castable<Pointer, Type> {
@@ -62,6 +62,6 @@
     core::Access const access_;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_POINTER_H_
diff --git a/src/tint/lang/core/type/pointer_test.cc b/src/tint/lang/core/type/pointer_test.cc
index 1649f5c..b937f77 100644
--- a/src/tint/lang/core/type/pointer_test.cc
+++ b/src/tint/lang/core/type/pointer_test.cc
@@ -16,7 +16,7 @@
 #include "src/tint/lang/core/type/helper_test.h"
 #include "src/tint/lang/core/type/texture.h"
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 using PointerTest = TestHelper;
@@ -83,8 +83,8 @@
     auto* a =
         create<Pointer>(core::AddressSpace::kStorage, create<I32>(), core::Access::kReadWrite);
 
-    type::Manager mgr;
-    type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
+    core::type::Manager mgr;
+    core::type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* ptr = a->Clone(ctx);
     EXPECT_TRUE(ptr->StoreType()->Is<I32>());
@@ -93,4 +93,4 @@
 }
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/reference.cc b/src/tint/lang/core/type/reference.cc
index 69e0a26..572a53a 100644
--- a/src/tint/lang/core/type/reference.cc
+++ b/src/tint/lang/core/type/reference.cc
@@ -20,13 +20,13 @@
 #include "src/tint/utils/math/hash.h"
 #include "src/tint/utils/text/string_stream.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::Reference);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::Reference);
 
-namespace tint::type {
+namespace tint::core::type {
 
 Reference::Reference(core::AddressSpace address_space, const Type* subtype, core::Access access)
     : Base(Hash(tint::TypeInfo::Of<Reference>().full_hashcode, address_space, subtype, access),
-           type::Flags{}),
+           core::type::Flags{}),
       subtype_(subtype),
       address_space_(address_space),
       access_(access) {
@@ -60,4 +60,4 @@
     return ctx.dst.mgr->Get<Reference>(address_space_, ty, access_);
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/reference.h b/src/tint/lang/core/type/reference.h
index 237db67..f1f2420 100644
--- a/src/tint/lang/core/type/reference.h
+++ b/src/tint/lang/core/type/reference.h
@@ -21,7 +21,7 @@
 #include "src/tint/lang/core/address_space.h"
 #include "src/tint/lang/core/type/type.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// A reference type.
 class Reference final : public Castable<Reference, Type> {
@@ -62,6 +62,6 @@
     core::Access const access_;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_REFERENCE_H_
diff --git a/src/tint/lang/core/type/reference_test.cc b/src/tint/lang/core/type/reference_test.cc
index a5427fe..7aa1aab 100644
--- a/src/tint/lang/core/type/reference_test.cc
+++ b/src/tint/lang/core/type/reference_test.cc
@@ -16,7 +16,7 @@
 #include "src/tint/lang/core/address_space.h"
 #include "src/tint/lang/core/type/helper_test.h"
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 using ReferenceTest = TestHelper;
@@ -83,8 +83,8 @@
     auto* a =
         create<Reference>(core::AddressSpace::kStorage, create<I32>(), core::Access::kReadWrite);
 
-    type::Manager mgr;
-    type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
+    core::type::Manager mgr;
+    core::type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* ref = a->Clone(ctx);
     EXPECT_TRUE(ref->StoreType()->Is<I32>());
@@ -93,4 +93,4 @@
 }
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/sampled_texture.cc b/src/tint/lang/core/type/sampled_texture.cc
index 297287b..8865ec8 100644
--- a/src/tint/lang/core/type/sampled_texture.cc
+++ b/src/tint/lang/core/type/sampled_texture.cc
@@ -21,9 +21,9 @@
 #include "src/tint/utils/math/hash.h"
 #include "src/tint/utils/text/string_stream.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::SampledTexture);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::SampledTexture);
 
-namespace tint::type {
+namespace tint::core::type {
 
 SampledTexture::SampledTexture(TextureDimension dim, const Type* type)
     : Base(Hash(TypeInfo::Of<SampledTexture>().full_hashcode, dim, type), dim), type_(type) {
@@ -50,4 +50,4 @@
     return ctx.dst.mgr->Get<SampledTexture>(dim(), ty);
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/sampled_texture.h b/src/tint/lang/core/type/sampled_texture.h
index d22c81f..42191b5 100644
--- a/src/tint/lang/core/type/sampled_texture.h
+++ b/src/tint/lang/core/type/sampled_texture.h
@@ -20,7 +20,7 @@
 #include "src/tint/lang/core/type/texture.h"
 #include "src/tint/lang/core/type/texture_dimension.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// A sampled texture type.
 class SampledTexture final : public Castable<SampledTexture, Texture> {
@@ -52,6 +52,6 @@
     const Type* const type_;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_SAMPLED_TEXTURE_H_
diff --git a/src/tint/lang/core/type/sampled_texture_test.cc b/src/tint/lang/core/type/sampled_texture_test.cc
index 375e423..0a65228 100644
--- a/src/tint/lang/core/type/sampled_texture_test.cc
+++ b/src/tint/lang/core/type/sampled_texture_test.cc
@@ -20,7 +20,7 @@
 #include "src/tint/lang/core/type/storage_texture.h"
 #include "src/tint/lang/core/type/texture_dimension.h"
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 using SampledTextureTest = TestHelper;
@@ -89,8 +89,8 @@
 TEST_F(SampledTextureTest, Clone) {
     auto* a = create<SampledTexture>(TextureDimension::kCube, create<F32>());
 
-    type::Manager mgr;
-    type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
+    core::type::Manager mgr;
+    core::type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* mt = a->Clone(ctx);
     EXPECT_EQ(mt->dim(), TextureDimension::kCube);
@@ -98,4 +98,4 @@
 }
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/sampler.cc b/src/tint/lang/core/type/sampler.cc
index ffdaaa2..0ceaeed 100644
--- a/src/tint/lang/core/type/sampler.cc
+++ b/src/tint/lang/core/type/sampler.cc
@@ -17,12 +17,13 @@
 #include "src/tint/lang/core/type/manager.h"
 #include "src/tint/utils/math/hash.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::Sampler);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::Sampler);
 
-namespace tint::type {
+namespace tint::core::type {
 
 Sampler::Sampler(SamplerKind kind)
-    : Base(Hash(tint::TypeInfo::Of<Sampler>().full_hashcode, kind), type::Flags{}), kind_(kind) {}
+    : Base(Hash(tint::TypeInfo::Of<Sampler>().full_hashcode, kind), core::type::Flags{}),
+      kind_(kind) {}
 
 Sampler::~Sampler() = default;
 
@@ -41,4 +42,4 @@
     return ctx.dst.mgr->Get<Sampler>(kind_);
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/sampler.h b/src/tint/lang/core/type/sampler.h
index 9946731..9487152 100644
--- a/src/tint/lang/core/type/sampler.h
+++ b/src/tint/lang/core/type/sampler.h
@@ -20,7 +20,7 @@
 #include "src/tint/lang/core/type/sampler_kind.h"
 #include "src/tint/lang/core/type/type.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// A sampler type.
 class Sampler final : public Castable<Sampler, Type> {
@@ -54,6 +54,6 @@
     SamplerKind const kind_;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_SAMPLER_H_
diff --git a/src/tint/lang/core/type/sampler_kind.cc b/src/tint/lang/core/type/sampler_kind.cc
index 17e950c..5019ba9 100644
--- a/src/tint/lang/core/type/sampler_kind.cc
+++ b/src/tint/lang/core/type/sampler_kind.cc
@@ -14,7 +14,7 @@
 
 #include "src/tint/lang/core/type/sampler_kind.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 std::string_view ToString(SamplerKind kind) {
     switch (kind) {
@@ -26,4 +26,4 @@
     return "<unknown>";
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/sampler_kind.h b/src/tint/lang/core/type/sampler_kind.h
index fed81c2..5b58e13 100644
--- a/src/tint/lang/core/type/sampler_kind.h
+++ b/src/tint/lang/core/type/sampler_kind.h
@@ -18,7 +18,7 @@
 #include "src/tint/utils/text/string_stream.h"
 #include "src/tint/utils/traits/traits.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// The different kinds of samplers
 enum class SamplerKind {
@@ -40,6 +40,6 @@
     return out << ToString(kind);
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_SAMPLER_KIND_H_
diff --git a/src/tint/lang/core/type/sampler_test.cc b/src/tint/lang/core/type/sampler_test.cc
index 7b9657f..fb51867 100644
--- a/src/tint/lang/core/type/sampler_test.cc
+++ b/src/tint/lang/core/type/sampler_test.cc
@@ -16,7 +16,7 @@
 #include "src/tint/lang/core/type/helper_test.h"
 #include "src/tint/lang/core/type/texture.h"
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 using SamplerTest = TestHelper;
@@ -66,12 +66,12 @@
 TEST_F(SamplerTest, Clone) {
     auto* a = create<Sampler>(SamplerKind::kSampler);
 
-    type::Manager mgr;
-    type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
+    core::type::Manager mgr;
+    core::type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* mt = a->Clone(ctx);
     EXPECT_EQ(mt->kind(), SamplerKind::kSampler);
 }
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/scalar.cc b/src/tint/lang/core/type/scalar.cc
index b6b9650..1536e21 100644
--- a/src/tint/lang/core/type/scalar.cc
+++ b/src/tint/lang/core/type/scalar.cc
@@ -14,11 +14,11 @@
 
 #include "src/tint/lang/core/type/scalar.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::Scalar);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::Scalar);
 
-namespace tint::type {
+namespace tint::core::type {
 
-Scalar::Scalar(size_t hash, type::Flags flags) : Base(hash, flags) {}
+Scalar::Scalar(size_t hash, core::type::Flags flags) : Base(hash, flags) {}
 
 Scalar::~Scalar() = default;
 
@@ -26,4 +26,4 @@
     return &other.TypeInfo() == &TypeInfo();
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/scalar.h b/src/tint/lang/core/type/scalar.h
index bbcd046..ac6d81b 100644
--- a/src/tint/lang/core/type/scalar.h
+++ b/src/tint/lang/core/type/scalar.h
@@ -17,7 +17,7 @@
 
 #include "src/tint/lang/core/type/type.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// Base class for all scalar types
 /// @see https://www.w3.org/TR/WGSL/#scalar-types
@@ -34,9 +34,9 @@
     /// Constructor
     /// @param hash the immutable hash for the node
     /// @param flags the flags of this type
-    Scalar(size_t hash, type::Flags flags);
+    Scalar(size_t hash, core::type::Flags flags);
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_SCALAR_H_
diff --git a/src/tint/lang/core/type/storage_texture.cc b/src/tint/lang/core/type/storage_texture.cc
index 0e766c5..f1d7204 100644
--- a/src/tint/lang/core/type/storage_texture.cc
+++ b/src/tint/lang/core/type/storage_texture.cc
@@ -21,9 +21,9 @@
 #include "src/tint/utils/math/hash.h"
 #include "src/tint/utils/text/string_stream.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::StorageTexture);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::StorageTexture);
 
-namespace tint::type {
+namespace tint::core::type {
 
 StorageTexture::StorageTexture(TextureDimension dim,
                                core::TexelFormat format,
@@ -89,4 +89,4 @@
     return ctx.dst.mgr->Get<StorageTexture>(dim(), texel_format_, access_, ty);
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/storage_texture.h b/src/tint/lang/core/type/storage_texture.h
index 550973d..491e7fa 100644
--- a/src/tint/lang/core/type/storage_texture.h
+++ b/src/tint/lang/core/type/storage_texture.h
@@ -23,11 +23,11 @@
 #include "src/tint/lang/core/type/texture_dimension.h"
 
 // Forward declarations
-namespace tint::type {
+namespace tint::core::type {
 class Manager;
-}  // namespace tint::type
+}  // namespace tint::core::type
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// A storage texture type.
 class StorageTexture final : public Castable<StorageTexture, Texture> {
@@ -77,6 +77,6 @@
     Type* const subtype_;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_STORAGE_TEXTURE_H_
diff --git a/src/tint/lang/core/type/storage_texture_test.cc b/src/tint/lang/core/type/storage_texture_test.cc
index 35a3b12..45f7776 100644
--- a/src/tint/lang/core/type/storage_texture_test.cc
+++ b/src/tint/lang/core/type/storage_texture_test.cc
@@ -20,7 +20,7 @@
 #include "src/tint/lang/core/type/sampled_texture.h"
 #include "src/tint/lang/core/type/texture_dimension.h"
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 struct StorageTextureTest : public TestHelper {
@@ -137,8 +137,8 @@
     auto* a =
         Create(TextureDimension::kCube, core::TexelFormat::kRgba32Float, core::Access::kReadWrite);
 
-    type::Manager mgr;
-    type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
+    core::type::Manager mgr;
+    core::type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* mt = a->Clone(ctx);
     EXPECT_EQ(mt->dim(), TextureDimension::kCube);
@@ -147,4 +147,4 @@
 }
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/struct.cc b/src/tint/lang/core/type/struct.cc
index 7792923..142196e 100644
--- a/src/tint/lang/core/type/struct.cc
+++ b/src/tint/lang/core/type/struct.cc
@@ -24,14 +24,14 @@
 #include "src/tint/utils/symbol/symbol_table.h"
 #include "src/tint/utils/text/string_stream.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::Struct);
-TINT_INSTANTIATE_TYPEINFO(tint::type::StructMember);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::Struct);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::StructMember);
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
-type::Flags FlagsFrom(VectorRef<const StructMember*> members) {
-    type::Flags flags{
+core::type::Flags FlagsFrom(VectorRef<const StructMember*> members) {
+    core::type::Flags flags{
         Flag::kConstructable,
         Flag::kCreationFixedFootprint,
         Flag::kFixedFootprint,
@@ -180,7 +180,7 @@
 }
 
 StructMember::StructMember(Symbol name,
-                           const type::Type* type,
+                           const core::type::Type* type,
                            uint32_t index,
                            uint32_t offset,
                            uint32_t align,
@@ -202,4 +202,4 @@
     return ctx.dst.mgr->Get<StructMember>(sym, ty, index_, offset_, align_, size_, attributes_);
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/struct.h b/src/tint/lang/core/type/struct.h
index 4bff0da..e19693f 100644
--- a/src/tint/lang/core/type/struct.h
+++ b/src/tint/lang/core/type/struct.h
@@ -30,11 +30,11 @@
 #include "src/tint/utils/symbol/symbol.h"
 
 // Forward declarations
-namespace tint::type {
+namespace tint::core::type {
 class StructMember;
-}  // namespace tint::type
+}  // namespace tint::core::type
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// Metadata to capture how a structure is used in a shader module.
 enum class PipelineStageUsage {
@@ -109,7 +109,7 @@
     uint32_t SizeNoPadding() const { return size_no_padding_; }
 
     /// @returns the structure flags
-    type::StructFlags StructFlags() const { return struct_flags_; }
+    core::type::StructFlags StructFlags() const { return struct_flags_; }
 
     /// Set a structure flag.
     /// @param flag the flag to set
@@ -181,7 +181,7 @@
     const uint32_t align_;
     const uint32_t size_;
     const uint32_t size_no_padding_;
-    type::StructFlags struct_flags_;
+    core::type::StructFlags struct_flags_;
     std::unordered_set<core::AddressSpace> address_space_usage_;
     std::unordered_set<PipelineStageUsage> pipeline_stage_uses_;
     tint::Vector<const Struct*, 2> concrete_types_;
@@ -213,7 +213,7 @@
     /// @param size the byte size of the member
     /// @param attributes the optional attributes
     StructMember(Symbol name,
-                 const type::Type* type,
+                 const core::type::Type* type,
                  uint32_t index,
                  uint32_t offset,
                  uint32_t align,
@@ -231,10 +231,10 @@
     void SetStruct(const Struct* s) { struct_ = s; }
 
     /// @returns the structure that owns this member
-    const type::Struct* Struct() const { return struct_; }
+    const core::type::Struct* Struct() const { return struct_; }
 
     /// @returns the type of the member
-    const type::Type* Type() const { return type_; }
+    const core::type::Type* Type() const { return type_; }
 
     /// @returns the member index
     uint32_t Index() const { return index_; }
@@ -261,8 +261,8 @@
 
   private:
     const Symbol name_;
-    const type::Struct* struct_;
-    const type::Type* type_;
+    const core::type::Struct* struct_;
+    const core::type::Type* type_;
     const uint32_t index_;
     const uint32_t offset_;
     const uint32_t align_;
@@ -270,6 +270,6 @@
     StructMemberAttributes attributes_;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_STRUCT_H_
diff --git a/src/tint/lang/core/type/struct_test.cc b/src/tint/lang/core/type/struct_test.cc
index 7a743fd..b6059a1 100644
--- a/src/tint/lang/core/type/struct_test.cc
+++ b/src/tint/lang/core/type/struct_test.cc
@@ -16,7 +16,7 @@
 #include "src/tint/lang/core/type/helper_test.h"
 #include "src/tint/lang/core/type/texture.h"
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 using namespace tint::number_suffixes;  // NOLINT
@@ -205,7 +205,7 @@
 }
 
 TEST_F(TypeStructTest, Clone) {
-    type::StructMemberAttributes attrs_location_2;
+    core::type::StructMemberAttributes attrs_location_2;
     attrs_location_2.location = 2;
 
     auto* s = create<Struct>(
@@ -213,14 +213,14 @@
         tint::Vector{create<StructMember>(Sym("b"), create<Vector>(create<F32>(), 3u), 0u, 0u, 16u,
                                           12u, attrs_location_2),
                      create<StructMember>(Sym("a"), create<I32>(), 1u, 16u, 4u, 4u,
-                                          type::StructMemberAttributes{})},
+                                          core::type::StructMemberAttributes{})},
         4u /* align */, 8u /* size */, 16u /* size_no_padding */);
 
     GenerationID id;
     SymbolTable new_st{id};
 
-    type::Manager mgr;
-    type::CloneContext ctx{{&Symbols()}, {&new_st, &mgr}};
+    core::type::Manager mgr;
+    core::type::CloneContext ctx{{&Symbols()}, {&new_st, &mgr}};
 
     auto* st = s->Clone(ctx);
 
@@ -250,4 +250,4 @@
 }
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/texture.cc b/src/tint/lang/core/type/texture.cc
index e6d711b..7240bd6 100644
--- a/src/tint/lang/core/type/texture.cc
+++ b/src/tint/lang/core/type/texture.cc
@@ -14,44 +14,44 @@
 
 #include "src/tint/lang/core/type/texture.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::Texture);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::Texture);
 
-namespace tint::type {
+namespace tint::core::type {
 
-Texture::Texture(size_t hash, TextureDimension dim) : Base(hash, type::Flags{}), dim_(dim) {}
+Texture::Texture(size_t hash, TextureDimension dim) : Base(hash, core::type::Flags{}), dim_(dim) {}
 
 Texture::~Texture() = default;
 
-bool IsTextureArray(type::TextureDimension dim) {
+bool IsTextureArray(core::type::TextureDimension dim) {
     switch (dim) {
-        case type::TextureDimension::k2dArray:
-        case type::TextureDimension::kCubeArray:
+        case core::type::TextureDimension::k2dArray:
+        case core::type::TextureDimension::kCubeArray:
             return true;
-        case type::TextureDimension::k2d:
-        case type::TextureDimension::kNone:
-        case type::TextureDimension::k1d:
-        case type::TextureDimension::k3d:
-        case type::TextureDimension::kCube:
+        case core::type::TextureDimension::k2d:
+        case core::type::TextureDimension::kNone:
+        case core::type::TextureDimension::k1d:
+        case core::type::TextureDimension::k3d:
+        case core::type::TextureDimension::kCube:
             return false;
     }
     return false;
 }
 
-int NumCoordinateAxes(type::TextureDimension dim) {
+int NumCoordinateAxes(core::type::TextureDimension dim) {
     switch (dim) {
-        case type::TextureDimension::kNone:
+        case core::type::TextureDimension::kNone:
             return 0;
-        case type::TextureDimension::k1d:
+        case core::type::TextureDimension::k1d:
             return 1;
-        case type::TextureDimension::k2d:
-        case type::TextureDimension::k2dArray:
+        case core::type::TextureDimension::k2d:
+        case core::type::TextureDimension::k2dArray:
             return 2;
-        case type::TextureDimension::k3d:
-        case type::TextureDimension::kCube:
-        case type::TextureDimension::kCubeArray:
+        case core::type::TextureDimension::k3d:
+        case core::type::TextureDimension::kCube:
+        case core::type::TextureDimension::kCubeArray:
             return 3;
     }
     return 0;
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/texture.h b/src/tint/lang/core/type/texture.h
index 792f9be..e94ef81 100644
--- a/src/tint/lang/core/type/texture.h
+++ b/src/tint/lang/core/type/texture.h
@@ -18,7 +18,7 @@
 #include "src/tint/lang/core/type/texture_dimension.h"
 #include "src/tint/lang/core/type/type.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// A texture type.
 class Texture : public Castable<Texture, Type> {
@@ -39,7 +39,7 @@
 
 /// @param dim the type::TextureDimension to query
 /// @return true if the given type::TextureDimension is an array texture
-bool IsTextureArray(type::TextureDimension dim);
+bool IsTextureArray(core::type::TextureDimension dim);
 
 /// Returns the number of axes in the coordinate used for accessing
 /// the texture, where an access is one of: sampling, fetching, load,
@@ -53,8 +53,8 @@
 /// size, representing the (x,y) size of each cube face, in texels.
 /// @param dim the type::TextureDimension to query
 /// @return number of dimensions in a coordinate for the dimensionality
-int NumCoordinateAxes(type::TextureDimension dim);
+int NumCoordinateAxes(core::type::TextureDimension dim);
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_TEXTURE_H_
diff --git a/src/tint/lang/core/type/texture_dimension.cc b/src/tint/lang/core/type/texture_dimension.cc
index dc2ce79..a322ec7 100644
--- a/src/tint/lang/core/type/texture_dimension.cc
+++ b/src/tint/lang/core/type/texture_dimension.cc
@@ -14,26 +14,26 @@
 
 #include "src/tint/lang/core/type/texture_dimension.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
-std::string_view ToString(type::TextureDimension dim) {
+std::string_view ToString(core::type::TextureDimension dim) {
     switch (dim) {
-        case type::TextureDimension::kNone:
+        case core::type::TextureDimension::kNone:
             return "None";
-        case type::TextureDimension::k1d:
+        case core::type::TextureDimension::k1d:
             return "1d";
-        case type::TextureDimension::k2d:
+        case core::type::TextureDimension::k2d:
             return "2d";
-        case type::TextureDimension::k2dArray:
+        case core::type::TextureDimension::k2dArray:
             return "2d_array";
-        case type::TextureDimension::k3d:
+        case core::type::TextureDimension::k3d:
             return "3d";
-        case type::TextureDimension::kCube:
+        case core::type::TextureDimension::kCube:
             return "cube";
-        case type::TextureDimension::kCubeArray:
+        case core::type::TextureDimension::kCubeArray:
             return "cube_array";
     }
     return "<unknown>";
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/texture_dimension.h b/src/tint/lang/core/type/texture_dimension.h
index 1d5fd44..f77c796 100644
--- a/src/tint/lang/core/type/texture_dimension.h
+++ b/src/tint/lang/core/type/texture_dimension.h
@@ -18,7 +18,7 @@
 #include "src/tint/utils/text/string_stream.h"
 #include "src/tint/utils/traits/traits.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// The dimensionality of the texture
 enum class TextureDimension {
@@ -46,10 +46,10 @@
 /// @param dim the type::TextureDimension
 /// @return the stream so calls can be chained
 template <typename STREAM, typename = traits::EnableIfIsOStream<STREAM>>
-auto& operator<<(STREAM& out, type::TextureDimension dim) {
+auto& operator<<(STREAM& out, core::type::TextureDimension dim) {
     return out << ToString(dim);
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_TEXTURE_DIMENSION_H_
diff --git a/src/tint/lang/core/type/texture_test.cc b/src/tint/lang/core/type/texture_test.cc
index 55aa370..70f5ccf 100644
--- a/src/tint/lang/core/type/texture_test.cc
+++ b/src/tint/lang/core/type/texture_test.cc
@@ -17,7 +17,7 @@
 #include "src/tint/lang/core/type/helper_test.h"
 #include "src/tint/lang/core/type/sampled_texture.h"
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 using TextureTypeDimTest = TestParamHelper<TextureDimension>;
@@ -41,4 +41,4 @@
                                            TextureDimension::kCubeArray));
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/type.cc b/src/tint/lang/core/type/type.cc
index 3c5185f..9b99c5ad 100644
--- a/src/tint/lang/core/type/type.cc
+++ b/src/tint/lang/core/type/type.cc
@@ -31,11 +31,11 @@
 #include "src/tint/lang/core/type/vector.h"
 #include "src/tint/utils/rtti/switch.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::Type);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::Type);
 
-namespace tint::type {
+namespace tint::core::type {
 
-Type::Type(size_t hash, type::Flags flags) : Base(hash), flags_(flags) {
+Type::Type(size_t hash, core::type::Flags flags) : Base(hash), flags_(flags) {
     if (IsConstructible()) {
         TINT_ASSERT(HasCreationFixedFootprint());
     }
@@ -149,15 +149,15 @@
 }
 
 bool Type::is_numeric_vector() const {
-    return Is([](const Vector* v) { return v->type()->Is<type::NumericScalar>(); });
+    return Is([](const Vector* v) { return v->type()->Is<core::type::NumericScalar>(); });
 }
 
 bool Type::is_scalar_vector() const {
-    return Is([](const Vector* v) { return v->type()->Is<type::Scalar>(); });
+    return Is([](const Vector* v) { return v->type()->Is<core::type::Scalar>(); });
 }
 
 bool Type::is_numeric_scalar_or_vector() const {
-    return Is<type::NumericScalar>() || is_numeric_vector();
+    return Is<core::type::NumericScalar>() || is_numeric_vector();
 }
 
 bool Type::is_handle() const {
@@ -284,4 +284,4 @@
     return common;
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/type.h b/src/tint/lang/core/type/type.h
index 2c9acd8..bfeb9b6 100644
--- a/src/tint/lang/core/type/type.h
+++ b/src/tint/lang/core/type/type.h
@@ -28,11 +28,11 @@
 class ProgramBuilder;
 class SymbolTable;
 }  // namespace tint
-namespace tint::type {
+namespace tint::core::type {
 class Type;
-}  // namespace tint::type
+}  // namespace tint::core::type
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// Flag is an enumerator of type flag bits, used by Flags.
 enum Flag {
@@ -97,7 +97,7 @@
     virtual Type* Clone(CloneContext& ctx) const = 0;
 
     /// @returns the flags on the type
-    type::Flags Flags() { return flags_; }
+    core::type::Flags Flags() { return flags_; }
 
     /// @returns true if type is constructable
     /// https://gpuweb.github.io/gpuweb/wgsl/#constructible-types
@@ -228,31 +228,31 @@
     /// Constructor
     /// @param hash the immutable hash for the node
     /// @param flags the flags of this type
-    Type(size_t hash, type::Flags flags);
+    Type(size_t hash, core::type::Flags flags);
 
     /// The flags of this type.
-    const type::Flags flags_;
+    const core::type::Flags flags_;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 namespace std {
 
-/// std::hash specialization for tint::type::Type
+/// std::hash specialization for tint::core::type::Type
 template <>
-struct hash<tint::type::Type> {
+struct hash<tint::core::type::Type> {
     /// @param type the type to obtain a hash from
     /// @returns the hash of the type
-    size_t operator()(const tint::type::Type& type) const { return type.unique_hash; }
+    size_t operator()(const tint::core::type::Type& type) const { return type.unique_hash; }
 };
 
-/// std::equal_to specialization for tint::type::Type
+/// std::equal_to specialization for tint::core::type::Type
 template <>
-struct equal_to<tint::type::Type> {
+struct equal_to<tint::core::type::Type> {
     /// @param a the first type to compare
     /// @param b the second type to compare
     /// @returns true if the two types are equal
-    bool operator()(const tint::type::Type& a, const tint::type::Type& b) const {
+    bool operator()(const tint::core::type::Type& a, const tint::core::type::Type& b) const {
         return a.Equals(b);
     }
 };
diff --git a/src/tint/lang/core/type/type_test.cc b/src/tint/lang/core/type/type_test.cc
index 900fddd..25c0403 100644
--- a/src/tint/lang/core/type/type_test.cc
+++ b/src/tint/lang/core/type/type_test.cc
@@ -19,7 +19,7 @@
 #include "src/tint/lang/core/type/helper_test.h"
 #include "src/tint/lang/core/type/reference.h"
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 struct TypeTest : public TestHelper {
@@ -45,34 +45,36 @@
     const Matrix* mat4x3_af = create<Matrix>(vec3_af, 4u);
     const Reference* ref_u32 =
         create<Reference>(core::AddressSpace::kPrivate, u32, core::Access::kReadWrite);
-    const Struct* str_f32 = create<Struct>(Sym("str_f32"),
-                                           tint::Vector{
-                                               create<StructMember>(
-                                                   /* name */ Sym("x"),
-                                                   /* type */ f32,
-                                                   /* index */ 0u,
-                                                   /* offset */ 0u,
-                                                   /* align */ 4u,
-                                                   /* size */ 4u,
-                                                   /* attributes */ type::StructMemberAttributes{}),
-                                           },
-                                           /* align*/ 4u,
-                                           /* size*/ 4u,
-                                           /* size_no_padding*/ 4u);
-    const Struct* str_f16 = create<Struct>(Sym("str_f16"),
-                                           tint::Vector{
-                                               create<StructMember>(
-                                                   /* name */ Sym("x"),
-                                                   /* type */ f16,
-                                                   /* index */ 0u,
-                                                   /* offset */ 0u,
-                                                   /* align */ 4u,
-                                                   /* size */ 4u,
-                                                   /* attributes */ type::StructMemberAttributes{}),
-                                           },
-                                           /* align*/ 4u,
-                                           /* size*/ 4u,
-                                           /* size_no_padding*/ 4u);
+    const Struct* str_f32 =
+        create<Struct>(Sym("str_f32"),
+                       tint::Vector{
+                           create<StructMember>(
+                               /* name */ Sym("x"),
+                               /* type */ f32,
+                               /* index */ 0u,
+                               /* offset */ 0u,
+                               /* align */ 4u,
+                               /* size */ 4u,
+                               /* attributes */ core::type::StructMemberAttributes{}),
+                       },
+                       /* align*/ 4u,
+                       /* size*/ 4u,
+                       /* size_no_padding*/ 4u);
+    const Struct* str_f16 =
+        create<Struct>(Sym("str_f16"),
+                       tint::Vector{
+                           create<StructMember>(
+                               /* name */ Sym("x"),
+                               /* type */ f16,
+                               /* index */ 0u,
+                               /* offset */ 0u,
+                               /* align */ 4u,
+                               /* size */ 4u,
+                               /* attributes */ core::type::StructMemberAttributes{}),
+                       },
+                       /* align*/ 4u,
+                       /* size*/ 4u,
+                       /* size_no_padding*/ 4u);
     Struct* str_af = create<Struct>(Sym("str_af"),
                                     tint::Vector{
                                         create<StructMember>(
@@ -82,7 +84,7 @@
                                             /* offset */ 0u,
                                             /* align */ 4u,
                                             /* size */ 4u,
-                                            /* attributes */ type::StructMemberAttributes{}),
+                                            /* attributes */ core::type::StructMemberAttributes{}),
                                     },
                                     /* align*/ 4u,
                                     /* size*/ 4u,
@@ -546,4 +548,4 @@
 }
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/u32.cc b/src/tint/lang/core/type/u32.cc
index 37cf91d..c548222 100644
--- a/src/tint/lang/core/type/u32.cc
+++ b/src/tint/lang/core/type/u32.cc
@@ -16,13 +16,13 @@
 
 #include "src/tint/lang/core/type/manager.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::U32);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::U32);
 
-namespace tint::type {
+namespace tint::core::type {
 
 U32::U32()
     : Base(static_cast<size_t>(tint::TypeInfo::Of<U32>().full_hashcode),
-           type::Flags{
+           core::type::Flags{
                Flag::kConstructable,
                Flag::kCreationFixedFootprint,
                Flag::kFixedFootprint,
@@ -46,4 +46,4 @@
     return ctx.dst.mgr->Get<U32>();
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/u32.h b/src/tint/lang/core/type/u32.h
index 5498228..4013fed 100644
--- a/src/tint/lang/core/type/u32.h
+++ b/src/tint/lang/core/type/u32.h
@@ -19,7 +19,7 @@
 
 #include "src/tint/lang/core/type/numeric_scalar.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// A unsigned int 32 type.
 class U32 final : public Castable<U32, NumericScalar> {
@@ -45,6 +45,6 @@
     U32* Clone(CloneContext& ctx) const override;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_U32_H_
diff --git a/src/tint/lang/core/type/u32_test.cc b/src/tint/lang/core/type/u32_test.cc
index 54e9898..af58452 100644
--- a/src/tint/lang/core/type/u32_test.cc
+++ b/src/tint/lang/core/type/u32_test.cc
@@ -15,7 +15,7 @@
 #include "src/tint/lang/core/type/helper_test.h"
 #include "src/tint/lang/core/type/texture.h"
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 using U32Test = TestHelper;
@@ -47,12 +47,12 @@
 TEST_F(U32Test, Clone) {
     auto* a = create<U32>();
 
-    type::Manager mgr;
-    type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
+    core::type::Manager mgr;
+    core::type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* b = a->Clone(ctx);
     ASSERT_TRUE(b->Is<U32>());
 }
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/unique_node.cc b/src/tint/lang/core/type/unique_node.cc
index 1de2ec9..7a4aef2 100644
--- a/src/tint/lang/core/type/unique_node.cc
+++ b/src/tint/lang/core/type/unique_node.cc
@@ -14,10 +14,10 @@
 
 #include "src/tint/lang/core/type/unique_node.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::UniqueNode);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::UniqueNode);
 
-namespace tint::type {
+namespace tint::core::type {
 
 UniqueNode::~UniqueNode() = default;
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/unique_node.h b/src/tint/lang/core/type/unique_node.h
index c0042a5..bcf136b 100644
--- a/src/tint/lang/core/type/unique_node.h
+++ b/src/tint/lang/core/type/unique_node.h
@@ -19,7 +19,7 @@
 
 #include "src/tint/lang/core/type/node.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// UniqueNode is the base class for objects that are de-duplicated by the Manager.
 /// Deduplication is achieved by comparing a temporary object to the set of existing objects, using
@@ -42,25 +42,26 @@
     const size_t unique_hash;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 namespace std {
 
-/// std::hash specialization for tint::type::UniqueNode
+/// std::hash specialization for tint::core::type::UniqueNode
 template <>
-struct hash<tint::type::UniqueNode> {
+struct hash<tint::core::type::UniqueNode> {
     /// @param node the unique node to obtain a hash from
     /// @returns the hash of the node
-    size_t operator()(const tint::type::UniqueNode& node) const { return node.unique_hash; }
+    size_t operator()(const tint::core::type::UniqueNode& node) const { return node.unique_hash; }
 };
 
-/// std::equal_to specialization for tint::type::UniqueNode
+/// std::equal_to specialization for tint::core::type::UniqueNode
 template <>
-struct equal_to<tint::type::UniqueNode> {
+struct equal_to<tint::core::type::UniqueNode> {
     /// @param a the first unique node to compare
     /// @param b the second unique node to compare
     /// @returns true if the two nodes are equal
-    bool operator()(const tint::type::UniqueNode& a, const tint::type::UniqueNode& b) const {
+    bool operator()(const tint::core::type::UniqueNode& a,
+                    const tint::core::type::UniqueNode& b) const {
         return &a == &b || a.Equals(b);
     }
 };
diff --git a/src/tint/lang/core/type/vector.cc b/src/tint/lang/core/type/vector.cc
index 5e7d865..1bde999 100644
--- a/src/tint/lang/core/type/vector.cc
+++ b/src/tint/lang/core/type/vector.cc
@@ -20,13 +20,13 @@
 #include "src/tint/utils/math/hash.h"
 #include "src/tint/utils/text/string_stream.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::Vector);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::Vector);
 
-namespace tint::type {
+namespace tint::core::type {
 
 Vector::Vector(Type const* subtype, uint32_t width, bool packed /* = false */)
     : Base(Hash(tint::TypeInfo::Of<Vector>().full_hashcode, width, subtype, packed),
-           type::Flags{
+           core::type::Flags{
                Flag::kConstructable,
                Flag::kCreationFixedFootprint,
                Flag::kFixedFootprint,
@@ -86,4 +86,4 @@
     return index < width_ ? subtype_ : nullptr;
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/vector.h b/src/tint/lang/core/type/vector.h
index ce92cef..2be8499 100644
--- a/src/tint/lang/core/type/vector.h
+++ b/src/tint/lang/core/type/vector.h
@@ -19,7 +19,7 @@
 
 #include "src/tint/lang/core/type/type.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// A vector type.
 class Vector : public Castable<Vector, Type> {
@@ -81,6 +81,6 @@
     const bool packed_;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_VECTOR_H_
diff --git a/src/tint/lang/core/type/vector_test.cc b/src/tint/lang/core/type/vector_test.cc
index 85e28d1..3f73cec 100644
--- a/src/tint/lang/core/type/vector_test.cc
+++ b/src/tint/lang/core/type/vector_test.cc
@@ -15,7 +15,7 @@
 #include "src/tint/lang/core/type/helper_test.h"
 #include "src/tint/lang/core/type/texture.h"
 
-namespace tint::type {
+namespace tint::core::type {
 namespace {
 
 using VectorTest = TestHelper;
@@ -83,8 +83,8 @@
 TEST_F(VectorTest, Clone) {
     auto* a = create<Vector>(create<I32>(), 2u);
 
-    type::Manager mgr;
-    type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
+    core::type::Manager mgr;
+    core::type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* vec = a->Clone(ctx);
     EXPECT_TRUE(vec->type()->Is<I32>());
@@ -95,8 +95,8 @@
 TEST_F(VectorTest, Clone_Packed) {
     auto* a = create<Vector>(create<I32>(), 3u, true);
 
-    type::Manager mgr;
-    type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
+    core::type::Manager mgr;
+    core::type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* vec = a->Clone(ctx);
     EXPECT_TRUE(vec->type()->Is<I32>());
@@ -105,4 +105,4 @@
 }
 
 }  // namespace
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/void.cc b/src/tint/lang/core/type/void.cc
index 69c9a44..a829c17 100644
--- a/src/tint/lang/core/type/void.cc
+++ b/src/tint/lang/core/type/void.cc
@@ -16,11 +16,12 @@
 
 #include "src/tint/lang/core/type/manager.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::type::Void);
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::Void);
 
-namespace tint::type {
+namespace tint::core::type {
 
-Void::Void() : Base(static_cast<size_t>(tint::TypeInfo::Of<Void>().full_hashcode), type::Flags{}) {}
+Void::Void()
+    : Base(static_cast<size_t>(tint::TypeInfo::Of<Void>().full_hashcode), core::type::Flags{}) {}
 
 Void::~Void() = default;
 
@@ -36,4 +37,4 @@
     return ctx.dst.mgr->Get<Void>();
 }
 
-}  // namespace tint::type
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/void.h b/src/tint/lang/core/type/void.h
index 5ee7146..05cb495 100644
--- a/src/tint/lang/core/type/void.h
+++ b/src/tint/lang/core/type/void.h
@@ -19,7 +19,7 @@
 
 #include "src/tint/lang/core/type/type.h"
 
-namespace tint::type {
+namespace tint::core::type {
 
 /// A void type
 class Void final : public Castable<Void, Type> {
@@ -43,6 +43,6 @@
     Void* Clone(CloneContext& ctx) const override;
 };
 
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 #endif  // SRC_TINT_LANG_CORE_TYPE_VOID_H_
diff --git a/src/tint/lang/glsl/writer/ast_printer/ast_printer.cc b/src/tint/lang/glsl/writer/ast_printer/ast_printer.cc
index 50778e3..268ea33 100644
--- a/src/tint/lang/glsl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/glsl/writer/ast_printer/ast_printer.cc
@@ -285,8 +285,8 @@
             [&](const ast::Struct* str) {
                 auto* sem = builder_.Sem().Get(str);
                 bool has_rt_arr = false;
-                if (auto* arr = sem->Members().Back()->Type()->As<type::Array>()) {
-                    has_rt_arr = arr->Count()->Is<type::RuntimeArrayCount>();
+                if (auto* arr = sem->Members().Back()->Type()->As<core::type::Array>()) {
+                    has_rt_arr = arr->Count()->Is<core::type::RuntimeArrayCount>();
                 }
                 bool is_block =
                     ast::HasAttribute<ast::transform::AddBlockAttribute::BlockAttribute>(
@@ -372,10 +372,10 @@
     }
 
     // Use packFloat2x16 and unpackFloat2x16 for f16 types.
-    if (src_type->DeepestElement()->Is<type::F16>()) {
+    if (src_type->DeepestElement()->Is<core::type::F16>()) {
         // Source type must be vec2<f16> or vec4<f16>, since type f16 and vec3<f16> can only have
         // identity bitcast.
-        auto* src_vec = src_type->As<type::Vector>();
+        auto* src_vec = src_type->As<core::type::Vector>();
         TINT_ASSERT(src_vec);
         TINT_ASSERT(((src_vec->Width() == 2u) || (src_vec->Width() == 4u)));
         std::string fn = GetOrCreate(
@@ -427,9 +427,9 @@
             ScopedParen sp(out);
             EmitExpression(out, expr->expr);
         }
-    } else if (dst_type->DeepestElement()->Is<type::F16>()) {
+    } else if (dst_type->DeepestElement()->Is<core::type::F16>()) {
         // Destination type must be vec2<f16> or vec4<f16>.
-        auto* dst_vec = dst_type->As<type::Vector>();
+        auto* dst_vec = dst_type->As<core::type::Vector>();
         TINT_ASSERT(dst_vec);
         TINT_ASSERT(((dst_vec->Width() == 2u) || (dst_vec->Width() == 4u)));
         std::string fn = GetOrCreate(
@@ -451,10 +451,11 @@
                 }
                 {
                     ScopedIndent si(&b);
-                    if (auto src_vec = src_type->As<type::Vector>()) {
+                    if (auto src_vec = src_type->As<core::type::Vector>()) {
                         // Source vector type must be vec2<f32/i32/u32>, destination type vec4<f16>.
-                        TINT_ASSERT((
-                            src_vec->DeepestElement()->IsAnyOf<type::I32, type::U32, type::F32>()));
+                        TINT_ASSERT(
+                            (src_vec->DeepestElement()
+                                 ->IsAnyOf<core::type::I32, core::type::U32, core::type::F32>()));
                         TINT_ASSERT((src_vec->Width() == 2u));
                         {
                             auto s = Line(&b);
@@ -471,7 +472,9 @@
                         Line(&b) << "return f16vec4(v_xy.x, v_xy.y, v_zw.x, v_zw.y);";
                     } else {
                         // Source scalar type must be f32/i32/u32, destination type vec2<f16>.
-                        TINT_ASSERT((src_type->IsAnyOf<type::I32, type::U32, type::F32>()));
+                        TINT_ASSERT(
+                            (src_type
+                                 ->IsAnyOf<core::type::I32, core::type::U32, core::type::F32>()));
                         {
                             auto s = Line(&b);
                             s << "uint r = ";
@@ -633,7 +636,7 @@
 }
 
 void ASTPrinter::EmitBinary(StringStream& out, const ast::BinaryExpression* expr) {
-    if (IsRelational(expr->op) && !TypeOf(expr->lhs)->UnwrapRef()->Is<type::Scalar>()) {
+    if (IsRelational(expr->op) && !TypeOf(expr->lhs)->UnwrapRef()->Is<core::type::Scalar>()) {
         EmitVectorRelational(out, expr);
         return;
     }
@@ -843,7 +846,7 @@
         EmitExpression(out, expr->args[0]);
     } else if ((builtin->Type() == core::Function::kAny ||
                 builtin->Type() == core::Function::kAll) &&
-               TypeOf(expr->args[0])->UnwrapRef()->Is<type::Scalar>()) {
+               TypeOf(expr->args[0])->UnwrapRef()->Is<core::type::Scalar>()) {
         // GLSL does not support any() or all() on scalar arguments. It's a no-op.
         EmitExpression(out, expr->args[0]);
     } else if (builtin->IsBarrier()) {
@@ -932,14 +935,14 @@
                 ScopedParen sp(out);
                 EmitExpression(out, expr->args[0]);
                 out << ", 0";
-                if (builtin->ReturnType()->Is<type::U32>()) {
+                if (builtin->ReturnType()->Is<core::type::U32>()) {
                     out << "u";
                 }
             }
             return;
         }
         case core::Function::kAtomicCompareExchangeWeak: {
-            EmitStructType(&helpers_, builtin->ReturnType()->As<type::Struct>());
+            EmitStructType(&helpers_, builtin->ReturnType()->As<core::type::Struct>());
 
             auto* dest = expr->args[0];
             auto* compare_value = expr->args[1];
@@ -1069,7 +1072,7 @@
                                 const sem::Builtin* builtin) {
     // GLSL does not support ternary expressions with a bool vector conditional,
     // so polyfill with a helper.
-    if (auto* vec = builtin->Parameters()[2]->Type()->As<type::Vector>()) {
+    if (auto* vec = builtin->Parameters()[2]->Type()->As<core::type::Vector>()) {
         CallBuiltinHelper(out, expr, builtin,
                           [&](TextBuffer* b, const std::vector<std::string>& params) {
                               auto l = Line(b);
@@ -1107,7 +1110,7 @@
 void ASTPrinter::EmitDotCall(StringStream& out,
                              const ast::CallExpression* expr,
                              const sem::Builtin* builtin) {
-    auto* vec_ty = builtin->Parameters()[0]->Type()->As<type::Vector>();
+    auto* vec_ty = builtin->Parameters()[0]->Type()->As<core::type::Vector>();
     std::string fn = "dot";
     if (vec_ty->type()->is_integer_scalar()) {
         // GLSL does not have a builtin for dot() with integer vector types.
@@ -1163,49 +1166,49 @@
                               const ast::CallExpression* expr,
                               const sem::Builtin* builtin) {
     TINT_ASSERT(expr->args.Length() == 1);
-    CallBuiltinHelper(out, expr, builtin,
-                      [&](TextBuffer* b, const std::vector<std::string>& params) {
-                          // Emit the builtin return type unique to this overload. This does not
-                          // exist in the AST, so it will not be generated in Generate().
-                          EmitStructType(&helpers_, builtin->ReturnType()->As<type::Struct>());
+    CallBuiltinHelper(
+        out, expr, builtin, [&](TextBuffer* b, const std::vector<std::string>& params) {
+            // Emit the builtin return type unique to this overload. This does not
+            // exist in the AST, so it will not be generated in Generate().
+            EmitStructType(&helpers_, builtin->ReturnType()->As<core::type::Struct>());
 
-                          {
-                              auto l = Line(b);
-                              EmitType(l, builtin->ReturnType(), core::AddressSpace::kUndefined,
-                                       core::Access::kUndefined, "");
-                              l << " result;";
-                          }
-                          Line(b) << "result.fract = modf(" << params[0] << ", result.whole);";
-                          Line(b) << "return result;";
-                      });
+            {
+                auto l = Line(b);
+                EmitType(l, builtin->ReturnType(), core::AddressSpace::kUndefined,
+                         core::Access::kUndefined, "");
+                l << " result;";
+            }
+            Line(b) << "result.fract = modf(" << params[0] << ", result.whole);";
+            Line(b) << "return result;";
+        });
 }
 
 void ASTPrinter::EmitFrexpCall(StringStream& out,
                                const ast::CallExpression* expr,
                                const sem::Builtin* builtin) {
     TINT_ASSERT(expr->args.Length() == 1);
-    CallBuiltinHelper(out, expr, builtin,
-                      [&](TextBuffer* b, const std::vector<std::string>& params) {
-                          // Emit the builtin return type unique to this overload. This does not
-                          // exist in the AST, so it will not be generated in Generate().
-                          EmitStructType(&helpers_, builtin->ReturnType()->As<type::Struct>());
+    CallBuiltinHelper(
+        out, expr, builtin, [&](TextBuffer* b, const std::vector<std::string>& params) {
+            // Emit the builtin return type unique to this overload. This does not
+            // exist in the AST, so it will not be generated in Generate().
+            EmitStructType(&helpers_, builtin->ReturnType()->As<core::type::Struct>());
 
-                          {
-                              auto l = Line(b);
-                              EmitType(l, builtin->ReturnType(), core::AddressSpace::kUndefined,
-                                       core::Access::kUndefined, "");
-                              l << " result;";
-                          }
-                          Line(b) << "result.fract = frexp(" << params[0] << ", result.exp);";
-                          Line(b) << "return result;";
-                      });
+            {
+                auto l = Line(b);
+                EmitType(l, builtin->ReturnType(), core::AddressSpace::kUndefined,
+                         core::Access::kUndefined, "");
+                l << " result;";
+            }
+            Line(b) << "result.fract = frexp(" << params[0] << ", result.exp);";
+            Line(b) << "return result;";
+        });
 }
 
 void ASTPrinter::EmitDegreesCall(StringStream& out,
                                  const ast::CallExpression* expr,
                                  const sem::Builtin* builtin) {
     auto* return_elem_type = builtin->ReturnType()->DeepestElement();
-    const std::string suffix = Is<type::F16>(return_elem_type) ? "hf" : "f";
+    const std::string suffix = Is<core::type::F16>(return_elem_type) ? "hf" : "f";
     CallBuiltinHelper(out, expr, builtin,
                       [&](TextBuffer* b, const std::vector<std::string>& params) {
                           Line(b) << "return " << params[0] << " * " << std::setprecision(20)
@@ -1217,7 +1220,7 @@
                                  const ast::CallExpression* expr,
                                  const sem::Builtin* builtin) {
     auto* return_elem_type = builtin->ReturnType()->DeepestElement();
-    const std::string suffix = Is<type::F16>(return_elem_type) ? "hf" : "f";
+    const std::string suffix = Is<core::type::F16>(return_elem_type) ? "hf" : "f";
     CallBuiltinHelper(out, expr, builtin,
                       [&](TextBuffer* b, const std::vector<std::string>& params) {
                           Line(b) << "return " << params[0] << " * " << std::setprecision(20)
@@ -1232,7 +1235,7 @@
     CallBuiltinHelper(
         out, expr, builtin, [&](TextBuffer* b, const std::vector<std::string>& params) {
             const auto v = params[0];
-            if (auto* vec = builtin->ReturnType()->As<type::Vector>()) {
+            if (auto* vec = builtin->ReturnType()->As<core::type::Vector>()) {
                 switch (vec->Width()) {
                     case 2: {
                         Line(b) << "return unpackHalf2x16(packHalf2x16(" << v << "));";
@@ -1270,7 +1273,7 @@
 
 const ast::Expression* ASTPrinter::CreateF32Zero(const sem::Statement* stmt) {
     auto* zero = builder_.Expr(0_f);
-    auto* f32 = builder_.create<type::F32>();
+    auto* f32 = builder_.create<core::type::F32>();
     auto* sem_zero = builder_.create<sem::ValueExpression>(
         zero, f32, core::EvaluationStage::kRuntime, stmt, /* constant_value */ nullptr,
         /* has_side_effects */ false);
@@ -1299,9 +1302,9 @@
         return;
     }
 
-    auto* texture_type = TypeOf(texture)->UnwrapRef()->As<type::Texture>();
+    auto* texture_type = TypeOf(texture)->UnwrapRef()->As<core::type::Texture>();
 
-    auto emit_signed_int_type = [&](const type::Type* ty) {
+    auto emit_signed_int_type = [&](const core::type::Type* ty) {
         uint32_t width = ty->Elements().count;
         if (width > 1) {
             out << "ivec" << width;
@@ -1310,7 +1313,7 @@
         }
     };
 
-    auto emit_unsigned_int_type = [&](const type::Type* ty) {
+    auto emit_unsigned_int_type = [&](const core::type::Type* ty) {
         uint32_t width = ty->Elements().count;
         if (width > 1) {
             out << "uvec" << width;
@@ -1339,7 +1342,7 @@
             emit_unsigned_int_type(call->Type());
             ScopedParen sp(out);
 
-            if (texture_type->Is<type::StorageTexture>()) {
+            if (texture_type->Is<core::type::StorageTexture>()) {
                 out << "imageSize(";
             } else {
                 out << "textureSize(";
@@ -1348,9 +1351,9 @@
 
             // The LOD parameter is mandatory on textureSize() for non-multisampled
             // textures.
-            if (!texture_type->Is<type::StorageTexture>() &&
-                !texture_type->Is<type::MultisampledTexture>() &&
-                !texture_type->Is<type::DepthMultisampledTexture>()) {
+            if (!texture_type->Is<core::type::StorageTexture>() &&
+                !texture_type->Is<core::type::MultisampledTexture>() &&
+                !texture_type->Is<core::type::DepthMultisampledTexture>()) {
                 out << ", ";
                 if (auto* level_arg = arg(Usage::kLevel)) {
                     emit_expr_as_signed(level_arg);
@@ -1361,8 +1364,8 @@
             out << ")";
             // textureSize() on array samplers returns the array size in the
             // final component, so strip it out.
-            if (texture_type->dim() == type::TextureDimension::k2dArray ||
-                texture_type->dim() == type::TextureDimension::kCubeArray) {
+            if (texture_type->dim() == core::type::TextureDimension::k2dArray ||
+                texture_type->dim() == core::type::TextureDimension::kCubeArray) {
                 out << ".xy";
             }
             return;
@@ -1374,7 +1377,7 @@
             out << "uint";
             ScopedParen sp(out);
 
-            if (texture_type->Is<type::StorageTexture>()) {
+            if (texture_type->Is<core::type::StorageTexture>()) {
                 out << "imageSize(";
             } else {
                 out << "textureSize(";
@@ -1385,9 +1388,9 @@
 
             // The LOD parameter is mandatory on textureSize() for non-multisampled
             // textures.
-            if (!texture_type->Is<type::StorageTexture>() &&
-                !texture_type->Is<type::MultisampledTexture>() &&
-                !texture_type->Is<type::DepthMultisampledTexture>()) {
+            if (!texture_type->Is<core::type::StorageTexture>() &&
+                !texture_type->Is<core::type::MultisampledTexture>() &&
+                !texture_type->Is<core::type::DepthMultisampledTexture>()) {
                 out << ", ";
                 if (auto* level_arg = arg(Usage::kLevel)) {
                     emit_expr_as_signed(level_arg);
@@ -1428,7 +1431,7 @@
 
     uint32_t glsl_ret_width = 4u;
     bool append_depth_ref_to_coords = true;
-    bool is_depth = texture_type->Is<type::DepthTexture>();
+    bool is_depth = texture_type->Is<core::type::DepthTexture>();
 
     switch (builtin->Type()) {
         case core::Function::kTextureSample:
@@ -1493,7 +1496,7 @@
     // GLSL requires Dref to be appended to the coordinates, *unless* it's
     // samplerCubeArrayShadow, in which case it will be handled as a separate
     // parameter.
-    if (texture_type->dim() == type::TextureDimension::kCubeArray) {
+    if (texture_type->dim() == core::type::TextureDimension::kCubeArray) {
         append_depth_ref_to_coords = false;
     }
 
@@ -1554,14 +1557,14 @@
 
     out << ")";
 
-    if (builtin->ReturnType()->Is<type::Void>()) {
+    if (builtin->ReturnType()->Is<core::type::Void>()) {
         return;
     }
     // If the builtin return type does not match the number of elements of the
     // GLSL builtin, we need to swizzle the expression to generate the correct
     // number of components.
     uint32_t wgsl_ret_width = 1;
-    if (auto* vec = builtin->ReturnType()->As<type::Vector>()) {
+    if (auto* vec = builtin->ReturnType()->As<core::type::Vector>()) {
         wgsl_ret_width = vec->Width();
     }
     if (wgsl_ret_width < glsl_ret_width) {
@@ -1809,7 +1812,7 @@
 
             auto const* type = v->Type();
 
-            if (auto* ptr = type->As<type::Pointer>()) {
+            if (auto* ptr = type->As<core::type::Pointer>()) {
                 // Transform pointer parameters in to `inout` parameters.
                 // The WGSL spec is highly restrictive in what can be passed in pointer
                 // parameters, which allows for this transformation. See:
@@ -1889,7 +1892,7 @@
 
 void ASTPrinter::EmitUniformVariable(const ast::Var* var, const sem::Variable* sem) {
     auto* type = sem->Type()->UnwrapRef();
-    auto* str = type->As<type::Struct>();
+    auto* str = type->As<core::type::Struct>();
     if (TINT_UNLIKELY(!str)) {
         TINT_ICE() << "storage variable must be of struct type";
         return;
@@ -1908,7 +1911,7 @@
 
 void ASTPrinter::EmitStorageVariable(const ast::Var* var, const sem::Variable* sem) {
     auto* type = sem->Type()->UnwrapRef();
-    auto* str = type->As<type::Struct>();
+    auto* str = type->As<core::type::Struct>();
     if (TINT_UNLIKELY(!str)) {
         TINT_ICE() << "storage variable must be of struct type";
         return;
@@ -1927,12 +1930,12 @@
 
     auto name = var->name->symbol.Name();
     auto* type = sem->Type()->UnwrapRef();
-    if (type->Is<type::Sampler>()) {
+    if (type->Is<core::type::Sampler>()) {
         // GLSL ignores Sampler variables.
         return;
     }
 
-    if (auto* storage = type->As<type::StorageTexture>()) {
+    if (auto* storage = type->As<core::type::StorageTexture>()) {
         out << "layout(";
         switch (storage->texel_format()) {
             case core::TexelFormat::kBgra8Unorm:
@@ -2161,7 +2164,7 @@
         for (auto* var : func->params) {
             auto* sem = builder_.Sem().Get(var);
             auto* type = sem->Type();
-            if (TINT_UNLIKELY(!type->Is<type::Struct>())) {
+            if (TINT_UNLIKELY(!type->Is<core::type::Struct>())) {
                 // ICE likely indicates that the CanonicalizeEntryPointIO transform was
                 // not run, or a builtin parameter was added after it was run.
                 TINT_ICE() << "Unsupported non-struct entry point parameter";
@@ -2200,12 +2203,12 @@
 void ASTPrinter::EmitConstant(StringStream& out, const core::constant::Value* constant) {
     Switch(
         constant->Type(),  //
-        [&](const type::Bool*) { out << (constant->ValueAs<AInt>() ? "true" : "false"); },
-        [&](const type::F32*) { PrintF32(out, constant->ValueAs<f32>()); },
-        [&](const type::F16*) { PrintF16(out, constant->ValueAs<f16>()); },
-        [&](const type::I32*) { PrintI32(out, constant->ValueAs<i32>()); },
-        [&](const type::U32*) { out << constant->ValueAs<AInt>() << "u"; },
-        [&](const type::Vector* v) {
+        [&](const core::type::Bool*) { out << (constant->ValueAs<AInt>() ? "true" : "false"); },
+        [&](const core::type::F32*) { PrintF32(out, constant->ValueAs<f32>()); },
+        [&](const core::type::F16*) { PrintF16(out, constant->ValueAs<f16>()); },
+        [&](const core::type::I32*) { PrintI32(out, constant->ValueAs<i32>()); },
+        [&](const core::type::U32*) { out << constant->ValueAs<AInt>() << "u"; },
+        [&](const core::type::Vector* v) {
             EmitType(out, v, core::AddressSpace::kUndefined, core::Access::kUndefined, "");
 
             ScopedParen sp(out);
@@ -2222,7 +2225,7 @@
                 EmitConstant(out, constant->Index(i));
             }
         },
-        [&](const type::Matrix* m) {
+        [&](const core::type::Matrix* m) {
             EmitType(out, m, core::AddressSpace::kUndefined, core::Access::kUndefined, "");
 
             ScopedParen sp(out);
@@ -2234,7 +2237,7 @@
                 EmitConstant(out, constant->Index(column_idx));
             }
         },
-        [&](const type::Array* a) {
+        [&](const core::type::Array* a) {
             EmitType(out, a, core::AddressSpace::kUndefined, core::Access::kUndefined, "");
 
             ScopedParen sp(out);
@@ -2242,7 +2245,7 @@
             auto count = a->ConstantCount();
             if (!count) {
                 diagnostics_.add_error(diag::System::Writer,
-                                       type::Array::kErrExpectedConstantCount);
+                                       core::type::Array::kErrExpectedConstantCount);
                 return;
             }
 
@@ -2253,7 +2256,7 @@
                 EmitConstant(out, constant->Index(i));
             }
         },
-        [&](const type::Struct* s) {
+        [&](const core::type::Struct* s) {
             EmitStructType(&helpers_, s);
 
             out << StructName(s);
@@ -2301,18 +2304,18 @@
         [&](Default) { diagnostics_.add_error(diag::System::Writer, "unknown literal type"); });
 }
 
-void ASTPrinter::EmitZeroValue(StringStream& out, const type::Type* type) {
-    if (type->Is<type::Bool>()) {
+void ASTPrinter::EmitZeroValue(StringStream& out, const core::type::Type* type) {
+    if (type->Is<core::type::Bool>()) {
         out << "false";
-    } else if (type->Is<type::F32>()) {
+    } else if (type->Is<core::type::F32>()) {
         out << "0.0f";
-    } else if (type->Is<type::F16>()) {
+    } else if (type->Is<core::type::F16>()) {
         out << "0.0hf";
-    } else if (type->Is<type::I32>()) {
+    } else if (type->Is<core::type::I32>()) {
         out << "0";
-    } else if (type->Is<type::U32>()) {
+    } else if (type->Is<core::type::U32>()) {
         out << "0u";
-    } else if (auto* vec = type->As<type::Vector>()) {
+    } else if (auto* vec = type->As<core::type::Vector>()) {
         EmitType(out, type, core::AddressSpace::kUndefined, core::Access::kReadWrite, "");
         ScopedParen sp(out);
         for (uint32_t i = 0; i < vec->Width(); i++) {
@@ -2321,7 +2324,7 @@
             }
             EmitZeroValue(out, vec->type());
         }
-    } else if (auto* mat = type->As<type::Matrix>()) {
+    } else if (auto* mat = type->As<core::type::Matrix>()) {
         EmitType(out, type, core::AddressSpace::kUndefined, core::Access::kReadWrite, "");
         ScopedParen sp(out);
         for (uint32_t i = 0; i < (mat->rows() * mat->columns()); i++) {
@@ -2330,7 +2333,7 @@
             }
             EmitZeroValue(out, mat->type());
         }
-    } else if (auto* str = type->As<type::Struct>()) {
+    } else if (auto* str = type->As<core::type::Struct>()) {
         EmitType(out, type, core::AddressSpace::kUndefined, core::Access::kUndefined, "");
         bool first = true;
         ScopedParen sp(out);
@@ -2342,13 +2345,14 @@
             }
             EmitZeroValue(out, member->Type());
         }
-    } else if (auto* arr = type->As<type::Array>()) {
+    } else if (auto* arr = type->As<core::type::Array>()) {
         EmitType(out, type, core::AddressSpace::kUndefined, core::Access::kUndefined, "");
         ScopedParen sp(out);
 
         auto count = arr->ConstantCount();
         if (!count) {
-            diagnostics_.add_error(diag::System::Writer, type::Array::kErrExpectedConstantCount);
+            diagnostics_.add_error(diag::System::Writer,
+                                   core::type::Array::kErrExpectedConstantCount);
             return;
         }
 
@@ -2604,7 +2608,7 @@
 }
 
 void ASTPrinter::EmitType(StringStream& out,
-                          const type::Type* type,
+                          const core::type::Type* type,
                           core::AddressSpace address_space,
                           core::Access access,
                           const std::string& name,
@@ -2630,17 +2634,17 @@
             break;
     }
 
-    if (auto* ary = type->As<type::Array>()) {
-        const type::Type* base_type = ary;
+    if (auto* ary = type->As<core::type::Array>()) {
+        const core::type::Type* base_type = ary;
         std::vector<uint32_t> sizes;
-        while (auto* arr = base_type->As<type::Array>()) {
-            if (arr->Count()->Is<type::RuntimeArrayCount>()) {
+        while (auto* arr = base_type->As<core::type::Array>()) {
+            if (arr->Count()->Is<core::type::RuntimeArrayCount>()) {
                 sizes.push_back(0);
             } else {
                 auto count = arr->ConstantCount();
                 if (!count) {
                     diagnostics_.add_error(diag::System::Writer,
-                                           type::Array::kErrExpectedConstantCount);
+                                           core::type::Array::kErrExpectedConstantCount);
                     return;
                 }
                 sizes.push_back(count.value());
@@ -2662,39 +2666,39 @@
                 out << "[]";
             }
         }
-    } else if (type->Is<type::Bool>()) {
+    } else if (type->Is<core::type::Bool>()) {
         out << "bool";
-    } else if (type->Is<type::F32>()) {
+    } else if (type->Is<core::type::F32>()) {
         out << "float";
-    } else if (type->Is<type::F16>()) {
+    } else if (type->Is<core::type::F16>()) {
         out << "float16_t";
-    } else if (type->Is<type::I32>()) {
+    } else if (type->Is<core::type::I32>()) {
         out << "int";
-    } else if (auto* mat = type->As<type::Matrix>()) {
-        TINT_ASSERT((mat->type()->IsAnyOf<type::F32, type::F16>()));
-        if (mat->type()->Is<type::F16>()) {
+    } else if (auto* mat = type->As<core::type::Matrix>()) {
+        TINT_ASSERT((mat->type()->IsAnyOf<core::type::F32, core::type::F16>()));
+        if (mat->type()->Is<core::type::F16>()) {
             out << "f16";
         }
         out << "mat" << mat->columns();
         if (mat->rows() != mat->columns()) {
             out << "x" << mat->rows();
         }
-    } else if (TINT_UNLIKELY(type->Is<type::Pointer>())) {
+    } else if (TINT_UNLIKELY(type->Is<core::type::Pointer>())) {
         TINT_ICE() << "Attempting to emit pointer type. These should have been removed with the "
                       "SimplifyPointers transform";
-    } else if (type->Is<type::Sampler>()) {
-    } else if (auto* str = type->As<type::Struct>()) {
+    } else if (type->Is<core::type::Sampler>()) {
+    } else if (auto* str = type->As<core::type::Struct>()) {
         out << StructName(str);
-    } else if (auto* tex = type->As<type::Texture>()) {
-        if (TINT_UNLIKELY(tex->Is<type::ExternalTexture>())) {
+    } else if (auto* tex = type->As<core::type::Texture>()) {
+        if (TINT_UNLIKELY(tex->Is<core::type::ExternalTexture>())) {
             TINT_ICE() << "Multiplanar external texture transform was not run.";
             return;
         }
 
-        auto* storage = tex->As<type::StorageTexture>();
-        auto* ms = tex->As<type::MultisampledTexture>();
-        auto* depth_ms = tex->As<type::DepthMultisampledTexture>();
-        auto* sampled = tex->As<type::SampledTexture>();
+        auto* storage = tex->As<core::type::StorageTexture>();
+        auto* ms = tex->As<core::type::MultisampledTexture>();
+        auto* depth_ms = tex->As<core::type::DepthMultisampledTexture>();
+        auto* sampled = tex->As<core::type::SampledTexture>();
 
         out << "highp ";
 
@@ -2705,10 +2709,10 @@
                         : storage ? storage->type()
                         : ms      ? ms->type()
                                   : nullptr;
-        if (!subtype || subtype->Is<type::F32>()) {
-        } else if (subtype->Is<type::I32>()) {
+        if (!subtype || subtype->Is<core::type::F32>()) {
+        } else if (subtype->Is<core::type::I32>()) {
             out << "i";
-        } else if (TINT_LIKELY(subtype->Is<type::U32>())) {
+        } else if (TINT_LIKELY(subtype->Is<core::type::U32>())) {
             out << "u";
         } else {
             TINT_ICE() << "Unsupported texture type";
@@ -2718,53 +2722,53 @@
         out << (storage ? "image" : "sampler");
 
         switch (tex->dim()) {
-            case type::TextureDimension::k1d:
+            case core::type::TextureDimension::k1d:
                 out << "1D";
                 break;
-            case type::TextureDimension::k2d:
+            case core::type::TextureDimension::k2d:
                 out << ((ms || depth_ms) ? "2DMS" : "2D");
                 break;
-            case type::TextureDimension::k2dArray:
+            case core::type::TextureDimension::k2dArray:
                 out << ((ms || depth_ms) ? "2DMSArray" : "2DArray");
                 break;
-            case type::TextureDimension::k3d:
+            case core::type::TextureDimension::k3d:
                 out << "3D";
                 break;
-            case type::TextureDimension::kCube:
+            case core::type::TextureDimension::kCube:
                 out << "Cube";
                 break;
-            case type::TextureDimension::kCubeArray:
+            case core::type::TextureDimension::kCubeArray:
                 out << "CubeArray";
                 break;
             default:
                 TINT_UNREACHABLE() << "unexpected TextureDimension " << tex->dim();
                 return;
         }
-        if (tex->Is<type::DepthTexture>()) {
+        if (tex->Is<core::type::DepthTexture>()) {
             out << "Shadow";
         }
-    } else if (type->Is<type::U32>()) {
+    } else if (type->Is<core::type::U32>()) {
         out << "uint";
-    } else if (auto* vec = type->As<type::Vector>()) {
+    } else if (auto* vec = type->As<core::type::Vector>()) {
         auto width = vec->Width();
-        if (vec->type()->Is<type::F32>() && width >= 1 && width <= 4) {
+        if (vec->type()->Is<core::type::F32>() && width >= 1 && width <= 4) {
             out << "vec" << width;
-        } else if (vec->type()->Is<type::F16>() && width >= 1 && width <= 4) {
+        } else if (vec->type()->Is<core::type::F16>() && width >= 1 && width <= 4) {
             out << "f16vec" << width;
-        } else if (vec->type()->Is<type::I32>() && width >= 1 && width <= 4) {
+        } else if (vec->type()->Is<core::type::I32>() && width >= 1 && width <= 4) {
             out << "ivec" << width;
-        } else if (vec->type()->Is<type::U32>() && width >= 1 && width <= 4) {
+        } else if (vec->type()->Is<core::type::U32>() && width >= 1 && width <= 4) {
             out << "uvec" << width;
-        } else if (vec->type()->Is<type::Bool>() && width >= 1 && width <= 4) {
+        } else if (vec->type()->Is<core::type::Bool>() && width >= 1 && width <= 4) {
             out << "bvec" << width;
         } else {
             out << "vector<";
             EmitType(out, vec->type(), address_space, access, "");
             out << ", " << width << ">";
         }
-    } else if (auto* atomic = type->As<type::Atomic>()) {
+    } else if (auto* atomic = type->As<core::type::Atomic>()) {
         EmitType(out, atomic->Type(), address_space, access, name);
-    } else if (type->Is<type::Void>()) {
+    } else if (type->Is<core::type::Void>()) {
         out << "void";
     } else {
         diagnostics_.add_error(diag::System::Writer, "unknown type in EmitType");
@@ -2772,7 +2776,7 @@
 }
 
 void ASTPrinter::EmitTypeAndName(StringStream& out,
-                                 const type::Type* type,
+                                 const core::type::Type* type,
                                  core::AddressSpace address_space,
                                  core::Access access,
                                  const std::string& name) {
@@ -2783,7 +2787,7 @@
     }
 }
 
-void ASTPrinter::EmitStructType(TextBuffer* b, const type::Struct* str) {
+void ASTPrinter::EmitStructType(TextBuffer* b, const core::type::Struct* str) {
     auto it = emitted_structs_.emplace(str);
     if (!it.second) {
         return;
@@ -2796,7 +2800,7 @@
     Line(b);
 }
 
-void ASTPrinter::EmitStructMembers(TextBuffer* b, const type::Struct* str) {
+void ASTPrinter::EmitStructMembers(TextBuffer* b, const core::type::Struct* str) {
     ScopedIndent si(b);
     for (auto* mem : str->Members()) {
         auto name = mem->Name().Name();
@@ -2818,7 +2822,7 @@
             out << "~";
             break;
         case core::UnaryOp::kNot:
-            if (TypeOf(expr)->UnwrapRef()->Is<type::Scalar>()) {
+            if (TypeOf(expr)->UnwrapRef()->Is<core::type::Scalar>()) {
                 out << "!";
             } else {
                 out << "not";
@@ -2901,7 +2905,7 @@
                     }
                     auto param_name = "param_" + std::to_string(parameter_names.size());
                     const auto* ty = param->Type();
-                    if (auto* ptr = ty->As<type::Pointer>()) {
+                    if (auto* ptr = ty->As<core::type::Pointer>()) {
                         decl << "inout ";
                         ty = ptr->StoreType();
                     }
@@ -2936,18 +2940,18 @@
     }
 }
 
-type::Type* ASTPrinter::BoolTypeToUint(const type::Type* type) {
-    auto* u32 = builder_.create<type::U32>();
-    if (type->Is<type::Bool>()) {
+core::type::Type* ASTPrinter::BoolTypeToUint(const core::type::Type* type) {
+    auto* u32 = builder_.create<core::type::U32>();
+    if (type->Is<core::type::Bool>()) {
         return u32;
-    } else if (auto* vec = type->As<type::Vector>()) {
-        return builder_.create<type::Vector>(u32, vec->Width());
+    } else if (auto* vec = type->As<core::type::Vector>()) {
+        return builder_.create<core::type::Vector>(u32, vec->Width());
     } else {
         return nullptr;
     }
 }
 
-std::string ASTPrinter::StructName(const type::Struct* s) {
+std::string ASTPrinter::StructName(const core::type::Struct* s) {
     auto name = s->Name().Name();
     if (HasPrefix(name, "__")) {
         name = tint::GetOrCreate(builtin_struct_names_, s,
diff --git a/src/tint/lang/glsl/writer/ast_printer/ast_printer.h b/src/tint/lang/glsl/writer/ast_printer/ast_printer.h
index 15d6fa9..dd927dc 100644
--- a/src/tint/lang/glsl/writer/ast_printer/ast_printer.h
+++ b/src/tint/lang/glsl/writer/ast_printer/ast_printer.h
@@ -349,7 +349,7 @@
     /// @param name_printed (optional) if not nullptr and an array was printed
     /// then the boolean is set to true.
     void EmitType(StringStream& out,
-                  const type::Type* type,
+                  const core::type::Type* type,
                   core::AddressSpace address_space,
                   core::Access access,
                   const std::string& name,
@@ -361,7 +361,7 @@
     /// @param access the access control type of the variable
     /// @param name the name to emit
     void EmitTypeAndName(StringStream& out,
-                         const type::Type* type,
+                         const core::type::Type* type,
                          core::AddressSpace address_space,
                          core::Access access,
                          const std::string& name);
@@ -369,11 +369,11 @@
     /// this function will simply return `true` without emitting anything.
     /// @param buffer the text buffer that the type declaration will be written to
     /// @param ty the struct to generate
-    void EmitStructType(TextBuffer* buffer, const type::Struct* ty);
+    void EmitStructType(TextBuffer* buffer, const core::type::Struct* ty);
     /// Handles generating the members of a structure
     /// @param buffer the text buffer that the struct members will be written to
     /// @param ty the struct to generate
-    void EmitStructMembers(TextBuffer* buffer, const type::Struct* ty);
+    void EmitStructMembers(TextBuffer* buffer, const core::type::Struct* ty);
     /// Handles a unary op expression
     /// @param out the output of the expression stream
     /// @param expr the expression to emit
@@ -381,7 +381,7 @@
     /// Emits the zero value for the given type
     /// @param out the output stream
     /// @param type the type to emit the value for
-    void EmitZeroValue(StringStream& out, const type::Type* type);
+    void EmitZeroValue(StringStream& out, const core::type::Type* type);
     /// Handles generating a 'var' declaration
     /// @param var the variable to generate
     void EmitVar(const ast::Var* var);
@@ -400,10 +400,10 @@
     /// @param stage pipeline stage in which this builtin is used
     /// @returns the string name of the builtin or blank on error
     const char* builtin_to_string(core::BuiltinValue builtin, ast::PipelineStage stage);
-    /// Converts a builtin to a type::Type appropriate for GLSL.
+    /// Converts a builtin to a core::type::Type appropriate for GLSL.
     /// @param builtin the builtin to convert
     /// @returns the appropriate semantic type or null on error.
-    type::Type* builtin_type(core::BuiltinValue builtin);
+    core::type::Type* builtin_type(core::BuiltinValue builtin);
 
   private:
     enum class VarType { kIn, kOut };
@@ -415,7 +415,7 @@
 
     /// The map key for two semantic types.
     using BinaryOperandType =
-        tint::UnorderedKeyWrapper<std::tuple<const type::Type*, const type::Type*>>;
+        tint::UnorderedKeyWrapper<std::tuple<const core::type::Type*, const core::type::Type*>>;
 
     /// CallBuiltinHelper will call the builtin helper function, creating it
     /// if it hasn't been built already. If the builtin needs to be built then
@@ -438,13 +438,13 @@
     /// Create a uint type corresponding to the given bool or bool vector type.
     /// @param type the bool or bool vector type to convert
     /// @returns the corresponding uint type
-    type::Type* BoolTypeToUint(const type::Type* type);
+    core::type::Type* BoolTypeToUint(const core::type::Type* type);
 
     /// @param s the structure
     /// @returns the name of the structure, taking special care of builtin structures that start
     /// with double underscores. If the structure is a builtin, then the returned name will be a
     /// unique name without the leading underscores.
-    std::string StructName(const type::Struct* s);
+    std::string StructName(const core::type::Struct* s);
 
     /// @return a new, unique identifier with the given prefix.
     /// @param prefix optional prefix to apply to the generated identifier. If empty "tint_symbol"
@@ -463,16 +463,16 @@
     TextBuffer helpers_;
 
     /// Map of builtin structure to unique generated name
-    std::unordered_map<const type::Struct*, std::string> builtin_struct_names_;
+    std::unordered_map<const core::type::Struct*, std::string> builtin_struct_names_;
     std::function<void()> emit_continuing_;
     std::unordered_map<const sem::Builtin*, std::string> builtins_;
-    std::unordered_map<const type::Vector*, std::string> dynamic_vector_write_;
-    std::unordered_map<const type::Vector*, std::string> int_dot_funcs_;
+    std::unordered_map<const core::type::Vector*, std::string> dynamic_vector_write_;
+    std::unordered_map<const core::type::Vector*, std::string> int_dot_funcs_;
     std::unordered_map<BinaryOperandType, std::string> float_modulo_funcs_;
     // Polyfill functions for bitcast expression, BinaryOperandType indicates the source type and
     // the destination type
     std::unordered_map<BinaryOperandType, std::string> bitcast_funcs_;
-    std::unordered_set<const type::Struct*> emitted_structs_;
+    std::unordered_set<const core::type::Struct*> emitted_structs_;
     bool requires_oes_sample_variables_ = false;
     bool requires_default_precision_qualifier_ = false;
     bool requires_f16_extension_ = false;
diff --git a/src/tint/lang/glsl/writer/ast_printer/type_test.cc b/src/tint/lang/glsl/writer/ast_printer/type_test.cc
index c788356..57163cd 100644
--- a/src/tint/lang/glsl/writer/ast_printer/type_test.cc
+++ b/src/tint/lang/glsl/writer/ast_printer/type_test.cc
@@ -87,7 +87,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Type, EmitType_Bool) {
-    auto* bool_ = create<type::Bool>();
+    auto* bool_ = create<core::type::Bool>();
 
     ASTPrinter& gen = Build();
 
@@ -98,7 +98,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Type, EmitType_F32) {
-    auto* f32 = create<type::F32>();
+    auto* f32 = create<core::type::F32>();
 
     ASTPrinter& gen = Build();
 
@@ -111,7 +111,7 @@
 TEST_F(GlslASTPrinterTest_Type, EmitType_F16) {
     Enable(core::Extension::kF16);
 
-    auto* f16 = create<type::F16>();
+    auto* f16 = create<core::type::F16>();
 
     ASTPrinter& gen = Build();
 
@@ -122,7 +122,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Type, EmitType_I32) {
-    auto* i32 = create<type::I32>();
+    auto* i32 = create<core::type::I32>();
 
     ASTPrinter& gen = Build();
 
@@ -133,9 +133,9 @@
 }
 
 TEST_F(GlslASTPrinterTest_Type, EmitType_Matrix_F32) {
-    auto* f32 = create<type::F32>();
-    auto* vec3 = create<type::Vector>(f32, 3u);
-    auto* mat2x3 = create<type::Matrix>(vec3, 2u);
+    auto* f32 = create<core::type::F32>();
+    auto* vec3 = create<core::type::Vector>(f32, 3u);
+    auto* mat2x3 = create<core::type::Matrix>(vec3, 2u);
 
     ASTPrinter& gen = Build();
 
@@ -148,9 +148,9 @@
 TEST_F(GlslASTPrinterTest_Type, EmitType_Matrix_F16) {
     Enable(core::Extension::kF16);
 
-    auto* f16 = create<type::F16>();
-    auto* vec3 = create<type::Vector>(f16, 3u);
-    auto* mat2x3 = create<type::Matrix>(vec3, 2u);
+    auto* f16 = create<core::type::F16>();
+    auto* vec3 = create<core::type::Vector>(f16, 3u);
+    auto* mat2x3 = create<core::type::Matrix>(vec3, 2u);
 
     ASTPrinter& gen = Build();
 
@@ -170,7 +170,7 @@
     ASTPrinter& gen = Build();
 
     tint::TextGenerator::TextBuffer buf;
-    auto* str = program->TypeOf(s)->As<type::Struct>();
+    auto* str = program->TypeOf(s)->As<core::type::Struct>();
     gen.EmitStructType(&buf, str);
     EXPECT_THAT(gen.Diagnostics(), testing::IsEmpty());
     EXPECT_EQ(buf.String(), R"(struct S {
@@ -190,7 +190,7 @@
 
     ASTPrinter& gen = Build();
 
-    auto* str = program->TypeOf(s)->As<type::Struct>();
+    auto* str = program->TypeOf(s)->As<core::type::Struct>();
     StringStream out;
     gen.EmitType(out, str, core::AddressSpace::kUndefined, core::Access::kReadWrite, "");
     EXPECT_THAT(gen.Diagnostics(), testing::IsEmpty());
@@ -224,7 +224,7 @@
     ASTPrinter& gen = Build();
 
     tint::TextGenerator::TextBuffer buf;
-    auto* str = program->TypeOf(s)->As<type::Struct>();
+    auto* str = program->TypeOf(s)->As<core::type::Struct>();
     gen.EmitStructType(&buf, str);
     EXPECT_THAT(gen.Diagnostics(), testing::IsEmpty());
     EXPECT_EQ(buf.String(), R"(struct S {
@@ -236,7 +236,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Type, EmitType_U32) {
-    auto* u32 = create<type::U32>();
+    auto* u32 = create<core::type::U32>();
 
     ASTPrinter& gen = Build();
 
@@ -247,8 +247,8 @@
 }
 
 TEST_F(GlslASTPrinterTest_Type, EmitType_Vector_F32) {
-    auto* f32 = create<type::F32>();
-    auto* vec3 = create<type::Vector>(f32, 3u);
+    auto* f32 = create<core::type::F32>();
+    auto* vec3 = create<core::type::Vector>(f32, 3u);
 
     ASTPrinter& gen = Build();
 
@@ -261,8 +261,8 @@
 TEST_F(GlslASTPrinterTest_Type, EmitType_Vector_F16) {
     Enable(core::Extension::kF16);
 
-    auto* f16 = create<type::F16>();
-    auto* vec3 = create<type::Vector>(f16, 3u);
+    auto* f16 = create<core::type::F16>();
+    auto* vec3 = create<core::type::Vector>(f16, 3u);
 
     ASTPrinter& gen = Build();
 
@@ -273,7 +273,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Type, EmitType_Void) {
-    auto* void_ = create<type::Void>();
+    auto* void_ = create<core::type::Void>();
 
     ASTPrinter& gen = Build();
 
@@ -284,7 +284,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Type, EmitSampler) {
-    auto* sampler = create<type::Sampler>(type::SamplerKind::kSampler);
+    auto* sampler = create<core::type::Sampler>(core::type::SamplerKind::kSampler);
 
     ASTPrinter& gen = Build();
 
@@ -294,7 +294,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Type, EmitSamplerComparison) {
-    auto* sampler = create<type::Sampler>(type::SamplerKind::kComparisonSampler);
+    auto* sampler = create<core::type::Sampler>(core::type::SamplerKind::kComparisonSampler);
 
     ASTPrinter& gen = Build();
 
@@ -304,7 +304,7 @@
 }
 
 struct GlslDepthTextureData {
-    type::TextureDimension dim;
+    core::type::TextureDimension dim;
     std::string result;
 };
 inline std::ostream& operator<<(std::ostream& out, GlslDepthTextureData data) {
@@ -339,14 +339,15 @@
     GlslASTPrinterTest_Type,
     GlslDepthTexturesTest,
     testing::Values(
-        GlslDepthTextureData{type::TextureDimension::k2d, "sampler2DShadow tex;"},
-        GlslDepthTextureData{type::TextureDimension::k2dArray, "sampler2DArrayShadow tex;"},
-        GlslDepthTextureData{type::TextureDimension::kCube, "samplerCubeShadow tex;"},
-        GlslDepthTextureData{type::TextureDimension::kCubeArray, "samplerCubeArrayShadow tex;"}));
+        GlslDepthTextureData{core::type::TextureDimension::k2d, "sampler2DShadow tex;"},
+        GlslDepthTextureData{core::type::TextureDimension::k2dArray, "sampler2DArrayShadow tex;"},
+        GlslDepthTextureData{core::type::TextureDimension::kCube, "samplerCubeShadow tex;"},
+        GlslDepthTextureData{core::type::TextureDimension::kCubeArray,
+                             "samplerCubeArrayShadow tex;"}));
 
 using GlslDepthMultisampledTexturesTest = TestHelper;
 TEST_F(GlslDepthMultisampledTexturesTest, Emit) {
-    auto t = ty.depth_multisampled_texture(type::TextureDimension::k2d);
+    auto t = ty.depth_multisampled_texture(core::type::TextureDimension::k2d);
 
     GlobalVar("tex", t, Binding(1_a), Group(2_a));
 
@@ -366,7 +367,7 @@
 
 enum class TextureDataType { F32, U32, I32 };
 struct GlslSampledTextureData {
-    type::TextureDimension dim;
+    core::type::TextureDimension dim;
     TextureDataType datatype;
     std::string result;
 };
@@ -413,99 +414,99 @@
                          GlslSampledTexturesTest,
                          testing::Values(
                              GlslSampledTextureData{
-                                 type::TextureDimension::k1d,
+                                 core::type::TextureDimension::k1d,
                                  TextureDataType::F32,
                                  "sampler1D tex;",
                              },
                              GlslSampledTextureData{
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  TextureDataType::F32,
                                  "sampler2D tex;",
                              },
                              GlslSampledTextureData{
-                                 type::TextureDimension::k2dArray,
+                                 core::type::TextureDimension::k2dArray,
                                  TextureDataType::F32,
                                  "sampler2DArray tex;",
                              },
                              GlslSampledTextureData{
-                                 type::TextureDimension::k3d,
+                                 core::type::TextureDimension::k3d,
                                  TextureDataType::F32,
                                  "sampler3D tex;",
                              },
                              GlslSampledTextureData{
-                                 type::TextureDimension::kCube,
+                                 core::type::TextureDimension::kCube,
                                  TextureDataType::F32,
                                  "samplerCube tex;",
                              },
                              GlslSampledTextureData{
-                                 type::TextureDimension::kCubeArray,
+                                 core::type::TextureDimension::kCubeArray,
                                  TextureDataType::F32,
                                  "samplerCubeArray tex;",
                              },
                              GlslSampledTextureData{
-                                 type::TextureDimension::k1d,
+                                 core::type::TextureDimension::k1d,
                                  TextureDataType::U32,
                                  "usampler1D tex;",
                              },
                              GlslSampledTextureData{
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  TextureDataType::U32,
                                  "usampler2D tex;",
                              },
                              GlslSampledTextureData{
-                                 type::TextureDimension::k2dArray,
+                                 core::type::TextureDimension::k2dArray,
                                  TextureDataType::U32,
                                  "usampler2DArray tex;",
                              },
                              GlslSampledTextureData{
-                                 type::TextureDimension::k3d,
+                                 core::type::TextureDimension::k3d,
                                  TextureDataType::U32,
                                  "usampler3D tex;",
                              },
                              GlslSampledTextureData{
-                                 type::TextureDimension::kCube,
+                                 core::type::TextureDimension::kCube,
                                  TextureDataType::U32,
                                  "usamplerCube tex;",
                              },
                              GlslSampledTextureData{
-                                 type::TextureDimension::kCubeArray,
+                                 core::type::TextureDimension::kCubeArray,
                                  TextureDataType::U32,
                                  "usamplerCubeArray tex;",
                              },
                              GlslSampledTextureData{
-                                 type::TextureDimension::k1d,
+                                 core::type::TextureDimension::k1d,
                                  TextureDataType::I32,
                                  "isampler1D tex;",
                              },
                              GlslSampledTextureData{
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  TextureDataType::I32,
                                  "isampler2D tex;",
                              },
                              GlslSampledTextureData{
-                                 type::TextureDimension::k2dArray,
+                                 core::type::TextureDimension::k2dArray,
                                  TextureDataType::I32,
                                  "isampler2DArray tex;",
                              },
                              GlslSampledTextureData{
-                                 type::TextureDimension::k3d,
+                                 core::type::TextureDimension::k3d,
                                  TextureDataType::I32,
                                  "isampler3D tex;",
                              },
                              GlslSampledTextureData{
-                                 type::TextureDimension::kCube,
+                                 core::type::TextureDimension::kCube,
                                  TextureDataType::I32,
                                  "isamplerCube tex;",
                              },
                              GlslSampledTextureData{
-                                 type::TextureDimension::kCubeArray,
+                                 core::type::TextureDimension::kCubeArray,
                                  TextureDataType::I32,
                                  "isamplerCubeArray tex;",
                              }));
 
 TEST_F(GlslASTPrinterTest_Type, EmitMultisampledTexture) {
-    auto* f32 = create<type::F32>();
-    auto* s = create<type::MultisampledTexture>(type::TextureDimension::k2d, f32);
+    auto* f32 = create<core::type::F32>();
+    auto* s = create<core::type::MultisampledTexture>(core::type::TextureDimension::k2d, f32);
 
     ASTPrinter& gen = Build();
 
@@ -516,7 +517,7 @@
 }
 
 struct GlslStorageTextureData {
-    type::TextureDimension dim;
+    core::type::TextureDimension dim;
     core::TexelFormat imgfmt;
     std::string result;
 };
@@ -549,31 +550,31 @@
 INSTANTIATE_TEST_SUITE_P(
     GlslASTPrinterTest_Type,
     GlslStorageTexturesTest,
-    testing::Values(GlslStorageTextureData{type::TextureDimension::k1d,
+    testing::Values(GlslStorageTextureData{core::type::TextureDimension::k1d,
                                            core::TexelFormat::kRgba8Unorm, "image1D tex;"},
-                    GlslStorageTextureData{type::TextureDimension::k2d,
+                    GlslStorageTextureData{core::type::TextureDimension::k2d,
                                            core::TexelFormat::kRgba16Float, "image2D tex;"},
-                    GlslStorageTextureData{type::TextureDimension::k2dArray,
+                    GlslStorageTextureData{core::type::TextureDimension::k2dArray,
                                            core::TexelFormat::kR32Float, "image2DArray tex;"},
-                    GlslStorageTextureData{type::TextureDimension::k3d,
+                    GlslStorageTextureData{core::type::TextureDimension::k3d,
                                            core::TexelFormat::kRg32Float, "image3D tex;"},
-                    GlslStorageTextureData{type::TextureDimension::k1d,
+                    GlslStorageTextureData{core::type::TextureDimension::k1d,
                                            core::TexelFormat::kRgba32Float, "image1D tex;"},
-                    GlslStorageTextureData{type::TextureDimension::k2d,
+                    GlslStorageTextureData{core::type::TextureDimension::k2d,
                                            core::TexelFormat::kRgba16Uint, "image2D tex;"},
-                    GlslStorageTextureData{type::TextureDimension::k2dArray,
+                    GlslStorageTextureData{core::type::TextureDimension::k2dArray,
                                            core::TexelFormat::kR32Uint, "image2DArray tex;"},
-                    GlslStorageTextureData{type::TextureDimension::k3d,
+                    GlslStorageTextureData{core::type::TextureDimension::k3d,
                                            core::TexelFormat::kRg32Uint, "image3D tex;"},
-                    GlslStorageTextureData{type::TextureDimension::k1d,
+                    GlslStorageTextureData{core::type::TextureDimension::k1d,
                                            core::TexelFormat::kRgba32Uint, "image1D tex;"},
-                    GlslStorageTextureData{type::TextureDimension::k2d,
+                    GlslStorageTextureData{core::type::TextureDimension::k2d,
                                            core::TexelFormat::kRgba16Sint, "image2D tex;"},
-                    GlslStorageTextureData{type::TextureDimension::k2dArray,
+                    GlslStorageTextureData{core::type::TextureDimension::k2dArray,
                                            core::TexelFormat::kR32Sint, "image2DArray tex;"},
-                    GlslStorageTextureData{type::TextureDimension::k3d,
+                    GlslStorageTextureData{core::type::TextureDimension::k3d,
                                            core::TexelFormat::kRg32Sint, "image3D tex;"},
-                    GlslStorageTextureData{type::TextureDimension::k1d,
+                    GlslStorageTextureData{core::type::TextureDimension::k1d,
                                            core::TexelFormat::kRgba32Sint, "image1D tex;"}));
 
 }  // namespace
diff --git a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
index 40fc56a..d9de220 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
@@ -412,7 +412,7 @@
 }
 
 bool ASTPrinter::EmitDynamicVectorAssignment(const ast::AssignmentStatement* stmt,
-                                             const type::Vector* vec) {
+                                             const core::type::Vector* vec) {
     auto name = tint::GetOrCreate(dynamic_vector_write_, vec, [&]() -> std::string {
         std::string fn;
         {
@@ -485,7 +485,7 @@
 }
 
 bool ASTPrinter::EmitDynamicMatrixVectorAssignment(const ast::AssignmentStatement* stmt,
-                                                   const type::Matrix* mat) {
+                                                   const core::type::Matrix* mat) {
     auto name = tint::GetOrCreate(dynamic_matrix_vector_write_, mat, [&]() -> std::string {
         std::string fn;
         {
@@ -551,7 +551,7 @@
 }
 
 bool ASTPrinter::EmitDynamicMatrixScalarAssignment(const ast::AssignmentStatement* stmt,
-                                                   const type::Matrix* mat) {
+                                                   const core::type::Matrix* mat) {
     auto* lhs_row_access = stmt->lhs->As<ast::IndexAccessorExpression>();
     auto* lhs_col_access = lhs_row_access->object->As<ast::IndexAccessorExpression>();
 
@@ -610,7 +610,7 @@
                                 default: {
                                     auto* vec = TypeOf(lhs_row_access->object)
                                                     ->UnwrapRef()
-                                                    ->As<type::Vector>();
+                                                    ->As<core::type::Vector>();
                                     TINT_UNREACHABLE() << "invalid vector size " << vec->Width();
                                     break;
                                 }
@@ -686,12 +686,12 @@
     }
 
     // Handle the f16 types using polyfill functions
-    if (src_el_type->Is<type::F16>() || dst_el_type->Is<type::F16>()) {
+    if (src_el_type->Is<core::type::F16>() || dst_el_type->Is<core::type::F16>()) {
         auto f16_bitcast_polyfill = [&]() {
-            if (src_el_type->Is<type::F16>()) {
+            if (src_el_type->Is<core::type::F16>()) {
                 // Source type must be vec2<f16> or vec4<f16>, since type f16 and vec3<f16> can only
                 // have identity bitcast.
-                auto* src_vec = src_type->As<type::Vector>();
+                auto* src_vec = src_type->As<core::type::Vector>();
                 TINT_ASSERT(src_vec);
                 TINT_ASSERT(((src_vec->Width() == 2u) || (src_vec->Width() == 4u)));
 
@@ -755,14 +755,15 @@
                     });
             } else {
                 // Destination type must be vec2<f16> or vec4<f16>.
-                auto* dst_vec = dst_type->As<type::Vector>();
+                auto* dst_vec = dst_type->As<core::type::Vector>();
                 TINT_ASSERT((dst_vec && ((dst_vec->Width() == 2u) || (dst_vec->Width() == 4u)) &&
-                             dst_el_type->Is<type::F16>()));
+                             dst_el_type->Is<core::type::F16>()));
                 // Source type must be f32/i32/u32 or vec2<f32/i32/u32>.
-                auto* src_vec = src_type->As<type::Vector>();
-                TINT_ASSERT((src_type->IsAnyOf<type::I32, type::U32, type::F32>() ||
-                             (src_vec && src_vec->Width() == 2u &&
-                              src_el_type->IsAnyOf<type::I32, type::U32, type::F32>())));
+                auto* src_vec = src_type->As<core::type::Vector>();
+                TINT_ASSERT(
+                    (src_type->IsAnyOf<core::type::I32, core::type::U32, core::type::F32>() ||
+                     (src_vec && src_vec->Width() == 2u &&
+                      src_el_type->IsAnyOf<core::type::I32, core::type::U32, core::type::F32>())));
                 std::string src_type_suffix = (src_vec ? "2" : "");
 
                 // Bitcast other types to f16 types by reinterpreting their bits as f16 using
@@ -849,7 +850,7 @@
     }
 
     // Otherwise, bitcasting between non-f16 types.
-    TINT_ASSERT((!src_el_type->Is<type::F16>() && !dst_el_type->Is<type::F16>()));
+    TINT_ASSERT((!src_el_type->Is<core::type::F16>() && !dst_el_type->Is<core::type::F16>()));
     out << "as";
     if (!EmitType(out, dst_el_type, core::AddressSpace::kUndefined, core::Access::kReadWrite, "")) {
         return false;
@@ -867,7 +868,7 @@
         // BUG(crbug.com/tint/1333): work around assignment of scalar to matrices
         // with at least one dynamic index
         if (auto* lhs_sub_access = lhs_access->object->As<ast::IndexAccessorExpression>()) {
-            if (auto* mat = TypeOf(lhs_sub_access->object)->UnwrapRef()->As<type::Matrix>()) {
+            if (auto* mat = TypeOf(lhs_sub_access->object)->UnwrapRef()->As<core::type::Matrix>()) {
                 auto* rhs_row_idx_sem = builder_.Sem().GetVal(lhs_access->index);
                 auto* rhs_col_idx_sem = builder_.Sem().GetVal(lhs_sub_access->index);
                 if (!rhs_row_idx_sem->ConstantValue() || !rhs_col_idx_sem->ConstantValue()) {
@@ -878,7 +879,7 @@
         // BUG(crbug.com/tint/1333): work around assignment of vector to matrices
         // with dynamic indices
         const auto* lhs_access_type = TypeOf(lhs_access->object)->UnwrapRef();
-        if (auto* mat = lhs_access_type->As<type::Matrix>()) {
+        if (auto* mat = lhs_access_type->As<core::type::Matrix>()) {
             auto* lhs_index_sem = builder_.Sem().GetVal(lhs_access->index);
             if (!lhs_index_sem->ConstantValue()) {
                 return EmitDynamicMatrixVectorAssignment(stmt, mat);
@@ -886,7 +887,7 @@
         }
         // BUG(crbug.com/tint/534): work around assignment to vectors with dynamic
         // indices
-        if (auto* vec = lhs_access_type->As<type::Vector>()) {
+        if (auto* vec = lhs_access_type->As<core::type::Vector>()) {
             auto* rhs_sem = builder_.Sem().GetVal(lhs_access->index);
             if (!rhs_sem->ConstantValue()) {
                 return EmitDynamicVectorAssignment(stmt, vec);
@@ -946,9 +947,9 @@
     // Multiplying by a matrix requires the use of `mul` in order to get the
     // type of multiply we desire.
     if (expr->op == core::BinaryOp::kMultiply &&
-        ((lhs_type->Is<type::Vector>() && rhs_type->Is<type::Matrix>()) ||
-         (lhs_type->Is<type::Matrix>() && rhs_type->Is<type::Vector>()) ||
-         (lhs_type->Is<type::Matrix>() && rhs_type->Is<type::Matrix>()))) {
+        ((lhs_type->Is<core::type::Vector>() && rhs_type->Is<core::type::Matrix>()) ||
+         (lhs_type->Is<core::type::Matrix>() && rhs_type->Is<core::type::Vector>()) ||
+         (lhs_type->Is<core::type::Matrix>() && rhs_type->Is<core::type::Matrix>()))) {
         // Matrices are transposed, so swap LHS and RHS.
         out << "mul(";
         if (!EmitExpression(out, expr->rhs)) {
@@ -1282,7 +1283,7 @@
 
     // Single parameter matrix initializers must be identity initializer.
     // It could also be conversions between f16 and f32 matrix when f16 is properly supported.
-    if (type->Is<type::Matrix>() && call->Arguments().Length() == 1) {
+    if (type->Is<core::type::Matrix>() && call->Arguments().Length() == 1) {
         if (!ctor->Parameters()[0]->Type()->UnwrapRef()->is_float_matrix()) {
             TINT_UNREACHABLE()
                 << "found a single-parameter matrix initializer that is not identity initializer";
@@ -1290,13 +1291,13 @@
         }
     }
 
-    bool brackets = type->IsAnyOf<type::Array, type::Struct>();
+    bool brackets = type->IsAnyOf<core::type::Array, core::type::Struct>();
 
     // For single-value vector initializers, swizzle the scalar to the right
     // vector dimension using .x
-    const bool is_single_value_vector_init = type->is_scalar_vector() &&
-                                             call->Arguments().Length() == 1 &&
-                                             ctor->Parameters()[0]->Type()->Is<type::Scalar>();
+    const bool is_single_value_vector_init =
+        type->is_scalar_vector() && call->Arguments().Length() == 1 &&
+        ctor->Parameters()[0]->Type()->Is<core::type::Scalar>();
 
     if (brackets) {
         out << "{";
@@ -1324,7 +1325,7 @@
     }
 
     if (is_single_value_vector_init) {
-        out << ")." << std::string(type->As<type::Vector>()->Width(), 'x');
+        out << ")." << std::string(type->As<core::type::Vector>()->Width(), 'x');
     }
 
     out << (brackets ? "}" : ")");
@@ -1353,7 +1354,7 @@
     bool scalar_offset_constant = false;
 
     if (auto* val = builder_.Sem().GetVal(offset)->ConstantValue()) {
-        TINT_ASSERT(val->Type()->Is<type::U32>());
+        TINT_ASSERT(val->Type()->Is<core::type::U32>());
         scalar_offset_bytes = static_cast<uint32_t>(val->ValueAs<AInt>());
         scalar_offset_index = scalar_offset_bytes / 4;  // bytes -> scalar index
         scalar_offset_constant = true;
@@ -1923,7 +1924,7 @@
             return true;
         }
         case Op::kAtomicCompareExchangeWeak: {
-            if (!EmitStructType(&helpers_, result_ty->As<type::Struct>())) {
+            if (!EmitStructType(&helpers_, result_ty->As<core::type::Struct>())) {
                 return false;
             }
 
@@ -1990,7 +1991,7 @@
                                          const sem::Builtin* builtin) {
     std::string result = UniqueIdentifier("atomic_result");
 
-    if (!builtin->ReturnType()->Is<type::Void>()) {
+    if (!builtin->ReturnType()->Is<core::type::Void>()) {
         auto pre = Line();
         if (!EmitTypeAndName(pre, builtin->ReturnType(), core::AddressSpace::kUndefined,
                              core::Access::kUndefined, result)) {
@@ -2082,7 +2083,7 @@
             return true;
         }
         case core::Function::kAtomicCompareExchangeWeak: {
-            if (!EmitStructType(&helpers_, builtin->ReturnType()->As<type::Struct>())) {
+            if (!EmitStructType(&helpers_, builtin->ReturnType()->As<core::type::Struct>())) {
                 return false;
             }
 
@@ -2193,13 +2194,13 @@
             auto in = params[0];
 
             std::string width;
-            if (auto* vec = ty->As<type::Vector>()) {
+            if (auto* vec = ty->As<core::type::Vector>()) {
                 width = std::to_string(vec->Width());
             }
 
             // Emit the builtin return type unique to this overload. This does not
             // exist in the AST, so it will not be generated in Generate().
-            if (!EmitStructType(&helpers_, builtin->ReturnType()->As<type::Struct>())) {
+            if (!EmitStructType(&helpers_, builtin->ReturnType()->As<core::type::Struct>())) {
                 return false;
             }
 
@@ -2226,18 +2227,18 @@
             auto in = params[0];
 
             std::string width;
-            if (auto* vec = ty->As<type::Vector>()) {
+            if (auto* vec = ty->As<core::type::Vector>()) {
                 width = std::to_string(vec->Width());
             }
 
             // Emit the builtin return type unique to this overload. This does not
             // exist in the AST, so it will not be generated in Generate().
-            if (!EmitStructType(&helpers_, builtin->ReturnType()->As<type::Struct>())) {
+            if (!EmitStructType(&helpers_, builtin->ReturnType()->As<core::type::Struct>())) {
                 return false;
             }
 
             std::string member_type;
-            if (Is<type::F16>(ty->DeepestElement())) {
+            if (Is<core::type::F16>(ty->DeepestElement())) {
                 member_type = width.empty() ? "float16_t" : ("vector<float16_t, " + width + ">");
             } else {
                 member_type = "float" + width;
@@ -2301,7 +2302,7 @@
                                        const sem::Builtin* builtin) {
     // Cast to f16 and back
     std::string width;
-    if (auto* vec = builtin->ReturnType()->As<type::Vector>()) {
+    if (auto* vec = builtin->ReturnType()->As<core::type::Vector>()) {
         width = std::to_string(vec->Width());
     }
     out << "f16tof32(f32tof16"
@@ -2532,7 +2533,7 @@
         return false;
     }
 
-    auto* texture_type = TypeOf(texture)->UnwrapRef()->As<type::Texture>();
+    auto* texture_type = TypeOf(texture)->UnwrapRef()->As<core::type::Texture>();
 
     switch (builtin->Type()) {
         case core::Function::kTextureDimensions:
@@ -2540,35 +2541,35 @@
         case core::Function::kTextureNumLevels:
         case core::Function::kTextureNumSamples: {
             // All of these builtins use the GetDimensions() method on the texture
-            bool is_ms =
-                texture_type->IsAnyOf<type::MultisampledTexture, type::DepthMultisampledTexture>();
+            bool is_ms = texture_type->IsAnyOf<core::type::MultisampledTexture,
+                                               core::type::DepthMultisampledTexture>();
             int num_dimensions = 0;
             std::string swizzle;
 
             switch (builtin->Type()) {
                 case core::Function::kTextureDimensions:
                     switch (texture_type->dim()) {
-                        case type::TextureDimension::kNone:
+                        case core::type::TextureDimension::kNone:
                             TINT_ICE() << "texture dimension is kNone";
                             return false;
-                        case type::TextureDimension::k1d:
+                        case core::type::TextureDimension::k1d:
                             num_dimensions = 1;
                             break;
-                        case type::TextureDimension::k2d:
+                        case core::type::TextureDimension::k2d:
                             num_dimensions = is_ms ? 3 : 2;
                             swizzle = is_ms ? ".xy" : "";
                             break;
-                        case type::TextureDimension::k2dArray:
+                        case core::type::TextureDimension::k2dArray:
                             num_dimensions = is_ms ? 4 : 3;
                             swizzle = ".xy";
                             break;
-                        case type::TextureDimension::k3d:
+                        case core::type::TextureDimension::k3d:
                             num_dimensions = 3;
                             break;
-                        case type::TextureDimension::kCube:
+                        case core::type::TextureDimension::kCube:
                             num_dimensions = 2;
                             break;
-                        case type::TextureDimension::kCubeArray:
+                        case core::type::TextureDimension::kCubeArray:
                             num_dimensions = 3;
                             swizzle = ".xy";
                             break;
@@ -2579,11 +2580,11 @@
                         default:
                             TINT_ICE() << "texture dimension is not arrayed";
                             return false;
-                        case type::TextureDimension::k2dArray:
+                        case core::type::TextureDimension::k2dArray:
                             num_dimensions = is_ms ? 4 : 3;
                             swizzle = ".z";
                             break;
-                        case type::TextureDimension::kCubeArray:
+                        case core::type::TextureDimension::kCubeArray:
                             num_dimensions = 3;
                             swizzle = ".z";
                             break;
@@ -2594,18 +2595,18 @@
                         default:
                             TINT_ICE() << "texture dimension does not support mips";
                             return false;
-                        case type::TextureDimension::k1d:
+                        case core::type::TextureDimension::k1d:
                             num_dimensions = 2;
                             swizzle = ".y";
                             break;
-                        case type::TextureDimension::k2d:
-                        case type::TextureDimension::kCube:
+                        case core::type::TextureDimension::k2d:
+                        case core::type::TextureDimension::kCube:
                             num_dimensions = 3;
                             swizzle = ".z";
                             break;
-                        case type::TextureDimension::k2dArray:
-                        case type::TextureDimension::k3d:
-                        case type::TextureDimension::kCubeArray:
+                        case core::type::TextureDimension::k2dArray:
+                        case core::type::TextureDimension::k3d:
+                        case core::type::TextureDimension::kCubeArray:
                             num_dimensions = 4;
                             swizzle = ".w";
                             break;
@@ -2616,11 +2617,11 @@
                         default:
                             TINT_ICE() << "texture dimension does not support multisampling";
                             return false;
-                        case type::TextureDimension::k2d:
+                        case core::type::TextureDimension::k2d:
                             num_dimensions = 3;
                             swizzle = ".z";
                             break;
-                        case type::TextureDimension::k2dArray:
+                        case core::type::TextureDimension::k2dArray:
                             num_dimensions = 4;
                             swizzle = ".w";
                             break;
@@ -2743,7 +2744,7 @@
         case core::Function::kTextureLoad:
             out << ".Load(";
             // Multisampled textures do not support mip-levels.
-            if (!texture_type->Is<type::MultisampledTexture>()) {
+            if (!texture_type->Is<core::type::MultisampledTexture>()) {
                 pack_level_in_coords = true;
             }
             break;
@@ -2794,7 +2795,7 @@
     }
 
     auto emit_vector_appended_with_i32_zero = [&](const ast::Expression* vector) {
-        auto* i32 = builder_.create<type::I32>();
+        auto* i32 = builder_.create<core::type::I32>();
         auto* zero = builder_.Expr(0_i);
         auto* stmt = builder_.Sem().Get(vector)->Stmt();
         builder_.Sem().Add(zero, builder_.create<sem::ValueExpression>(
@@ -2862,7 +2863,7 @@
         // HLSL builtin, we need to swizzle the expression to generate the correct
         // number of components.
         uint32_t wgsl_ret_width = 1;
-        if (auto* vec = builtin->ReturnType()->As<type::Vector>()) {
+        if (auto* vec = builtin->ReturnType()->As<core::type::Vector>()) {
             wgsl_ret_width = vec->Width();
         }
         if (wgsl_ret_width < hlsl_ret_width) {
@@ -3105,7 +3106,7 @@
         auto name = func->name->symbol.Name();
         // If the function returns an array, then we need to declare a typedef for
         // this.
-        if (sem->ReturnType()->Is<type::Array>()) {
+        if (sem->ReturnType()->Is<core::type::Array>()) {
             auto typedef_name = UniqueIdentifier(name + "_ret");
             auto pre = Line();
             pre << "typedef ";
@@ -3136,7 +3137,7 @@
             auto address_space = core::AddressSpace::kUndefined;
             auto access = core::Access::kUndefined;
 
-            if (auto* ptr = type->As<type::Pointer>()) {
+            if (auto* ptr = type->As<core::type::Pointer>()) {
                 type = ptr->StoreType();
                 switch (ptr->AddressSpace()) {
                     case core::AddressSpace::kStorage:
@@ -3168,7 +3169,7 @@
         out << ") {";
     }
 
-    if (sem->DiscardStatement() && !sem->ReturnType()->Is<type::Void>()) {
+    if (sem->DiscardStatement() && !sem->ReturnType()->Is<core::type::Void>()) {
         // BUG(crbug.com/tint/1081): work around non-void functions with discard
         // failing compilation sometimes
         if (!EmitFunctionBodyWithDiscard(func)) {
@@ -3192,7 +3193,7 @@
     // there is always an (unused) return statement.
 
     auto* sem = builder_.Sem().Get(func);
-    TINT_ASSERT(sem->DiscardStatement() && !sem->ReturnType()->Is<type::Void>());
+    TINT_ASSERT(sem->DiscardStatement() && !sem->ReturnType()->Is<core::type::Void>());
 
     ScopedIndent si(this);
     Line() << "if (true) {";
@@ -3310,12 +3311,12 @@
 
     const char* register_space = nullptr;
 
-    if (unwrapped_type->Is<type::Texture>()) {
+    if (unwrapped_type->Is<core::type::Texture>()) {
         register_space = "t";
-        if (unwrapped_type->Is<type::StorageTexture>()) {
+        if (unwrapped_type->Is<core::type::StorageTexture>()) {
             register_space = "u";
         }
-    } else if (unwrapped_type->Is<type::Sampler>()) {
+    } else if (unwrapped_type->Is<core::type::Sampler>()) {
         register_space = "s";
     }
 
@@ -3483,7 +3484,7 @@
         for (auto* var : func->params) {
             auto* sem = builder_.Sem().Get(var);
             auto* type = sem->Type();
-            if (TINT_UNLIKELY(!type->Is<type::Struct>())) {
+            if (TINT_UNLIKELY(!type->Is<core::type::Struct>())) {
                 // ICE likely indicates that the CanonicalizeEntryPointIO transform was
                 // not run, or a builtin parameter was added after it was run.
                 TINT_ICE() << "Unsupported non-struct entry point parameter";
@@ -3528,30 +3529,30 @@
                               bool is_variable_initializer) {
     return Switch(
         constant->Type(),  //
-        [&](const type::Bool*) {
+        [&](const core::type::Bool*) {
             out << (constant->ValueAs<AInt>() ? "true" : "false");
             return true;
         },
-        [&](const type::F32*) {
+        [&](const core::type::F32*) {
             PrintF32(out, constant->ValueAs<f32>());
             return true;
         },
-        [&](const type::F16*) {
+        [&](const core::type::F16*) {
             // emit a f16 scalar with explicit float16_t type declaration.
             out << "float16_t(";
             PrintF16(out, constant->ValueAs<f16>());
             out << ")";
             return true;
         },
-        [&](const type::I32*) {
+        [&](const core::type::I32*) {
             out << constant->ValueAs<AInt>();
             return true;
         },
-        [&](const type::U32*) {
+        [&](const core::type::U32*) {
             out << constant->ValueAs<AInt>() << "u";
             return true;
         },
-        [&](const type::Vector* v) {
+        [&](const core::type::Vector* v) {
             if (auto* splat = constant->As<core::constant::Splat>()) {
                 {
                     ScopedParen sp(out);
@@ -3582,7 +3583,7 @@
             }
             return true;
         },
-        [&](const type::Matrix* m) {
+        [&](const core::type::Matrix* m) {
             if (!EmitType(out, m, core::AddressSpace::kUndefined, core::Access::kUndefined, "")) {
                 return false;
             }
@@ -3599,7 +3600,7 @@
             }
             return true;
         },
-        [&](const type::Array* a) {
+        [&](const core::type::Array* a) {
             if (constant->AllZero()) {
                 out << "(";
                 if (!EmitType(out, a, core::AddressSpace::kUndefined, core::Access::kUndefined,
@@ -3616,7 +3617,7 @@
             auto count = a->ConstantCount();
             if (!count) {
                 diagnostics_.add_error(diag::System::Writer,
-                                       type::Array::kErrExpectedConstantCount);
+                                       core::type::Array::kErrExpectedConstantCount);
                 return false;
             }
 
@@ -3631,7 +3632,7 @@
 
             return true;
         },
-        [&](const type::Struct* s) {
+        [&](const core::type::Struct* s) {
             if (!EmitStructType(&helpers_, s)) {
                 return false;
             }
@@ -3718,30 +3719,30 @@
         });
 }
 
-bool ASTPrinter::EmitValue(StringStream& out, const type::Type* type, int value) {
+bool ASTPrinter::EmitValue(StringStream& out, const core::type::Type* type, int value) {
     return Switch(
         type,
-        [&](const type::Bool*) {
+        [&](const core::type::Bool*) {
             out << (value == 0 ? "false" : "true");
             return true;
         },
-        [&](const type::F32*) {
+        [&](const core::type::F32*) {
             out << value << ".0f";
             return true;
         },
-        [&](const type::F16*) {
+        [&](const core::type::F16*) {
             out << "float16_t(" << value << ".0h)";
             return true;
         },
-        [&](const type::I32*) {
+        [&](const core::type::I32*) {
             out << value;
             return true;
         },
-        [&](const type::U32*) {
+        [&](const core::type::U32*) {
             out << value << "u";
             return true;
         },
-        [&](const type::Vector* vec) {
+        [&](const core::type::Vector* vec) {
             if (!EmitType(out, type, core::AddressSpace::kUndefined, core::Access::kReadWrite,
                           "")) {
                 return false;
@@ -3757,7 +3758,7 @@
             }
             return true;
         },
-        [&](const type::Matrix* mat) {
+        [&](const core::type::Matrix* mat) {
             if (!EmitType(out, type, core::AddressSpace::kUndefined, core::Access::kReadWrite,
                           "")) {
                 return false;
@@ -3773,13 +3774,13 @@
             }
             return true;
         },
-        [&](const type::Struct*) {
+        [&](const core::type::Struct*) {
             out << "(";
             TINT_DEFER(out << ")" << value);
             return EmitType(out, type, core::AddressSpace::kUndefined, core::Access::kUndefined,
                             "");
         },
-        [&](const type::Array*) {
+        [&](const core::type::Array*) {
             out << "(";
             TINT_DEFER(out << ")" << value);
             return EmitType(out, type, core::AddressSpace::kUndefined, core::Access::kUndefined,
@@ -3792,7 +3793,7 @@
         });
 }
 
-bool ASTPrinter::EmitZeroValue(StringStream& out, const type::Type* type) {
+bool ASTPrinter::EmitZeroValue(StringStream& out, const core::type::Type* type) {
     return EmitValue(out, type, 0);
 }
 
@@ -4152,7 +4153,7 @@
 }
 
 bool ASTPrinter::EmitType(StringStream& out,
-                          const type::Type* type,
+                          const core::type::Type* type,
                           core::AddressSpace address_space,
                           core::Access access,
                           const std::string& name,
@@ -4181,11 +4182,11 @@
 
     return Switch(
         type,
-        [&](const type::Array* ary) {
-            const type::Type* base_type = ary;
+        [&](const core::type::Array* ary) {
+            const core::type::Type* base_type = ary;
             std::vector<uint32_t> sizes;
-            while (auto* arr = base_type->As<type::Array>()) {
-                if (TINT_UNLIKELY(arr->Count()->Is<type::RuntimeArrayCount>())) {
+            while (auto* arr = base_type->As<core::type::Array>()) {
+                if (TINT_UNLIKELY(arr->Count()->Is<core::type::RuntimeArrayCount>())) {
                     TINT_ICE()
                         << "runtime arrays may only exist in storage buffers, which should have "
                            "been transformed into a ByteAddressBuffer";
@@ -4194,7 +4195,7 @@
                 const auto count = arr->ConstantCount();
                 if (!count) {
                     diagnostics_.add_error(diag::System::Writer,
-                                           type::Array::kErrExpectedConstantCount);
+                                           core::type::Array::kErrExpectedConstantCount);
                     return false;
                 }
 
@@ -4215,24 +4216,24 @@
             }
             return true;
         },
-        [&](const type::Bool*) {
+        [&](const core::type::Bool*) {
             out << "bool";
             return true;
         },
-        [&](const type::F32*) {
+        [&](const core::type::F32*) {
             out << "float";
             return true;
         },
-        [&](const type::F16*) {
+        [&](const core::type::F16*) {
             out << "float16_t";
             return true;
         },
-        [&](const type::I32*) {
+        [&](const core::type::I32*) {
             out << "int";
             return true;
         },
-        [&](const type::Matrix* mat) {
-            if (mat->type()->Is<type::F16>()) {
+        [&](const core::type::Matrix* mat) {
+            if (mat->type()->Is<core::type::F16>()) {
                 // Use matrix<type, N, M> for f16 matrix
                 out << "matrix<";
                 if (!EmitType(out, mat->type(), address_space, access, "")) {
@@ -4254,12 +4255,12 @@
             out << mat->columns() << "x" << mat->rows();
             return true;
         },
-        [&](const type::Pointer*) {
+        [&](const core::type::Pointer*) {
             TINT_ICE() << "Attempting to emit pointer type. These should have "
                           "been removed with the SimplifyPointers transform";
             return false;
         },
-        [&](const type::Sampler* sampler) {
+        [&](const core::type::Sampler* sampler) {
             out << "Sampler";
             if (sampler->IsComparison()) {
                 out << "Comparison";
@@ -4267,20 +4268,20 @@
             out << "State";
             return true;
         },
-        [&](const type::Struct* str) {
+        [&](const core::type::Struct* str) {
             out << StructName(str);
             return true;
         },
-        [&](const type::Texture* tex) {
-            if (TINT_UNLIKELY(tex->Is<type::ExternalTexture>())) {
+        [&](const core::type::Texture* tex) {
+            if (TINT_UNLIKELY(tex->Is<core::type::ExternalTexture>())) {
                 TINT_ICE() << "Multiplanar external texture transform was not run.";
                 return false;
             }
 
-            auto* storage = tex->As<type::StorageTexture>();
-            auto* ms = tex->As<type::MultisampledTexture>();
-            auto* depth_ms = tex->As<type::DepthMultisampledTexture>();
-            auto* sampled = tex->As<type::SampledTexture>();
+            auto* storage = tex->As<core::type::StorageTexture>();
+            auto* ms = tex->As<core::type::MultisampledTexture>();
+            auto* depth_ms = tex->As<core::type::DepthMultisampledTexture>();
+            auto* sampled = tex->As<core::type::SampledTexture>();
 
             if (storage && storage->access() != core::Access::kRead) {
                 out << "RW";
@@ -4288,22 +4289,22 @@
             out << "Texture";
 
             switch (tex->dim()) {
-                case type::TextureDimension::k1d:
+                case core::type::TextureDimension::k1d:
                     out << "1D";
                     break;
-                case type::TextureDimension::k2d:
+                case core::type::TextureDimension::k2d:
                     out << ((ms || depth_ms) ? "2DMS" : "2D");
                     break;
-                case type::TextureDimension::k2dArray:
+                case core::type::TextureDimension::k2dArray:
                     out << ((ms || depth_ms) ? "2DMSArray" : "2DArray");
                     break;
-                case type::TextureDimension::k3d:
+                case core::type::TextureDimension::k3d:
                     out << "3D";
                     break;
-                case type::TextureDimension::kCube:
+                case core::type::TextureDimension::kCube:
                     out << "Cube";
                     break;
-                case type::TextureDimension::kCubeArray:
+                case core::type::TextureDimension::kCubeArray:
                     out << "CubeArray";
                     break;
                 default:
@@ -4324,11 +4325,11 @@
             } else if (sampled || ms) {
                 auto* subtype = sampled ? sampled->type() : ms->type();
                 out << "<";
-                if (subtype->Is<type::F32>()) {
+                if (subtype->Is<core::type::F32>()) {
                     out << "float4";
-                } else if (subtype->Is<type::I32>()) {
+                } else if (subtype->Is<core::type::I32>()) {
                     out << "int4";
-                } else if (TINT_LIKELY(subtype->Is<type::U32>())) {
+                } else if (TINT_LIKELY(subtype->Is<core::type::U32>())) {
                     out << "uint4";
                 } else {
                     TINT_ICE() << "Unsupported multisampled texture type";
@@ -4338,19 +4339,19 @@
             }
             return true;
         },
-        [&](const type::U32*) {
+        [&](const core::type::U32*) {
             out << "uint";
             return true;
         },
-        [&](const type::Vector* vec) {
+        [&](const core::type::Vector* vec) {
             auto width = vec->Width();
-            if (vec->type()->Is<type::F32>() && width >= 1 && width <= 4) {
+            if (vec->type()->Is<core::type::F32>() && width >= 1 && width <= 4) {
                 out << "float" << width;
-            } else if (vec->type()->Is<type::I32>() && width >= 1 && width <= 4) {
+            } else if (vec->type()->Is<core::type::I32>() && width >= 1 && width <= 4) {
                 out << "int" << width;
-            } else if (vec->type()->Is<type::U32>() && width >= 1 && width <= 4) {
+            } else if (vec->type()->Is<core::type::U32>() && width >= 1 && width <= 4) {
                 out << "uint" << width;
-            } else if (vec->type()->Is<type::Bool>() && width >= 1 && width <= 4) {
+            } else if (vec->type()->Is<core::type::Bool>() && width >= 1 && width <= 4) {
                 out << "bool" << width;
             } else {
                 // For example, use "vector<float16_t, N>" for f16 vector.
@@ -4362,10 +4363,10 @@
             }
             return true;
         },
-        [&](const type::Atomic* atomic) {
+        [&](const core::type::Atomic* atomic) {
             return EmitType(out, atomic->Type(), address_space, access, name);
         },
-        [&](const type::Void*) {
+        [&](const core::type::Void*) {
             out << "void";
             return true;
         },
@@ -4376,7 +4377,7 @@
 }
 
 bool ASTPrinter::EmitTypeAndName(StringStream& out,
-                                 const type::Type* type,
+                                 const core::type::Type* type,
                                  core::AddressSpace address_space,
                                  core::Access access,
                                  const std::string& name) {
@@ -4390,7 +4391,7 @@
     return true;
 }
 
-bool ASTPrinter::EmitStructType(TextBuffer* b, const type::Struct* str) {
+bool ASTPrinter::EmitStructType(TextBuffer* b, const core::type::Struct* str) {
     auto it = emitted_structs_.emplace(str);
     if (!it.second) {
         return true;
@@ -4412,14 +4413,16 @@
                 if (TINT_UNLIKELY(pipeline_stage_uses.size() != 1)) {
                     TINT_ICE() << "invalid entry point IO struct uses";
                 }
-                if (pipeline_stage_uses.count(type::PipelineStageUsage::kVertexInput)) {
+                if (pipeline_stage_uses.count(core::type::PipelineStageUsage::kVertexInput)) {
                     post += " : TEXCOORD" + std::to_string(location.value());
-                } else if (pipeline_stage_uses.count(type::PipelineStageUsage::kVertexOutput)) {
+                } else if (pipeline_stage_uses.count(
+                               core::type::PipelineStageUsage::kVertexOutput)) {
                     post += " : TEXCOORD" + std::to_string(location.value());
-                } else if (pipeline_stage_uses.count(type::PipelineStageUsage::kFragmentInput)) {
+                } else if (pipeline_stage_uses.count(
+                               core::type::PipelineStageUsage::kFragmentInput)) {
                     post += " : TEXCOORD" + std::to_string(location.value());
                 } else if (TINT_LIKELY(pipeline_stage_uses.count(
-                               type::PipelineStageUsage::kFragmentOutput))) {
+                               core::type::PipelineStageUsage::kFragmentOutput))) {
                     if (auto index = attributes.index) {
                         post += " : SV_Target" + std::to_string(location.value() + index.value());
                     } else {
@@ -4562,7 +4565,7 @@
                     }
                     auto param_name = "param_" + std::to_string(parameter_names.size());
                     const auto* ty = param->Type();
-                    if (auto* ptr = ty->As<type::Pointer>()) {
+                    if (auto* ptr = ty->As<core::type::Pointer>()) {
                         decl << "inout ";
                         ty = ptr->StoreType();
                     }
@@ -4608,7 +4611,7 @@
     return true;
 }
 
-std::string ASTPrinter::StructName(const type::Struct* s) {
+std::string ASTPrinter::StructName(const core::type::Struct* s) {
     auto name = s->Name().Name();
     if (HasPrefix(name, "__")) {
         name = tint::GetOrCreate(builtin_struct_names_, s,
diff --git a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.h b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.h
index 0e029fe..ca4489c 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.h
+++ b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.h
@@ -420,7 +420,7 @@
     /// then the boolean is set to true.
     /// @returns true if the type is emitted
     bool EmitType(StringStream& out,
-                  const type::Type* type,
+                  const core::type::Type* type,
                   core::AddressSpace address_space,
                   core::Access access,
                   const std::string& name,
@@ -433,7 +433,7 @@
     /// @param name the name to emit
     /// @returns true if the type is emitted
     bool EmitTypeAndName(StringStream& out,
-                         const type::Type* type,
+                         const core::type::Type* type,
                          core::AddressSpace address_space,
                          core::Access access,
                          const std::string& name);
@@ -442,7 +442,7 @@
     /// @param buffer the text buffer that the type declaration will be written to
     /// @param ty the struct to generate
     /// @returns true if the struct is emitted
-    bool EmitStructType(TextBuffer* buffer, const type::Struct* ty);
+    bool EmitStructType(TextBuffer* buffer, const core::type::Struct* ty);
     /// Handles a unary op expression
     /// @param out the output of the expression stream
     /// @param expr the expression to emit
@@ -453,12 +453,12 @@
     /// @param type the type to emit the value for
     /// @param value the value to emit
     /// @returns true if the value was successfully emitted.
-    bool EmitValue(StringStream& out, const type::Type* type, int value);
+    bool EmitValue(StringStream& out, const core::type::Type* type, int value);
     /// Emits the zero value for the given type
     /// @param out the output stream
     /// @param type the type to emit the value for
     /// @returns true if the zero value was successfully emitted.
-    bool EmitZeroValue(StringStream& out, const type::Type* type);
+    bool EmitZeroValue(StringStream& out, const core::type::Type* type);
     /// Handles generating a 'var' declaration
     /// @param var the variable to generate
     /// @returns true if the variable was emitted
@@ -474,7 +474,8 @@
     /// via an accessor expression
     /// @param vec the vector type being assigned to
     /// @returns true on success
-    bool EmitDynamicVectorAssignment(const ast::AssignmentStatement* stmt, const type::Vector* vec);
+    bool EmitDynamicVectorAssignment(const ast::AssignmentStatement* stmt,
+                                     const core::type::Vector* vec);
     /// Emits call to a helper matrix assignment function for the input assignment
     /// statement and matrix type. This is used to work around FXC issues where
     /// assignment of a vector to a matrix with a dynamic index causes compilation
@@ -484,7 +485,7 @@
     /// @param mat the matrix type being assigned to
     /// @returns true on success
     bool EmitDynamicMatrixVectorAssignment(const ast::AssignmentStatement* stmt,
-                                           const type::Matrix* mat);
+                                           const core::type::Matrix* mat);
     /// Emits call to a helper matrix assignment function for the input assignment
     /// statement and matrix type. This is used to work around FXC issues where
     /// assignment of a scalar to a matrix with at least one dynamic index causes
@@ -494,7 +495,7 @@
     /// @param mat the matrix type being assigned to
     /// @returns true on success
     bool EmitDynamicMatrixScalarAssignment(const ast::AssignmentStatement* stmt,
-                                           const type::Matrix* mat);
+                                           const core::type::Matrix* mat);
 
     /// Handles generating a builtin method name
     /// @param builtin the semantic info for the builtin
@@ -535,7 +536,8 @@
     };
 
     /// The map key for two semantic types.
-    using BinaryType = tint::UnorderedKeyWrapper<std::tuple<const type::Type*, const type::Type*>>;
+    using BinaryType =
+        tint::UnorderedKeyWrapper<std::tuple<const core::type::Type*, const core::type::Type*>>;
 
     /// CallBuiltinHelper will call the builtin helper function, creating it
     /// if it hasn't been built already. If the builtin needs to be built then
@@ -560,7 +562,7 @@
     /// @returns the name of the structure, taking special care of builtin structures that start
     /// with double underscores. If the structure is a builtin, then the returned name will be a
     /// unique name without the leading underscores.
-    std::string StructName(const type::Struct* s);
+    std::string StructName(const core::type::Struct* s);
 
     /// @return a new, unique identifier with the given prefix.
     /// @param prefix optional prefix to apply to the generated identifier. If empty "tint_symbol"
@@ -579,18 +581,18 @@
     TextBuffer helpers_;
 
     /// Map of builtin structure to unique generated name
-    std::unordered_map<const type::Struct*, std::string> builtin_struct_names_;
+    std::unordered_map<const core::type::Struct*, std::string> builtin_struct_names_;
     std::function<bool()> emit_continuing_;
-    std::unordered_map<const type::Matrix*, std::string> matrix_scalar_inits_;
+    std::unordered_map<const core::type::Matrix*, std::string> matrix_scalar_inits_;
     std::unordered_map<const sem::Builtin*, std::string> builtins_;
     // Polyfill functions for bitcast expression, BinaryType indicates the source type and the
     // destination type.
     std::unordered_map<BinaryType, std::string> bitcast_funcs_;
-    std::unordered_map<const type::Vector*, std::string> dynamic_vector_write_;
-    std::unordered_map<const type::Matrix*, std::string> dynamic_matrix_vector_write_;
-    std::unordered_map<const type::Matrix*, std::string> dynamic_matrix_scalar_write_;
-    std::unordered_map<const type::Type*, std::string> value_or_one_if_zero_;
-    std::unordered_set<const type::Struct*> emitted_structs_;
+    std::unordered_map<const core::type::Vector*, std::string> dynamic_vector_write_;
+    std::unordered_map<const core::type::Matrix*, std::string> dynamic_matrix_vector_write_;
+    std::unordered_map<const core::type::Matrix*, std::string> dynamic_matrix_scalar_write_;
+    std::unordered_map<const core::type::Type*, std::string> value_or_one_if_zero_;
+    std::unordered_set<const core::type::Struct*> emitted_structs_;
 };
 
 }  // namespace tint::hlsl::writer
diff --git a/src/tint/lang/hlsl/writer/ast_printer/type_test.cc b/src/tint/lang/hlsl/writer/ast_printer/type_test.cc
index f7b2282..900670f 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/type_test.cc
+++ b/src/tint/lang/hlsl/writer/ast_printer/type_test.cc
@@ -86,7 +86,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Type, EmitType_Bool) {
-    auto* bool_ = create<type::Bool>();
+    auto* bool_ = create<core::type::Bool>();
 
     ASTPrinter& gen = Build();
 
@@ -98,7 +98,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Type, EmitType_F16) {
-    auto* f16 = create<type::F16>();
+    auto* f16 = create<core::type::F16>();
 
     ASTPrinter& gen = Build();
 
@@ -110,7 +110,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Type, EmitType_F32) {
-    auto* f32 = create<type::F32>();
+    auto* f32 = create<core::type::F32>();
 
     ASTPrinter& gen = Build();
 
@@ -122,7 +122,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Type, EmitType_I32) {
-    auto* i32 = create<type::I32>();
+    auto* i32 = create<core::type::I32>();
 
     ASTPrinter& gen = Build();
 
@@ -134,9 +134,9 @@
 }
 
 TEST_F(HlslASTPrinterTest_Type, EmitType_Matrix_F16) {
-    auto* f16 = create<type::F16>();
-    auto* vec3 = create<type::Vector>(f16, 3u);
-    auto* mat2x3 = create<type::Matrix>(vec3, 2u);
+    auto* f16 = create<core::type::F16>();
+    auto* vec3 = create<core::type::Vector>(f16, 3u);
+    auto* mat2x3 = create<core::type::Matrix>(vec3, 2u);
 
     ASTPrinter& gen = Build();
 
@@ -148,9 +148,9 @@
 }
 
 TEST_F(HlslASTPrinterTest_Type, EmitType_Matrix_F32) {
-    auto* f32 = create<type::F32>();
-    auto* vec3 = create<type::Vector>(f32, 3u);
-    auto* mat2x3 = create<type::Matrix>(vec3, 2u);
+    auto* f32 = create<core::type::F32>();
+    auto* vec3 = create<core::type::Vector>(f32, 3u);
+    auto* mat2x3 = create<core::type::Matrix>(vec3, 2u);
 
     ASTPrinter& gen = Build();
 
@@ -171,7 +171,7 @@
     ASTPrinter& gen = Build();
 
     tint::TextGenerator::TextBuffer buf;
-    auto* str = program->TypeOf(s)->As<type::Struct>();
+    auto* str = program->TypeOf(s)->As<core::type::Struct>();
     ASSERT_TRUE(gen.EmitStructType(&buf, str)) << gen.Diagnostics();
     EXPECT_EQ(buf.String(), R"(struct S {
   int a;
@@ -203,7 +203,7 @@
 
     ASTPrinter& gen = Build();
 
-    auto* str = program->TypeOf(s)->As<type::Struct>();
+    auto* str = program->TypeOf(s)->As<core::type::Struct>();
     StringStream out;
     ASSERT_TRUE(
         gen.EmitType(out, str, core::AddressSpace::kUndefined, core::Access::kReadWrite, ""))
@@ -238,7 +238,7 @@
     ASTPrinter& gen = Build();
 
     tint::TextGenerator::TextBuffer buf;
-    auto* str = program->TypeOf(s)->As<type::Struct>();
+    auto* str = program->TypeOf(s)->As<core::type::Struct>();
     ASSERT_TRUE(gen.EmitStructType(&buf, str)) << gen.Diagnostics();
     EXPECT_EQ(buf.String(), R"(struct S {
   int a;
@@ -248,7 +248,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Type, EmitType_U32) {
-    auto* u32 = create<type::U32>();
+    auto* u32 = create<core::type::U32>();
 
     ASTPrinter& gen = Build();
 
@@ -260,8 +260,8 @@
 }
 
 TEST_F(HlslASTPrinterTest_Type, EmitType_Vector) {
-    auto* f32 = create<type::F32>();
-    auto* vec3 = create<type::Vector>(f32, 3u);
+    auto* f32 = create<core::type::F32>();
+    auto* vec3 = create<core::type::Vector>(f32, 3u);
 
     ASTPrinter& gen = Build();
 
@@ -273,7 +273,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Type, EmitType_Void) {
-    auto* void_ = create<type::Void>();
+    auto* void_ = create<core::type::Void>();
 
     ASTPrinter& gen = Build();
 
@@ -285,7 +285,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Type, EmitSampler) {
-    auto* sampler = create<type::Sampler>(type::SamplerKind::kSampler);
+    auto* sampler = create<core::type::Sampler>(core::type::SamplerKind::kSampler);
 
     ASTPrinter& gen = Build();
 
@@ -297,7 +297,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Type, EmitSamplerComparison) {
-    auto* sampler = create<type::Sampler>(type::SamplerKind::kComparisonSampler);
+    auto* sampler = create<core::type::Sampler>(core::type::SamplerKind::kComparisonSampler);
 
     ASTPrinter& gen = Build();
 
@@ -309,7 +309,7 @@
 }
 
 struct HlslDepthTextureData {
-    type::TextureDimension dim;
+    core::type::TextureDimension dim;
     std::string result;
 };
 inline std::ostream& operator<<(std::ostream& out, HlslDepthTextureData data) {
@@ -342,18 +342,18 @@
 INSTANTIATE_TEST_SUITE_P(
     HlslASTPrinterTest_Type,
     HlslDepthTexturesTest,
-    testing::Values(HlslDepthTextureData{type::TextureDimension::k2d,
+    testing::Values(HlslDepthTextureData{core::type::TextureDimension::k2d,
                                          "Texture2D tex : register(t1, space2);"},
-                    HlslDepthTextureData{type::TextureDimension::k2dArray,
+                    HlslDepthTextureData{core::type::TextureDimension::k2dArray,
                                          "Texture2DArray tex : register(t1, space2);"},
-                    HlslDepthTextureData{type::TextureDimension::kCube,
+                    HlslDepthTextureData{core::type::TextureDimension::kCube,
                                          "TextureCube tex : register(t1, space2);"},
-                    HlslDepthTextureData{type::TextureDimension::kCubeArray,
+                    HlslDepthTextureData{core::type::TextureDimension::kCubeArray,
                                          "TextureCubeArray tex : register(t1, space2);"}));
 
 using HlslDepthMultisampledTexturesTest = TestHelper;
 TEST_F(HlslDepthMultisampledTexturesTest, Emit) {
-    auto t = ty.depth_multisampled_texture(type::TextureDimension::k2d);
+    auto t = ty.depth_multisampled_texture(core::type::TextureDimension::k2d);
 
     GlobalVar("tex", t, Binding(1_a), Group(2_a));
 
@@ -373,7 +373,7 @@
 
 enum class TextureDataType { F32, U32, I32 };
 struct HlslSampledTextureData {
-    type::TextureDimension dim;
+    core::type::TextureDimension dim;
     TextureDataType datatype;
     std::string result;
 };
@@ -420,99 +420,99 @@
                          HlslSampledTexturesTest,
                          testing::Values(
                              HlslSampledTextureData{
-                                 type::TextureDimension::k1d,
+                                 core::type::TextureDimension::k1d,
                                  TextureDataType::F32,
                                  "Texture1D<float4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  TextureDataType::F32,
                                  "Texture2D<float4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 type::TextureDimension::k2dArray,
+                                 core::type::TextureDimension::k2dArray,
                                  TextureDataType::F32,
                                  "Texture2DArray<float4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 type::TextureDimension::k3d,
+                                 core::type::TextureDimension::k3d,
                                  TextureDataType::F32,
                                  "Texture3D<float4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 type::TextureDimension::kCube,
+                                 core::type::TextureDimension::kCube,
                                  TextureDataType::F32,
                                  "TextureCube<float4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 type::TextureDimension::kCubeArray,
+                                 core::type::TextureDimension::kCubeArray,
                                  TextureDataType::F32,
                                  "TextureCubeArray<float4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 type::TextureDimension::k1d,
+                                 core::type::TextureDimension::k1d,
                                  TextureDataType::U32,
                                  "Texture1D<uint4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  TextureDataType::U32,
                                  "Texture2D<uint4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 type::TextureDimension::k2dArray,
+                                 core::type::TextureDimension::k2dArray,
                                  TextureDataType::U32,
                                  "Texture2DArray<uint4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 type::TextureDimension::k3d,
+                                 core::type::TextureDimension::k3d,
                                  TextureDataType::U32,
                                  "Texture3D<uint4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 type::TextureDimension::kCube,
+                                 core::type::TextureDimension::kCube,
                                  TextureDataType::U32,
                                  "TextureCube<uint4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 type::TextureDimension::kCubeArray,
+                                 core::type::TextureDimension::kCubeArray,
                                  TextureDataType::U32,
                                  "TextureCubeArray<uint4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 type::TextureDimension::k1d,
+                                 core::type::TextureDimension::k1d,
                                  TextureDataType::I32,
                                  "Texture1D<int4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  TextureDataType::I32,
                                  "Texture2D<int4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 type::TextureDimension::k2dArray,
+                                 core::type::TextureDimension::k2dArray,
                                  TextureDataType::I32,
                                  "Texture2DArray<int4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 type::TextureDimension::k3d,
+                                 core::type::TextureDimension::k3d,
                                  TextureDataType::I32,
                                  "Texture3D<int4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 type::TextureDimension::kCube,
+                                 core::type::TextureDimension::kCube,
                                  TextureDataType::I32,
                                  "TextureCube<int4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 type::TextureDimension::kCubeArray,
+                                 core::type::TextureDimension::kCubeArray,
                                  TextureDataType::I32,
                                  "TextureCubeArray<int4> tex : register(t1, space2);",
                              }));
 
 TEST_F(HlslASTPrinterTest_Type, EmitMultisampledTexture) {
-    auto* f32 = create<type::F32>();
-    auto* s = create<type::MultisampledTexture>(type::TextureDimension::k2d, f32);
+    auto* f32 = create<core::type::F32>();
+    auto* s = create<core::type::MultisampledTexture>(core::type::TextureDimension::k2d, f32);
 
     ASTPrinter& gen = Build();
 
@@ -523,7 +523,7 @@
 }
 
 struct HlslStorageTextureData {
-    type::TextureDimension dim;
+    core::type::TextureDimension dim;
     core::TexelFormat imgfmt;
     std::string result;
 };
@@ -562,31 +562,31 @@
     HlslASTPrinterTest_Type,
     HlslStorageTexturesTest,
     testing::Values(
-        HlslStorageTextureData{type::TextureDimension::k1d, core::TexelFormat::kRgba8Unorm,
+        HlslStorageTextureData{core::type::TextureDimension::k1d, core::TexelFormat::kRgba8Unorm,
                                "RWTexture1D<float4> tex : register(u1, space2);"},
-        HlslStorageTextureData{type::TextureDimension::k2d, core::TexelFormat::kRgba16Float,
+        HlslStorageTextureData{core::type::TextureDimension::k2d, core::TexelFormat::kRgba16Float,
                                "RWTexture2D<float4> tex : register(u1, space2);"},
-        HlslStorageTextureData{type::TextureDimension::k2dArray, core::TexelFormat::kR32Float,
+        HlslStorageTextureData{core::type::TextureDimension::k2dArray, core::TexelFormat::kR32Float,
                                "RWTexture2DArray<float4> tex : register(u1, space2);"},
-        HlslStorageTextureData{type::TextureDimension::k3d, core::TexelFormat::kRg32Float,
+        HlslStorageTextureData{core::type::TextureDimension::k3d, core::TexelFormat::kRg32Float,
                                "RWTexture3D<float4> tex : register(u1, space2);"},
-        HlslStorageTextureData{type::TextureDimension::k1d, core::TexelFormat::kRgba32Float,
+        HlslStorageTextureData{core::type::TextureDimension::k1d, core::TexelFormat::kRgba32Float,
                                "RWTexture1D<float4> tex : register(u1, space2);"},
-        HlslStorageTextureData{type::TextureDimension::k2d, core::TexelFormat::kRgba16Uint,
+        HlslStorageTextureData{core::type::TextureDimension::k2d, core::TexelFormat::kRgba16Uint,
                                "RWTexture2D<uint4> tex : register(u1, space2);"},
-        HlslStorageTextureData{type::TextureDimension::k2dArray, core::TexelFormat::kR32Uint,
+        HlslStorageTextureData{core::type::TextureDimension::k2dArray, core::TexelFormat::kR32Uint,
                                "RWTexture2DArray<uint4> tex : register(u1, space2);"},
-        HlslStorageTextureData{type::TextureDimension::k3d, core::TexelFormat::kRg32Uint,
+        HlslStorageTextureData{core::type::TextureDimension::k3d, core::TexelFormat::kRg32Uint,
                                "RWTexture3D<uint4> tex : register(u1, space2);"},
-        HlslStorageTextureData{type::TextureDimension::k1d, core::TexelFormat::kRgba32Uint,
+        HlslStorageTextureData{core::type::TextureDimension::k1d, core::TexelFormat::kRgba32Uint,
                                "RWTexture1D<uint4> tex : register(u1, space2);"},
-        HlslStorageTextureData{type::TextureDimension::k2d, core::TexelFormat::kRgba16Sint,
+        HlslStorageTextureData{core::type::TextureDimension::k2d, core::TexelFormat::kRgba16Sint,
                                "RWTexture2D<int4> tex : register(u1, space2);"},
-        HlslStorageTextureData{type::TextureDimension::k2dArray, core::TexelFormat::kR32Sint,
+        HlslStorageTextureData{core::type::TextureDimension::k2dArray, core::TexelFormat::kR32Sint,
                                "RWTexture2DArray<int4> tex : register(u1, space2);"},
-        HlslStorageTextureData{type::TextureDimension::k3d, core::TexelFormat::kRg32Sint,
+        HlslStorageTextureData{core::type::TextureDimension::k3d, core::TexelFormat::kRg32Sint,
                                "RWTexture3D<int4> tex : register(u1, space2);"},
-        HlslStorageTextureData{type::TextureDimension::k1d, core::TexelFormat::kRgba32Sint,
+        HlslStorageTextureData{core::type::TextureDimension::k1d, core::TexelFormat::kRgba32Sint,
                                "RWTexture1D<int4> tex : register(u1, space2);"}));
 
 }  // namespace
diff --git a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
index 1a017d8..b8a659d 100644
--- a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
@@ -98,14 +98,14 @@
   public:
     ScopedBitCast(ASTPrinter* generator,
                   StringStream& stream,
-                  const type::Type* curr_type,
-                  const type::Type* target_type)
+                  const core::type::Type* curr_type,
+                  const core::type::Type* target_type)
         : s(stream) {
-        auto* target_vec_type = target_type->As<type::Vector>();
+        auto* target_vec_type = target_type->As<core::type::Vector>();
 
         // If we need to promote from scalar to vector, bitcast the scalar to the
         // vector element type.
-        if (curr_type->Is<type::Scalar>() && target_vec_type) {
+        if (curr_type->Is<core::type::Scalar>() && target_vec_type) {
             target_type = target_vec_type->type();
         }
 
@@ -325,8 +325,8 @@
     return true;
 }
 
-bool ASTPrinter::EmitTypeDecl(const type::Type* ty) {
-    if (auto* str = ty->As<type::Struct>()) {
+bool ASTPrinter::EmitTypeDecl(const core::type::Type* ty) {
+    if (auto* str = ty->As<core::type::Struct>()) {
         if (!EmitStructType(current_buffer_, str)) {
             return false;
         }
@@ -465,20 +465,22 @@
         return true;
     };
 
-    auto signed_type_of = [&](const type::Type* ty) -> const type::Type* {
+    auto signed_type_of = [&](const core::type::Type* ty) -> const core::type::Type* {
         if (ty->is_integer_scalar()) {
-            return builder_.create<type::I32>();
-        } else if (auto* v = ty->As<type::Vector>()) {
-            return builder_.create<type::Vector>(builder_.create<type::I32>(), v->Width());
+            return builder_.create<core::type::I32>();
+        } else if (auto* v = ty->As<core::type::Vector>()) {
+            return builder_.create<core::type::Vector>(builder_.create<core::type::I32>(),
+                                                       v->Width());
         }
         return {};
     };
 
-    auto unsigned_type_of = [&](const type::Type* ty) -> const type::Type* {
+    auto unsigned_type_of = [&](const core::type::Type* ty) -> const core::type::Type* {
         if (ty->is_integer_scalar()) {
-            return builder_.create<type::U32>();
-        } else if (auto* v = ty->As<type::Vector>()) {
-            return builder_.create<type::Vector>(builder_.create<type::U32>(), v->Width());
+            return builder_.create<core::type::U32>();
+        } else if (auto* v = ty->As<core::type::Vector>()) {
+            return builder_.create<core::type::Vector>(builder_.create<core::type::U32>(),
+                                                       v->Width());
         }
         return {};
     };
@@ -506,9 +508,9 @@
         rhs_type->is_signed_integer_scalar_or_vector()) {
         // If lhs or rhs is a vector, use that type (support implicit scalar to
         // vector promotion)
-        auto* target_type = lhs_type->Is<type::Vector>()
+        auto* target_type = lhs_type->Is<core::type::Vector>()
                                 ? lhs_type
-                                : (rhs_type->Is<type::Vector>() ? rhs_type : lhs_type);
+                                : (rhs_type->Is<core::type::Vector>() ? rhs_type : lhs_type);
 
         // WGSL defines behaviour for signed overflow, MSL does not. For these
         // cases, bitcast operands to unsigned, then cast result to signed.
@@ -557,7 +559,7 @@
     }
 
     // Handle '&' and '|' of booleans.
-    if ((expr->IsAnd() || expr->IsOr()) && lhs_type->Is<type::Bool>()) {
+    if ((expr->IsAnd() || expr->IsOr()) && lhs_type->Is<core::type::Bool>()) {
         out << "bool";
         ScopedParen sp(out);
         if (!EmitExpression(out, expr->lhs)) {
@@ -677,7 +679,7 @@
         }
         case core::Function::kQuantizeToF16: {
             std::string width = "";
-            if (auto* vec = builtin->ReturnType()->As<type::Vector>()) {
+            if (auto* vec = builtin->ReturnType()->As<core::type::Vector>()) {
                 width = std::to_string(vec->Width());
             }
             out << "float" << width << "(half" << width << "(";
@@ -700,7 +702,7 @@
 
         case core::Function::kLength: {
             auto* sem = builder_.Sem().GetVal(expr->args[0]);
-            if (sem->Type()->UnwrapRef()->Is<type::Scalar>()) {
+            if (sem->Type()->UnwrapRef()->Is<core::type::Scalar>()) {
                 // Emulate scalar overload using fabs(x).
                 name = "fabs";
             }
@@ -709,7 +711,7 @@
 
         case core::Function::kDistance: {
             auto* sem = builder_.Sem().GetVal(expr->args[0]);
-            if (sem->Type()->UnwrapRef()->Is<type::Scalar>()) {
+            if (sem->Type()->UnwrapRef()->Is<core::type::Scalar>()) {
                 // Emulate scalar overload using fabs(x - y);
                 out << "fabs";
                 ScopedParen sp(out);
@@ -777,7 +779,7 @@
 
     bool ok = Switch(
         type,
-        [&](const type::Array*) {
+        [&](const core::type::Array*) {
             if (!EmitType(out, type)) {
                 return false;
             }
@@ -785,7 +787,7 @@
             terminator = "}";
             return true;
         },
-        [&](const type::Struct*) {
+        [&](const core::type::Struct*) {
             out << "{";
             terminator = "}";
             return true;
@@ -807,7 +809,7 @@
             out << ", ";
         }
 
-        if (auto* struct_ty = type->As<type::Struct>()) {
+        if (auto* struct_ty = type->As<core::type::Struct>()) {
             // Emit field designators for structures to account for padding members.
             auto name = struct_ty->Members()[i]->Name().Name();
             out << "." << name << "=";
@@ -878,13 +880,14 @@
             return call("atomic_exchange_explicit", true);
 
         case core::Function::kAtomicCompareExchangeWeak: {
-            auto* ptr_ty = TypeOf(expr->args[0])->UnwrapRef()->As<type::Pointer>();
+            auto* ptr_ty = TypeOf(expr->args[0])->UnwrapRef()->As<core::type::Pointer>();
             auto sc = ptr_ty->AddressSpace();
-            auto* str = builtin->ReturnType()->As<type::Struct>();
+            auto* str = builtin->ReturnType()->As<core::type::Struct>();
 
             auto func = tint::GetOrCreate(
                 atomicCompareExchangeWeak_, ACEWKeyType{{sc, str}}, [&]() -> std::string {
-                    if (!EmitStructType(&helpers_, builtin->ReturnType()->As<type::Struct>())) {
+                    if (!EmitStructType(&helpers_,
+                                        builtin->ReturnType()->As<core::type::Struct>())) {
                         return "";
                     }
 
@@ -895,7 +898,7 @@
 
                     {
                         auto f = Line(&buf);
-                        auto str_name = StructName(builtin->ReturnType()->As<type::Struct>());
+                        auto str_name = StructName(builtin->ReturnType()->As<core::type::Struct>());
                         f << str_name << " " << name << "(";
                         if (!EmitTypeAndName(f, atomic_ty, "atomic")) {
                             return "";
@@ -968,7 +971,7 @@
         return false;
     }
 
-    auto* texture_type = TypeOf(texture)->UnwrapRef()->As<type::Texture>();
+    auto* texture_type = TypeOf(texture)->UnwrapRef()->As<core::type::Texture>();
 
     // Helper to emit the texture expression, wrapped in parentheses if the
     // expression includes an operator with lower precedence than the member
@@ -989,25 +992,25 @@
     };
 
     // MSL requires that `lod` is a constant 0 for 1D textures.
-    bool level_is_constant_zero = texture_type->dim() == type::TextureDimension::k1d;
+    bool level_is_constant_zero = texture_type->dim() == core::type::TextureDimension::k1d;
 
     switch (builtin->Type()) {
         case core::Function::kTextureDimensions: {
             std::vector<const char*> dims;
             switch (texture_type->dim()) {
-                case type::TextureDimension::kNone:
+                case core::type::TextureDimension::kNone:
                     diagnostics_.add_error(diag::System::Writer, "texture dimension is kNone");
                     return false;
-                case type::TextureDimension::k1d:
+                case core::type::TextureDimension::k1d:
                     dims = {"width"};
                     break;
-                case type::TextureDimension::k2d:
-                case type::TextureDimension::k2dArray:
-                case type::TextureDimension::kCube:
-                case type::TextureDimension::kCubeArray:
+                case core::type::TextureDimension::k2d:
+                case core::type::TextureDimension::k2dArray:
+                case core::type::TextureDimension::kCube:
+                case core::type::TextureDimension::kCubeArray:
                     dims = {"width", "height"};
                     break;
-                case type::TextureDimension::k3d:
+                case core::type::TextureDimension::k3d:
                     dims = {"width", "height", "depth"};
                     break;
             }
@@ -1123,14 +1126,14 @@
             if (usage == Usage::kCoords && e->Type()->UnwrapRef()->is_integer_scalar_or_vector()) {
                 casted = true;
                 switch (texture_type->dim()) {
-                    case type::TextureDimension::k1d:
+                    case core::type::TextureDimension::k1d:
                         out << "uint(";
                         break;
-                    case type::TextureDimension::k2d:
-                    case type::TextureDimension::k2dArray:
+                    case core::type::TextureDimension::k2d:
+                    case core::type::TextureDimension::k2dArray:
                         out << "uint2(";
                         break;
-                    case type::TextureDimension::k3d:
+                    case core::type::TextureDimension::k3d:
                         out << "uint3(";
                         break;
                     default:
@@ -1180,17 +1183,17 @@
     if (auto* ddx = arg(Usage::kDdx)) {
         auto dim = texture_type->dim();
         switch (dim) {
-            case type::TextureDimension::k2d:
-            case type::TextureDimension::k2dArray:
+            case core::type::TextureDimension::k2d:
+            case core::type::TextureDimension::k2dArray:
                 maybe_write_comma();
                 out << "gradient2d(";
                 break;
-            case type::TextureDimension::k3d:
+            case core::type::TextureDimension::k3d:
                 maybe_write_comma();
                 out << "gradient3d(";
                 break;
-            case type::TextureDimension::kCube:
-            case type::TextureDimension::kCubeArray:
+            case core::type::TextureDimension::kCube:
+            case core::type::TextureDimension::kCubeArray:
                 maybe_write_comma();
                 out << "gradientcube(";
                 break;
@@ -1225,8 +1228,8 @@
         if (!has_offset) {
             // offset argument may need to be provided if we have a component.
             switch (texture_type->dim()) {
-                case type::TextureDimension::k2d:
-                case type::TextureDimension::k2dArray:
+                case core::type::TextureDimension::k2d:
+                case core::type::TextureDimension::k2dArray:
                     out << "int2(0), ";
                     break;
                 default:
@@ -1261,7 +1264,7 @@
 bool ASTPrinter::EmitDotCall(StringStream& out,
                              const ast::CallExpression* expr,
                              const sem::Builtin* builtin) {
-    auto* vec_ty = builtin->Parameters()[0]->Type()->As<type::Vector>();
+    auto* vec_ty = builtin->Parameters()[0]->Type()->As<core::type::Vector>();
     std::string fn = "dot";
     if (vec_ty->type()->is_integer_scalar()) {
         // MSL does not have a builtin for dot() with integer vector types.
@@ -1312,17 +1315,17 @@
             auto in = params[0];
 
             std::string width;
-            if (auto* vec = ty->As<type::Vector>()) {
+            if (auto* vec = ty->As<core::type::Vector>()) {
                 width = std::to_string(vec->Width());
             }
 
             // Emit the builtin return type unique to this overload. This does not
             // exist in the AST, so it will not be generated in Generate().
-            if (!EmitStructType(&helpers_, builtin->ReturnType()->As<type::Struct>())) {
+            if (!EmitStructType(&helpers_, builtin->ReturnType()->As<core::type::Struct>())) {
                 return false;
             }
 
-            Line(b) << StructName(builtin->ReturnType()->As<type::Struct>()) << " result;";
+            Line(b) << StructName(builtin->ReturnType()->As<core::type::Struct>()) << " result;";
             Line(b) << "result.fract = modf(" << in << ", result.whole);";
             Line(b) << "return result;";
             return true;
@@ -1338,17 +1341,17 @@
             auto in = params[0];
 
             std::string width;
-            if (auto* vec = ty->As<type::Vector>()) {
+            if (auto* vec = ty->As<core::type::Vector>()) {
                 width = std::to_string(vec->Width());
             }
 
             // Emit the builtin return type unique to this overload. This does not
             // exist in the AST, so it will not be generated in Generate().
-            if (!EmitStructType(&helpers_, builtin->ReturnType()->As<type::Struct>())) {
+            if (!EmitStructType(&helpers_, builtin->ReturnType()->As<core::type::Struct>())) {
                 return false;
             }
 
-            Line(b) << StructName(builtin->ReturnType()->As<type::Struct>()) << " result;";
+            Line(b) << StructName(builtin->ReturnType()->As<core::type::Struct>()) << " result;";
             Line(b) << "result.fract = frexp(" << in << ", result.exp);";
             Line(b) << "return result;";
             return true;
@@ -1578,44 +1581,44 @@
     return true;
 }
 
-bool ASTPrinter::EmitZeroValue(StringStream& out, const type::Type* type) {
+bool ASTPrinter::EmitZeroValue(StringStream& out, const core::type::Type* type) {
     return Switch(
         type,
-        [&](const type::Bool*) {
+        [&](const core::type::Bool*) {
             out << "false";
             return true;
         },
-        [&](const type::F16*) {
+        [&](const core::type::F16*) {
             out << "0.0h";
             return true;
         },
-        [&](const type::F32*) {
+        [&](const core::type::F32*) {
             out << "0.0f";
             return true;
         },
-        [&](const type::I32*) {
+        [&](const core::type::I32*) {
             out << "0";
             return true;
         },
-        [&](const type::U32*) {
+        [&](const core::type::U32*) {
             out << "0u";
             return true;
         },
-        [&](const type::Vector* vec) {  //
+        [&](const core::type::Vector* vec) {  //
             return EmitZeroValue(out, vec->type());
         },
-        [&](const type::Matrix* mat) {
+        [&](const core::type::Matrix* mat) {
             if (!EmitType(out, mat)) {
                 return false;
             }
             ScopedParen sp(out);
             return EmitZeroValue(out, mat->type());
         },
-        [&](const type::Array*) {
+        [&](const core::type::Array*) {
             out << "{}";
             return true;
         },
-        [&](const type::Struct*) {
+        [&](const core::type::Struct*) {
             out << "{}";
             return true;
         },
@@ -1629,27 +1632,27 @@
 bool ASTPrinter::EmitConstant(StringStream& out, const core::constant::Value* constant) {
     return Switch(
         constant->Type(),  //
-        [&](const type::Bool*) {
+        [&](const core::type::Bool*) {
             out << (constant->ValueAs<AInt>() ? "true" : "false");
             return true;
         },
-        [&](const type::F32*) {
+        [&](const core::type::F32*) {
             PrintF32(out, constant->ValueAs<f32>());
             return true;
         },
-        [&](const type::F16*) {
+        [&](const core::type::F16*) {
             PrintF16(out, constant->ValueAs<f16>());
             return true;
         },
-        [&](const type::I32*) {
+        [&](const core::type::I32*) {
             PrintI32(out, constant->ValueAs<i32>());
             return true;
         },
-        [&](const type::U32*) {
+        [&](const core::type::U32*) {
             out << constant->ValueAs<AInt>() << "u";
             return true;
         },
-        [&](const type::Vector* v) {
+        [&](const core::type::Vector* v) {
             if (!EmitType(out, v)) {
                 return false;
             }
@@ -1673,7 +1676,7 @@
             }
             return true;
         },
-        [&](const type::Matrix* m) {
+        [&](const core::type::Matrix* m) {
             if (!EmitType(out, m)) {
                 return false;
             }
@@ -1690,7 +1693,7 @@
             }
             return true;
         },
-        [&](const type::Array* a) {
+        [&](const core::type::Array* a) {
             if (!EmitType(out, a)) {
                 return false;
             }
@@ -1705,7 +1708,7 @@
             auto count = a->ConstantCount();
             if (!count) {
                 diagnostics_.add_error(diag::System::Writer,
-                                       type::Array::kErrExpectedConstantCount);
+                                       core::type::Array::kErrExpectedConstantCount);
                 return false;
             }
 
@@ -1720,7 +1723,7 @@
 
             return true;
         },
-        [&](const type::Struct* s) {
+        [&](const core::type::Struct* s) {
             if (!EmitStructType(&helpers_, s)) {
                 return false;
             }
@@ -1850,7 +1853,7 @@
             if (!EmitType(out, type)) {
                 return false;
             }
-            if (type->Is<type::Pointer>()) {
+            if (type->Is<core::type::Pointer>()) {
                 out << " const";
             }
             out << " " << v->name->symbol.Name();
@@ -1919,11 +1922,11 @@
 
             bool ok = Switch(
                 type,  //
-                [&](const type::Struct*) {
+                [&](const core::type::Struct*) {
                     out << " [[stage_in]]";
                     return true;
                 },
-                [&](const type::Texture*) {
+                [&](const core::type::Texture*) {
                     uint32_t binding = get_binding_index(param);
                     if (binding == kInvalidBindingIndex) {
                         return false;
@@ -1931,7 +1934,7 @@
                     out << " [[texture(" << binding << ")]]";
                     return true;
                 },
-                [&](const type::Sampler*) {
+                [&](const core::type::Sampler*) {
                     uint32_t binding = get_binding_index(param);
                     if (binding == kInvalidBindingIndex) {
                         return false;
@@ -1939,7 +1942,7 @@
                     out << " [[sampler(" << binding << ")]]";
                     return true;
                 },
-                [&](const type::Pointer* ptr) {
+                [&](const core::type::Pointer* ptr) {
                     switch (ptr->AddressSpace()) {
                         case core::AddressSpace::kWorkgroup: {
                             auto& allocations = workgroup_allocations_[func_name];
@@ -2427,34 +2430,34 @@
     return true;
 }
 
-bool ASTPrinter::EmitType(StringStream& out, const type::Type* type) {
+bool ASTPrinter::EmitType(StringStream& out, const core::type::Type* type) {
     return Switch(
         type,
-        [&](const type::Atomic* atomic) {
-            if (atomic->Type()->Is<type::I32>()) {
+        [&](const core::type::Atomic* atomic) {
+            if (atomic->Type()->Is<core::type::I32>()) {
                 out << "atomic_int";
                 return true;
             }
-            if (TINT_LIKELY(atomic->Type()->Is<type::U32>())) {
+            if (TINT_LIKELY(atomic->Type()->Is<core::type::U32>())) {
                 out << "atomic_uint";
                 return true;
             }
             TINT_ICE() << "unhandled atomic type " << atomic->Type()->FriendlyName();
             return false;
         },
-        [&](const type::Array* arr) {
+        [&](const core::type::Array* arr) {
             out << ArrayType() << "<";
             if (!EmitType(out, arr->ElemType())) {
                 return false;
             }
             out << ", ";
-            if (arr->Count()->Is<type::RuntimeArrayCount>()) {
+            if (arr->Count()->Is<core::type::RuntimeArrayCount>()) {
                 out << "1";
             } else {
                 auto count = arr->ConstantCount();
                 if (!count) {
                     diagnostics_.add_error(diag::System::Writer,
-                                           type::Array::kErrExpectedConstantCount);
+                                           core::type::Array::kErrExpectedConstantCount);
                     return false;
                 }
 
@@ -2463,30 +2466,30 @@
             out << ">";
             return true;
         },
-        [&](const type::Bool*) {
+        [&](const core::type::Bool*) {
             out << "bool";
             return true;
         },
-        [&](const type::F16*) {
+        [&](const core::type::F16*) {
             out << "half";
             return true;
         },
-        [&](const type::F32*) {
+        [&](const core::type::F32*) {
             out << "float";
             return true;
         },
-        [&](const type::I32*) {
+        [&](const core::type::I32*) {
             out << "int";
             return true;
         },
-        [&](const type::Matrix* mat) {
+        [&](const core::type::Matrix* mat) {
             if (!EmitType(out, mat->type())) {
                 return false;
             }
             out << mat->columns() << "x" << mat->rows();
             return true;
         },
-        [&](const type::Pointer* ptr) {
+        [&](const core::type::Pointer* ptr) {
             if (ptr->Access() == core::Access::kRead) {
                 out << "const ";
             }
@@ -2500,52 +2503,53 @@
             out << "*";
             return true;
         },
-        [&](const type::Sampler*) {
+        [&](const core::type::Sampler*) {
             out << "sampler";
             return true;
         },
-        [&](const type::Struct* str) {
+        [&](const core::type::Struct* str) {
             // The struct type emits as just the name. The declaration would be
             // emitted as part of emitting the declared types.
             out << StructName(str);
             return true;
         },
-        [&](const type::Texture* tex) {
-            if (TINT_UNLIKELY(tex->Is<type::ExternalTexture>())) {
+        [&](const core::type::Texture* tex) {
+            if (TINT_UNLIKELY(tex->Is<core::type::ExternalTexture>())) {
                 TINT_ICE() << "Multiplanar external texture transform was not run.";
                 return false;
             }
 
-            if (tex->IsAnyOf<type::DepthTexture, type::DepthMultisampledTexture>()) {
+            if (tex->IsAnyOf<core::type::DepthTexture, core::type::DepthMultisampledTexture>()) {
                 out << "depth";
             } else {
                 out << "texture";
             }
 
             switch (tex->dim()) {
-                case type::TextureDimension::k1d:
+                case core::type::TextureDimension::k1d:
                     out << "1d";
                     break;
-                case type::TextureDimension::k2d:
+                case core::type::TextureDimension::k2d:
                     out << "2d";
                     break;
-                case type::TextureDimension::k2dArray:
+                case core::type::TextureDimension::k2dArray:
                     out << "2d_array";
                     break;
-                case type::TextureDimension::k3d:
+                case core::type::TextureDimension::k3d:
                     out << "3d";
                     break;
-                case type::TextureDimension::kCube:
+                case core::type::TextureDimension::kCube:
                     out << "cube";
                     break;
-                case type::TextureDimension::kCubeArray:
+                case core::type::TextureDimension::kCubeArray:
                     out << "cube_array";
                     break;
                 default:
                     diagnostics_.add_error(diag::System::Writer, "Invalid texture dimensions");
                     return false;
             }
-            if (tex->IsAnyOf<type::MultisampledTexture, type::DepthMultisampledTexture>()) {
+            if (tex->IsAnyOf<core::type::MultisampledTexture,
+                             core::type::DepthMultisampledTexture>()) {
                 out << "_ms";
             }
             out << "<";
@@ -2553,15 +2557,15 @@
 
             return Switch(
                 tex,
-                [&](const type::DepthTexture*) {
+                [&](const core::type::DepthTexture*) {
                     out << "float, access::sample";
                     return true;
                 },
-                [&](const type::DepthMultisampledTexture*) {
+                [&](const core::type::DepthMultisampledTexture*) {
                     out << "float, access::read";
                     return true;
                 },
-                [&](const type::StorageTexture* storage) {
+                [&](const core::type::StorageTexture* storage) {
                     if (!EmitType(out, storage->type())) {
                         return false;
                     }
@@ -2578,14 +2582,14 @@
                     }
                     return true;
                 },
-                [&](const type::MultisampledTexture* ms) {
+                [&](const core::type::MultisampledTexture* ms) {
                     if (!EmitType(out, ms->type())) {
                         return false;
                     }
                     out << ", access::read";
                     return true;
                 },
-                [&](const type::SampledTexture* sampled) {
+                [&](const core::type::SampledTexture* sampled) {
                     if (!EmitType(out, sampled->type())) {
                         return false;
                     }
@@ -2597,11 +2601,11 @@
                     return false;
                 });
         },
-        [&](const type::U32*) {
+        [&](const core::type::U32*) {
             out << "uint";
             return true;
         },
-        [&](const type::Vector* vec) {
+        [&](const core::type::Vector* vec) {
             if (vec->Packed()) {
                 out << "packed_";
             }
@@ -2611,7 +2615,7 @@
             out << vec->Width();
             return true;
         },
-        [&](const type::Void*) {
+        [&](const core::type::Void*) {
             out << "void";
             return true;
         },
@@ -2623,7 +2627,7 @@
 }
 
 bool ASTPrinter::EmitTypeAndName(StringStream& out,
-                                 const type::Type* type,
+                                 const core::type::Type* type,
                                  const std::string& name) {
     if (!EmitType(out, type)) {
         return false;
@@ -2655,7 +2659,7 @@
     return false;
 }
 
-bool ASTPrinter::EmitStructType(TextBuffer* b, const type::Struct* str) {
+bool ASTPrinter::EmitStructType(TextBuffer* b, const core::type::Struct* str) {
     auto it = emitted_structs_.emplace(str);
     if (!it.second) {
         return true;
@@ -2734,14 +2738,14 @@
                 return false;
             }
 
-            if (pipeline_stage_uses.count(type::PipelineStageUsage::kVertexInput)) {
+            if (pipeline_stage_uses.count(core::type::PipelineStageUsage::kVertexInput)) {
                 out << " [[attribute(" + std::to_string(location.value()) + ")]]";
-            } else if (pipeline_stage_uses.count(type::PipelineStageUsage::kVertexOutput)) {
+            } else if (pipeline_stage_uses.count(core::type::PipelineStageUsage::kVertexOutput)) {
                 out << " [[user(locn" + std::to_string(location.value()) + ")]]";
-            } else if (pipeline_stage_uses.count(type::PipelineStageUsage::kFragmentInput)) {
+            } else if (pipeline_stage_uses.count(core::type::PipelineStageUsage::kFragmentInput)) {
                 out << " [[user(locn" + std::to_string(location.value()) + ")]]";
-            } else if (TINT_LIKELY(
-                           pipeline_stage_uses.count(type::PipelineStageUsage::kFragmentOutput))) {
+            } else if (TINT_LIKELY(pipeline_stage_uses.count(
+                           core::type::PipelineStageUsage::kFragmentOutput))) {
                 if (auto index = attributes.index) {
                     out << " [[color(" + std::to_string(location.value()) + ") index(" +
                                std::to_string(index.value()) + ")]]";
@@ -3031,7 +3035,7 @@
     return array_template_name_;
 }
 
-std::string ASTPrinter::StructName(const type::Struct* s) {
+std::string ASTPrinter::StructName(const core::type::Struct* s) {
     auto name = s->Name().Name();
     if (HasPrefix(name, "__")) {
         name = tint::GetOrCreate(builtin_struct_names_, s,
diff --git a/src/tint/lang/msl/writer/ast_printer/ast_printer.h b/src/tint/lang/msl/writer/ast_printer/ast_printer.h
index 6d98660..3194f84 100644
--- a/src/tint/lang/msl/writer/ast_printer/ast_printer.h
+++ b/src/tint/lang/msl/writer/ast_printer/ast_printer.h
@@ -102,7 +102,7 @@
     /// Handles generating a declared type
     /// @param ty the declared type to generate
     /// @returns true if the declared type was emitted
-    bool EmitTypeDecl(const type::Type* ty);
+    bool EmitTypeDecl(const core::type::Type* ty);
     /// Handles an index accessor expression
     /// @param out the output of the expression stream
     /// @param expr the expression to emit
@@ -312,13 +312,13 @@
     /// @param out the output of the type stream
     /// @param type the type to generate
     /// @returns true if the type is emitted
-    bool EmitType(StringStream& out, const type::Type* type);
+    bool EmitType(StringStream& out, const core::type::Type* type);
     /// Handles generating type and name
     /// @param out the output stream
     /// @param type the type to generate
     /// @param name the name to emit
     /// @returns true if the type is emitted
-    bool EmitTypeAndName(StringStream& out, const type::Type* type, const std::string& name);
+    bool EmitTypeAndName(StringStream& out, const core::type::Type* type, const std::string& name);
     /// Handles generating a address space
     /// @param out the output of the type stream
     /// @param sc the address space to generate
@@ -329,7 +329,7 @@
     /// @param buffer the text buffer that the type declaration will be written to
     /// @param str the struct to generate
     /// @returns true if the struct is emitted
-    bool EmitStructType(TextBuffer* buffer, const type::Struct* str);
+    bool EmitStructType(TextBuffer* buffer, const core::type::Struct* str);
     /// Handles a unary op expression
     /// @param out the output of the expression stream
     /// @param expr the expression to emit
@@ -347,7 +347,7 @@
     /// @param out the output of the expression stream
     /// @param type the type to emit the value for
     /// @returns true if the zero value was successfully emitted.
-    bool EmitZeroValue(StringStream& out, const type::Type* type);
+    bool EmitZeroValue(StringStream& out, const core::type::Type* type);
 
     /// Handles generating a builtin name
     /// @param builtin the semantic info for the builtin
@@ -382,7 +382,7 @@
     /// @returns the name of the structure, taking special care of builtin structures that start
     /// with double underscores. If the structure is a builtin, then the returned name will be a
     /// unique name without the leading underscores.
-    std::string StructName(const type::Struct* s);
+    std::string StructName(const core::type::Struct* s);
 
     /// @return a new, unique identifier with the given prefix.
     /// @param prefix optional prefix to apply to the generated identifier. If empty "tint_symbol"
@@ -400,14 +400,14 @@
     TextBuffer helpers_;  // Helper functions emitted at the top of the output
 
     /// Map of builtin structure to unique generated name
-    std::unordered_map<const type::Struct*, std::string> builtin_struct_names_;
+    std::unordered_map<const core::type::Struct*, std::string> builtin_struct_names_;
 
     std::function<bool()> emit_continuing_;
 
     /// Name of atomicCompareExchangeWeak() helper for the given pointer storage
     /// class and struct return type
     using ACEWKeyType =
-        tint::UnorderedKeyWrapper<std::tuple<core::AddressSpace, const type::Struct*>>;
+        tint::UnorderedKeyWrapper<std::tuple<core::AddressSpace, const core::type::Struct*>>;
     std::unordered_map<ACEWKeyType, std::string> atomicCompareExchangeWeak_;
 
     /// Unique name of the 'TINT_INVARIANT' preprocessor define.
@@ -427,9 +427,9 @@
     std::unordered_map<std::string, std::vector<uint32_t>> workgroup_allocations_;
 
     std::unordered_map<const sem::Builtin*, std::string> builtins_;
-    std::unordered_map<const type::Type*, std::string> unary_minus_funcs_;
+    std::unordered_map<const core::type::Type*, std::string> unary_minus_funcs_;
     std::unordered_map<uint32_t, std::string> int_dot_funcs_;
-    std::unordered_set<const type::Struct*> emitted_structs_;
+    std::unordered_set<const core::type::Struct*> emitted_structs_;
 };
 
 }  // namespace tint::msl::writer
diff --git a/src/tint/lang/msl/writer/ast_printer/ast_type_test.cc b/src/tint/lang/msl/writer/ast_printer/ast_type_test.cc
index 15ce7f4..13a64aa 100644
--- a/src/tint/lang/msl/writer/ast_printer/ast_type_test.cc
+++ b/src/tint/lang/msl/writer/ast_printer/ast_type_test.cc
@@ -148,7 +148,7 @@
 }
 
 TEST_F(MslASTPrinterTest, EmitType_Bool) {
-    auto* bool_ = create<type::Bool>();
+    auto* bool_ = create<core::type::Bool>();
 
     ASTPrinter& gen = Build();
 
@@ -158,7 +158,7 @@
 }
 
 TEST_F(MslASTPrinterTest, EmitType_F32) {
-    auto* f32 = create<type::F32>();
+    auto* f32 = create<core::type::F32>();
 
     ASTPrinter& gen = Build();
 
@@ -168,7 +168,7 @@
 }
 
 TEST_F(MslASTPrinterTest, EmitType_F16) {
-    auto* f16 = create<type::F16>();
+    auto* f16 = create<core::type::F16>();
 
     ASTPrinter& gen = Build();
 
@@ -178,7 +178,7 @@
 }
 
 TEST_F(MslASTPrinterTest, EmitType_I32) {
-    auto* i32 = create<type::I32>();
+    auto* i32 = create<core::type::I32>();
 
     ASTPrinter& gen = Build();
 
@@ -188,9 +188,9 @@
 }
 
 TEST_F(MslASTPrinterTest, EmitType_Matrix_F32) {
-    auto* f32 = create<type::F32>();
-    auto* vec3 = create<type::Vector>(f32, 3u);
-    auto* mat2x3 = create<type::Matrix>(vec3, 2u);
+    auto* f32 = create<core::type::F32>();
+    auto* vec3 = create<core::type::Vector>(f32, 3u);
+    auto* mat2x3 = create<core::type::Matrix>(vec3, 2u);
 
     ASTPrinter& gen = Build();
 
@@ -200,9 +200,9 @@
 }
 
 TEST_F(MslASTPrinterTest, EmitType_Matrix_F16) {
-    auto* f16 = create<type::F16>();
-    auto* vec3 = create<type::Vector>(f16, 3u);
-    auto* mat2x3 = create<type::Matrix>(vec3, 2u);
+    auto* f16 = create<core::type::F16>();
+    auto* vec3 = create<core::type::Vector>(f16, 3u);
+    auto* mat2x3 = create<core::type::Matrix>(vec3, 2u);
 
     ASTPrinter& gen = Build();
 
@@ -212,8 +212,9 @@
 }
 
 TEST_F(MslASTPrinterTest, EmitType_Pointer) {
-    auto* f32 = create<type::F32>();
-    auto* p = create<type::Pointer>(core::AddressSpace::kWorkgroup, f32, core::Access::kReadWrite);
+    auto* f32 = create<core::type::F32>();
+    auto* p =
+        create<core::type::Pointer>(core::AddressSpace::kWorkgroup, f32, core::Access::kReadWrite);
 
     ASTPrinter& gen = Build();
 
@@ -244,7 +245,7 @@
     ASTPrinter& gen = Build();
 
     tint::TextGenerator::TextBuffer buf;
-    auto* str = program->TypeOf(s)->As<type::Struct>();
+    auto* str = program->TypeOf(s)->As<core::type::Struct>();
     ASSERT_TRUE(gen.EmitStructType(&buf, str)) << gen.Diagnostics();
     EXPECT_EQ(buf.String(), R"(struct S {
   int a;
@@ -291,7 +292,7 @@
     ASTPrinter& gen = Build();
 
     tint::TextGenerator::TextBuffer buf;
-    auto* str = program->TypeOf(type)->As<type::Struct>();
+    auto* str = program->TypeOf(type)->As<core::type::Struct>();
     ASSERT_TRUE(gen.EmitStructType(&buf, str)) << gen.Diagnostics();
 
     // ALL_FIELDS() calls the macro FIELD(ADDR, TYPE, ARRAY_COUNT, NAME)
@@ -398,7 +399,7 @@
     ASTPrinter& gen = Build();
 
     tint::TextGenerator::TextBuffer buf;
-    auto* str = program->TypeOf(type)->As<type::Struct>();
+    auto* str = program->TypeOf(type)->As<core::type::Struct>();
     ASSERT_TRUE(gen.EmitStructType(&buf, str)) << gen.Diagnostics();
 
     // ALL_FIELDS() calls the macro FIELD(ADDR, TYPE, ARRAY_COUNT, NAME)
@@ -490,7 +491,7 @@
     ASTPrinter& gen = Build();
 
     tint::TextGenerator::TextBuffer buf;
-    auto* str = program->TypeOf(type)->As<type::Struct>();
+    auto* str = program->TypeOf(type)->As<core::type::Struct>();
     ASSERT_TRUE(gen.EmitStructType(&buf, str)) << gen.Diagnostics();
 
     // ALL_FIELDS() calls the macro FIELD(ADDR, TYPE, ARRAY_COUNT, NAME)
@@ -574,7 +575,7 @@
     ASTPrinter& gen = Build();
 
     tint::TextGenerator::TextBuffer buf;
-    auto* str = program->TypeOf(type)->As<type::Struct>();
+    auto* str = program->TypeOf(type)->As<core::type::Struct>();
     ASSERT_TRUE(gen.EmitStructType(&buf, str)) << gen.Diagnostics();
 
     // ALL_FIELDS() calls the macro FIELD(ADDR, TYPE, ARRAY_COUNT, NAME)
@@ -636,7 +637,7 @@
     ASTPrinter& gen = Build();
 
     tint::TextGenerator::TextBuffer buf;
-    auto* str = program->TypeOf(type)->As<type::Struct>();
+    auto* str = program->TypeOf(type)->As<core::type::Struct>();
     ASSERT_TRUE(gen.EmitStructType(&buf, str)) << gen.Diagnostics();
     EXPECT_EQ(buf.String(), R"(struct S {
   /* 0x0000 */ int tint_pad_2;
@@ -695,7 +696,7 @@
     ASTPrinter& gen = Build();
 
     tint::TextGenerator::TextBuffer buf;
-    auto* str = program->TypeOf(type)->As<type::Struct>();
+    auto* str = program->TypeOf(type)->As<core::type::Struct>();
     ASSERT_TRUE(gen.EmitStructType(&buf, str)) << gen.Diagnostics();
     EXPECT_EQ(buf.String(), R"(struct S {
   /* 0x0000 */ int a;
@@ -705,7 +706,7 @@
 }
 
 TEST_F(MslASTPrinterTest, EmitType_U32) {
-    auto* u32 = create<type::U32>();
+    auto* u32 = create<core::type::U32>();
 
     ASTPrinter& gen = Build();
 
@@ -715,8 +716,8 @@
 }
 
 TEST_F(MslASTPrinterTest, EmitType_Vector) {
-    auto* f32 = create<type::F32>();
-    auto* vec3 = create<type::Vector>(f32, 3u);
+    auto* f32 = create<core::type::F32>();
+    auto* vec3 = create<core::type::Vector>(f32, 3u);
 
     ASTPrinter& gen = Build();
 
@@ -726,7 +727,7 @@
 }
 
 TEST_F(MslASTPrinterTest, EmitType_Void) {
-    auto* void_ = create<type::Void>();
+    auto* void_ = create<core::type::Void>();
 
     ASTPrinter& gen = Build();
 
@@ -736,7 +737,7 @@
 }
 
 TEST_F(MslASTPrinterTest, EmitType_Sampler) {
-    auto* sampler = create<type::Sampler>(type::SamplerKind::kSampler);
+    auto* sampler = create<core::type::Sampler>(core::type::SamplerKind::kSampler);
 
     ASTPrinter& gen = Build();
 
@@ -746,7 +747,7 @@
 }
 
 TEST_F(MslASTPrinterTest, EmitType_SamplerComparison) {
-    auto* sampler = create<type::Sampler>(type::SamplerKind::kComparisonSampler);
+    auto* sampler = create<core::type::Sampler>(core::type::SamplerKind::kComparisonSampler);
 
     ASTPrinter& gen = Build();
 
@@ -756,7 +757,7 @@
 }
 
 struct MslDepthTextureData {
-    type::TextureDimension dim;
+    core::type::TextureDimension dim;
     std::string result;
 };
 inline std::ostream& operator<<(std::ostream& out, MslDepthTextureData data) {
@@ -769,7 +770,7 @@
 TEST_P(MslDepthTexturesTest, Emit) {
     auto params = GetParam();
 
-    type::DepthTexture s(params.dim);
+    core::type::DepthTexture s(params.dim);
 
     ASTPrinter& gen = Build();
 
@@ -780,17 +781,18 @@
 INSTANTIATE_TEST_SUITE_P(
     MslASTPrinterTest,
     MslDepthTexturesTest,
-    testing::Values(
-        MslDepthTextureData{type::TextureDimension::k2d, "depth2d<float, access::sample>"},
-        MslDepthTextureData{type::TextureDimension::k2dArray,
-                            "depth2d_array<float, access::sample>"},
-        MslDepthTextureData{type::TextureDimension::kCube, "depthcube<float, access::sample>"},
-        MslDepthTextureData{type::TextureDimension::kCubeArray,
-                            "depthcube_array<float, access::sample>"}));
+    testing::Values(MslDepthTextureData{core::type::TextureDimension::k2d,
+                                        "depth2d<float, access::sample>"},
+                    MslDepthTextureData{core::type::TextureDimension::k2dArray,
+                                        "depth2d_array<float, access::sample>"},
+                    MslDepthTextureData{core::type::TextureDimension::kCube,
+                                        "depthcube<float, access::sample>"},
+                    MslDepthTextureData{core::type::TextureDimension::kCubeArray,
+                                        "depthcube_array<float, access::sample>"}));
 
 using MslDepthMultisampledTexturesTest = TestHelper;
 TEST_F(MslDepthMultisampledTexturesTest, Emit) {
-    type::DepthMultisampledTexture s(type::TextureDimension::k2d);
+    core::type::DepthMultisampledTexture s(core::type::TextureDimension::k2d);
 
     ASTPrinter& gen = Build();
 
@@ -800,7 +802,7 @@
 }
 
 struct MslTextureData {
-    type::TextureDimension dim;
+    core::type::TextureDimension dim;
     std::string result;
 };
 inline std::ostream& operator<<(std::ostream& out, MslTextureData data) {
@@ -813,8 +815,8 @@
 TEST_P(MslSampledtexturesTest, Emit) {
     auto params = GetParam();
 
-    auto* f32 = create<type::F32>();
-    auto* s = create<type::SampledTexture>(params.dim, f32);
+    auto* f32 = create<core::type::F32>();
+    auto* s = create<core::type::SampledTexture>(params.dim, f32);
 
     ASTPrinter& gen = Build();
 
@@ -826,17 +828,18 @@
     MslASTPrinterTest,
     MslSampledtexturesTest,
     testing::Values(
-        MslTextureData{type::TextureDimension::k1d, "texture1d<float, access::sample>"},
-        MslTextureData{type::TextureDimension::k2d, "texture2d<float, access::sample>"},
-        MslTextureData{type::TextureDimension::k2dArray, "texture2d_array<float, access::sample>"},
-        MslTextureData{type::TextureDimension::k3d, "texture3d<float, access::sample>"},
-        MslTextureData{type::TextureDimension::kCube, "texturecube<float, access::sample>"},
-        MslTextureData{type::TextureDimension::kCubeArray,
+        MslTextureData{core::type::TextureDimension::k1d, "texture1d<float, access::sample>"},
+        MslTextureData{core::type::TextureDimension::k2d, "texture2d<float, access::sample>"},
+        MslTextureData{core::type::TextureDimension::k2dArray,
+                       "texture2d_array<float, access::sample>"},
+        MslTextureData{core::type::TextureDimension::k3d, "texture3d<float, access::sample>"},
+        MslTextureData{core::type::TextureDimension::kCube, "texturecube<float, access::sample>"},
+        MslTextureData{core::type::TextureDimension::kCubeArray,
                        "texturecube_array<float, access::sample>"}));
 
 TEST_F(MslASTPrinterTest, Emit_TypeMultisampledTexture) {
-    auto* u32 = create<type::U32>();
-    auto* ms = create<type::MultisampledTexture>(type::TextureDimension::k2d, u32);
+    auto* u32 = create<core::type::U32>();
+    auto* ms = create<core::type::MultisampledTexture>(core::type::TextureDimension::k2d, u32);
 
     ASTPrinter& gen = Build();
 
@@ -846,7 +849,7 @@
 }
 
 struct MslStorageTextureData {
-    type::TextureDimension dim;
+    core::type::TextureDimension dim;
     std::string result;
 };
 inline std::ostream& operator<<(std::ostream& out, MslStorageTextureData data) {
@@ -867,15 +870,17 @@
     ASSERT_TRUE(gen.EmitType(out, program->TypeOf(type))) << gen.Diagnostics();
     EXPECT_EQ(out.str(), params.result);
 }
-INSTANTIATE_TEST_SUITE_P(
-    MslASTPrinterTest,
-    MslStorageTexturesTest,
-    testing::Values(
-        MslStorageTextureData{type::TextureDimension::k1d, "texture1d<float, access::write>"},
-        MslStorageTextureData{type::TextureDimension::k2d, "texture2d<float, access::write>"},
-        MslStorageTextureData{type::TextureDimension::k2dArray,
-                              "texture2d_array<float, access::write>"},
-        MslStorageTextureData{type::TextureDimension::k3d, "texture3d<float, access::write>"}));
+INSTANTIATE_TEST_SUITE_P(MslASTPrinterTest,
+                         MslStorageTexturesTest,
+                         testing::Values(MslStorageTextureData{core::type::TextureDimension::k1d,
+                                                               "texture1d<float, access::write>"},
+                                         MslStorageTextureData{core::type::TextureDimension::k2d,
+                                                               "texture2d<float, access::write>"},
+                                         MslStorageTextureData{
+                                             core::type::TextureDimension::k2dArray,
+                                             "texture2d_array<float, access::write>"},
+                                         MslStorageTextureData{core::type::TextureDimension::k3d,
+                                                               "texture3d<float, access::write>"}));
 
 }  // namespace
 }  // namespace tint::msl::writer
diff --git a/src/tint/lang/msl/writer/common/printer_support.cc b/src/tint/lang/msl/writer/common/printer_support.cc
index c97543a4..3311449 100644
--- a/src/tint/lang/msl/writer/common/printer_support.cc
+++ b/src/tint/lang/msl/writer/common/printer_support.cc
@@ -98,30 +98,31 @@
     return attr;
 }
 
-SizeAndAlign MslPackedTypeSizeAndAlign(const type::Type* ty) {
+SizeAndAlign MslPackedTypeSizeAndAlign(const core::type::Type* ty) {
     return tint::Switch(
         ty,
 
         // https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf
         // 2.1 Scalar Data Types
-        [&](const type::U32*) {
+        [&](const core::type::U32*) {
             return SizeAndAlign{4, 4};
         },
-        [&](const type::I32*) {
+        [&](const core::type::I32*) {
             return SizeAndAlign{4, 4};
         },
-        [&](const type::F32*) {
+        [&](const core::type::F32*) {
             return SizeAndAlign{4, 4};
         },
-        [&](const type::F16*) {
+        [&](const core::type::F16*) {
             return SizeAndAlign{2, 2};
         },
 
-        [&](const type::Vector* vec) {
+        [&](const core::type::Vector* vec) {
             auto num_els = vec->Width();
             auto* el_ty = vec->type();
             SizeAndAlign el_size_align = MslPackedTypeSizeAndAlign(el_ty);
-            if (el_ty->IsAnyOf<type::U32, type::I32, type::F32, type::F16>()) {
+            if (el_ty->IsAnyOf<core::type::U32, core::type::I32, core::type::F32,
+                               core::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
@@ -138,14 +139,14 @@
             return SizeAndAlign{};
         },
 
-        [&](const type::Matrix* mat) {
+        [&](const core::type::Matrix* mat) {
             // https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf
             // 2.3 Matrix Data Types
             auto cols = mat->columns();
             auto rows = mat->rows();
             auto* el_ty = mat->type();
             // Metal only support half and float matrix.
-            if (el_ty->IsAnyOf<type::F32, type::F16>()) {
+            if (el_ty->IsAnyOf<core::type::F32, core::type::F16>()) {
                 static constexpr SizeAndAlign table_f32[] = {
                     /* float2x2 */ {16, 8},
                     /* float2x3 */ {32, 16},
@@ -169,7 +170,7 @@
                     /* half4x4 */ {32, 8},
                 };
                 if (cols >= 2 && cols <= 4 && rows >= 2 && rows <= 4) {
-                    if (el_ty->Is<type::F32>()) {
+                    if (el_ty->Is<core::type::F32>()) {
                         return table_f32[(3 * (cols - 2)) + (rows - 2)];
                     } else {
                         return table_f16[(3 * (cols - 2)) + (rows - 2)];
@@ -181,30 +182,30 @@
             return SizeAndAlign{};
         },
 
-        [&](const type::Array* arr) {
+        [&](const core::type::Array* arr) {
             if (TINT_UNLIKELY(!arr->IsStrideImplicit())) {
                 TINT_ICE()
                     << "arrays with explicit strides should not exist past the SPIR-V reader";
                 return SizeAndAlign{};
             }
-            if (arr->Count()->Is<type::RuntimeArrayCount>()) {
+            if (arr->Count()->Is<core::type::RuntimeArrayCount>()) {
                 return SizeAndAlign{arr->Stride(), arr->Align()};
             }
             if (auto count = arr->ConstantCount()) {
                 return SizeAndAlign{arr->Stride() * count.value(), arr->Align()};
             }
-            TINT_ICE() << type::Array::kErrExpectedConstantCount;
+            TINT_ICE() << core::type::Array::kErrExpectedConstantCount;
             return SizeAndAlign{};
         },
 
-        [&](const type::Struct* str) {
+        [&](const core::type::Struct* str) {
             // TODO(crbug.com/tint/650): There's an assumption here that MSL's
             // default structure size and alignment matches WGSL's. We need to
             // confirm this.
             return SizeAndAlign{str->Size(), str->Align()};
         },
 
-        [&](const type::Atomic* atomic) { return MslPackedTypeSizeAndAlign(atomic->Type()); },
+        [&](const core::type::Atomic* atomic) { return MslPackedTypeSizeAndAlign(atomic->Type()); },
 
         [&](Default) {
             TINT_UNREACHABLE() << "Unhandled type " << ty->TypeInfo().name;
diff --git a/src/tint/lang/msl/writer/common/printer_support.h b/src/tint/lang/msl/writer/common/printer_support.h
index ddec2ed..f8807ff 100644
--- a/src/tint/lang/msl/writer/common/printer_support.h
+++ b/src/tint/lang/msl/writer/common/printer_support.h
@@ -35,7 +35,7 @@
 
 /// @param ty the type to generate size and align for
 /// @returns the MSL packed type size and alignment in bytes for the given type.
-SizeAndAlign MslPackedTypeSizeAndAlign(const type::Type* ty);
+SizeAndAlign MslPackedTypeSizeAndAlign(const core::type::Type* ty);
 
 /// Converts a builtin to an attribute name
 /// @param builtin the builtin to convert
diff --git a/src/tint/lang/msl/writer/printer/helper_test.h b/src/tint/lang/msl/writer/printer/helper_test.h
index 84887d1..e4ca774 100644
--- a/src/tint/lang/msl/writer/printer/helper_test.h
+++ b/src/tint/lang/msl/writer/printer/helper_test.h
@@ -54,7 +54,7 @@
     /// The test builder.
     ir::Builder b{mod};
     /// The type manager.
-    type::Manager& ty{mod.Types()};
+    core::type::Manager& ty{mod.Types()};
 
   protected:
     /// The MSL writer.
diff --git a/src/tint/lang/msl/writer/printer/printer.cc b/src/tint/lang/msl/writer/printer/printer.cc
index 96059f6..15cdd31 100644
--- a/src/tint/lang/msl/writer/printer/printer.cc
+++ b/src/tint/lang/msl/writer/printer/printer.cc
@@ -179,7 +179,7 @@
 void Printer::EmitBinary(ir::Binary* b) {
     if (b->Kind() == ir::Binary::Kind::kEqual) {
         auto* rhs = b->RHS()->As<ir::Constant>();
-        if (rhs && rhs->Type()->Is<type::Bool>() && rhs->Value()->ValueAs<bool>() == false) {
+        if (rhs && rhs->Type()->Is<core::type::Bool>() && rhs->Value()->ValueAs<bool>() == false) {
             // expr == false
             Bind(b->Result(), "!(" + Expr(b->LHS()) + ")");
             return;
@@ -238,7 +238,7 @@
 void Printer::EmitVar(ir::Var* v) {
     auto out = Line();
 
-    auto* ptr = v->Result()->Type()->As<type::Pointer>();
+    auto* ptr = v->Result()->Type()->As<core::type::Pointer>();
     TINT_ASSERT_OR_RETURN(ptr);
 
     auto space = ptr->AddressSpace();
@@ -363,23 +363,23 @@
     }
 }
 
-void Printer::EmitType(StringStream& out, const type::Type* ty) {
+void Printer::EmitType(StringStream& out, const core::type::Type* ty) {
     tint::Switch(
-        ty,                                         //
-        [&](const type::Bool*) { out << "bool"; },  //
-        [&](const type::Void*) { out << "void"; },  //
-        [&](const type::F32*) { out << "float"; },  //
-        [&](const type::F16*) { out << "half"; },   //
-        [&](const type::I32*) { out << "int"; },    //
-        [&](const type::U32*) { out << "uint"; },   //
-        [&](const type::Array* arr) { EmitArrayType(out, arr); },
-        [&](const type::Vector* vec) { EmitVectorType(out, vec); },
-        [&](const type::Matrix* mat) { EmitMatrixType(out, mat); },
-        [&](const type::Atomic* atomic) { EmitAtomicType(out, atomic); },
-        [&](const type::Pointer* ptr) { EmitPointerType(out, ptr); },
-        [&](const type::Sampler*) { out << "sampler"; },  //
-        [&](const type::Texture* tex) { EmitTextureType(out, tex); },
-        [&](const type::Struct* str) {
+        ty,                                               //
+        [&](const core::type::Bool*) { out << "bool"; },  //
+        [&](const core::type::Void*) { out << "void"; },  //
+        [&](const core::type::F32*) { out << "float"; },  //
+        [&](const core::type::F16*) { out << "half"; },   //
+        [&](const core::type::I32*) { out << "int"; },    //
+        [&](const core::type::U32*) { out << "uint"; },   //
+        [&](const core::type::Array* arr) { EmitArrayType(out, arr); },
+        [&](const core::type::Vector* vec) { EmitVectorType(out, vec); },
+        [&](const core::type::Matrix* mat) { EmitMatrixType(out, mat); },
+        [&](const core::type::Atomic* atomic) { EmitAtomicType(out, atomic); },
+        [&](const core::type::Pointer* ptr) { EmitPointerType(out, ptr); },
+        [&](const core::type::Sampler*) { out << "sampler"; },  //
+        [&](const core::type::Texture* tex) { EmitTextureType(out, tex); },
+        [&](const core::type::Struct* str) {
             out << StructName(str);
 
             TINT_SCOPED_ASSIGNMENT(current_buffer_, &preamble_buffer_);
@@ -388,7 +388,7 @@
         [&](Default) { UNHANDLED_CASE(ty); });
 }
 
-void Printer::EmitPointerType(StringStream& out, const type::Pointer* ptr) {
+void Printer::EmitPointerType(StringStream& out, const core::type::Pointer* ptr) {
     if (ptr->Access() == core::Access::kRead) {
         out << "const ";
     }
@@ -398,28 +398,28 @@
     out << "*";
 }
 
-void Printer::EmitAtomicType(StringStream& out, const type::Atomic* atomic) {
-    if (atomic->Type()->Is<type::I32>()) {
+void Printer::EmitAtomicType(StringStream& out, const core::type::Atomic* atomic) {
+    if (atomic->Type()->Is<core::type::I32>()) {
         out << "atomic_int";
         return;
     }
-    if (TINT_LIKELY(atomic->Type()->Is<type::U32>())) {
+    if (TINT_LIKELY(atomic->Type()->Is<core::type::U32>())) {
         out << "atomic_uint";
         return;
     }
     TINT_ICE() << "unhandled atomic type " << atomic->Type()->FriendlyName();
 }
 
-void Printer::EmitArrayType(StringStream& out, const type::Array* arr) {
+void Printer::EmitArrayType(StringStream& out, const core::type::Array* arr) {
     out << ArrayTemplateName() << "<";
     EmitType(out, arr->ElemType());
     out << ", ";
-    if (arr->Count()->Is<type::RuntimeArrayCount>()) {
+    if (arr->Count()->Is<core::type::RuntimeArrayCount>()) {
         out << "1";
     } else {
         auto count = arr->ConstantCount();
         if (!count) {
-            TINT_ICE() << type::Array::kErrExpectedConstantCount;
+            TINT_ICE() << core::type::Array::kErrExpectedConstantCount;
             return;
         }
         out << count.value();
@@ -427,7 +427,7 @@
     out << ">";
 }
 
-void Printer::EmitVectorType(StringStream& out, const type::Vector* vec) {
+void Printer::EmitVectorType(StringStream& out, const core::type::Vector* vec) {
     if (vec->Packed()) {
         out << "packed_";
     }
@@ -435,47 +435,47 @@
     out << vec->Width();
 }
 
-void Printer::EmitMatrixType(StringStream& out, const type::Matrix* mat) {
+void Printer::EmitMatrixType(StringStream& out, const core::type::Matrix* mat) {
     EmitType(out, mat->type());
     out << mat->columns() << "x" << mat->rows();
 }
 
-void Printer::EmitTextureType(StringStream& out, const type::Texture* tex) {
-    if (TINT_UNLIKELY(tex->Is<type::ExternalTexture>())) {
+void Printer::EmitTextureType(StringStream& out, const core::type::Texture* tex) {
+    if (TINT_UNLIKELY(tex->Is<core::type::ExternalTexture>())) {
         TINT_ICE() << "Multiplanar external texture transform was not run.";
         return;
     }
 
-    if (tex->IsAnyOf<type::DepthTexture, type::DepthMultisampledTexture>()) {
+    if (tex->IsAnyOf<core::type::DepthTexture, core::type::DepthMultisampledTexture>()) {
         out << "depth";
     } else {
         out << "texture";
     }
 
     switch (tex->dim()) {
-        case type::TextureDimension::k1d:
+        case core::type::TextureDimension::k1d:
             out << "1d";
             break;
-        case type::TextureDimension::k2d:
+        case core::type::TextureDimension::k2d:
             out << "2d";
             break;
-        case type::TextureDimension::k2dArray:
+        case core::type::TextureDimension::k2dArray:
             out << "2d_array";
             break;
-        case type::TextureDimension::k3d:
+        case core::type::TextureDimension::k3d:
             out << "3d";
             break;
-        case type::TextureDimension::kCube:
+        case core::type::TextureDimension::kCube:
             out << "cube";
             break;
-        case type::TextureDimension::kCubeArray:
+        case core::type::TextureDimension::kCubeArray:
             out << "cube_array";
             break;
         default:
             TINT_ICE() << "invalid texture dimensions";
             return;
     }
-    if (tex->IsAnyOf<type::MultisampledTexture, type::DepthMultisampledTexture>()) {
+    if (tex->IsAnyOf<core::type::MultisampledTexture, core::type::DepthMultisampledTexture>()) {
         out << "_ms";
     }
     out << "<";
@@ -483,9 +483,9 @@
 
     tint::Switch(
         tex,  //
-        [&](const type::DepthTexture*) { out << "float, access::sample"; },
-        [&](const type::DepthMultisampledTexture*) { out << "float, access::read"; },
-        [&](const type::StorageTexture* storage) {
+        [&](const core::type::DepthTexture*) { out << "float, access::sample"; },
+        [&](const core::type::DepthMultisampledTexture*) { out << "float, access::read"; },
+        [&](const core::type::StorageTexture* storage) {
             EmitType(out, storage->type());
             out << ", ";
 
@@ -499,18 +499,18 @@
                 return;
             }
         },
-        [&](const type::MultisampledTexture* ms) {
+        [&](const core::type::MultisampledTexture* ms) {
             EmitType(out, ms->type());
             out << ", access::read";
         },
-        [&](const type::SampledTexture* sampled) {
+        [&](const core::type::SampledTexture* sampled) {
             EmitType(out, sampled->type());
             out << ", access::sample";
         },
         [&](Default) { TINT_ICE() << "invalid texture type"; });
 }
 
-void Printer::EmitStructType(const type::Struct* str) {
+void Printer::EmitStructType(const core::type::Struct* str) {
     auto it = emitted_structs_.emplace(str);
     if (!it.second) {
         return;
@@ -592,14 +592,14 @@
                 return;
             }
 
-            if (pipeline_stage_uses.count(type::PipelineStageUsage::kVertexInput)) {
+            if (pipeline_stage_uses.count(core::type::PipelineStageUsage::kVertexInput)) {
                 out << " [[attribute(" + std::to_string(location.value()) + ")]]";
-            } else if (pipeline_stage_uses.count(type::PipelineStageUsage::kVertexOutput)) {
+            } else if (pipeline_stage_uses.count(core::type::PipelineStageUsage::kVertexOutput)) {
                 out << " [[user(locn" + std::to_string(location.value()) + ")]]";
-            } else if (pipeline_stage_uses.count(type::PipelineStageUsage::kFragmentInput)) {
+            } else if (pipeline_stage_uses.count(core::type::PipelineStageUsage::kFragmentInput)) {
                 out << " [[user(locn" + std::to_string(location.value()) + ")]]";
-            } else if (TINT_LIKELY(
-                           pipeline_stage_uses.count(type::PipelineStageUsage::kFragmentOutput))) {
+            } else if (TINT_LIKELY(pipeline_stage_uses.count(
+                           core::type::PipelineStageUsage::kFragmentOutput))) {
                 out << " [[color(" + std::to_string(location.value()) + ")]]";
             } else {
                 TINT_ICE() << "invalid use of location decoration";
@@ -662,12 +662,12 @@
 
     tint::Switch(
         c->Type(),  //
-        [&](const type::Bool*) { out << (c->ValueAs<bool>() ? "true" : "false"); },
-        [&](const type::I32*) { PrintI32(out, c->ValueAs<i32>()); },
-        [&](const type::U32*) { out << c->ValueAs<u32>() << "u"; },
-        [&](const type::F32*) { PrintF32(out, c->ValueAs<f32>()); },
-        [&](const type::F16*) { PrintF16(out, c->ValueAs<f16>()); },
-        [&](const type::Vector* v) {
+        [&](const core::type::Bool*) { out << (c->ValueAs<bool>() ? "true" : "false"); },
+        [&](const core::type::I32*) { PrintI32(out, c->ValueAs<i32>()); },
+        [&](const core::type::U32*) { out << c->ValueAs<u32>() << "u"; },
+        [&](const core::type::F32*) { PrintF32(out, c->ValueAs<f32>()); },
+        [&](const core::type::F16*) { PrintF16(out, c->ValueAs<f16>()); },
+        [&](const core::type::Vector* v) {
             EmitType(out, v);
 
             ScopedParen sp(out);
@@ -677,12 +677,12 @@
             }
             emit_values(v->Width());
         },
-        [&](const type::Matrix* m) {
+        [&](const core::type::Matrix* m) {
             EmitType(out, m);
             ScopedParen sp(out);
             emit_values(m->columns());
         },
-        [&](const type::Array* a) {
+        [&](const core::type::Array* a) {
             EmitType(out, a);
             out << "{";
             TINT_DEFER(out << "}");
@@ -693,12 +693,12 @@
 
             auto count = a->ConstantCount();
             if (!count) {
-                TINT_ICE() << type::Array::kErrExpectedConstantCount;
+                TINT_ICE() << core::type::Array::kErrExpectedConstantCount;
                 return;
             }
             emit_values(*count);
         },
-        [&](const type::Struct* s) {
+        [&](const core::type::Struct* s) {
             EmitStructType(s);
             out << StructName(s) << "{";
             TINT_DEFER(out << "}");
@@ -719,26 +719,26 @@
         [&](Default) { UNHANDLED_CASE(c->Type()); });
 }
 
-void Printer::EmitZeroValue(StringStream& out, const type::Type* ty) {
+void Printer::EmitZeroValue(StringStream& out, const core::type::Type* ty) {
     Switch(
-        ty, [&](const type::Bool*) { out << "false"; },                     //
-        [&](const type::F16*) { out << "0.0h"; },                           //
-        [&](const type::F32*) { out << "0.0f"; },                           //
-        [&](const type::I32*) { out << "0"; },                              //
-        [&](const type::U32*) { out << "0u"; },                             //
-        [&](const type::Vector* vec) { EmitZeroValue(out, vec->type()); },  //
-        [&](const type::Matrix* mat) {
+        ty, [&](const core::type::Bool*) { out << "false"; },                     //
+        [&](const core::type::F16*) { out << "0.0h"; },                           //
+        [&](const core::type::F32*) { out << "0.0f"; },                           //
+        [&](const core::type::I32*) { out << "0"; },                              //
+        [&](const core::type::U32*) { out << "0u"; },                             //
+        [&](const core::type::Vector* vec) { EmitZeroValue(out, vec->type()); },  //
+        [&](const core::type::Matrix* mat) {
             EmitType(out, mat);
 
             ScopedParen sp(out);
             EmitZeroValue(out, mat->type());
         },
-        [&](const type::Array*) { out << "{}"; },   //
-        [&](const type::Struct*) { out << "{}"; },  //
+        [&](const core::type::Array*) { out << "{}"; },   //
+        [&](const core::type::Struct*) { out << "{}"; },  //
         [&](Default) { TINT_ICE() << "Invalid type for zero emission: " << ty->FriendlyName(); });
 }
 
-std::string Printer::StructName(const type::Struct* s) {
+std::string Printer::StructName(const core::type::Struct* s) {
     auto name = s->Name().Name();
     if (HasPrefix(name, "__")) {
         name = tint::GetOrCreate(builtin_struct_names_, s,
@@ -802,7 +802,7 @@
         return "<error>";
     }
 
-    if (value->Type()->Is<type::Pointer>()) {
+    if (value->Type()->Is<core::type::Pointer>()) {
         return ToPtrKind(expr, got_ptr_kind, want_ptr_kind);
     }
 
@@ -841,7 +841,7 @@
             auto out = Line();
             EmitType(out, value->Type());
             out << " const " << mod_name.Name() << " = ";
-            if (value->Type()->Is<type::Pointer>()) {
+            if (value->Type()->Is<core::type::Pointer>()) {
                 out << ToPtrKind(expr, ptr_kind, PtrKind::kPtr);
             } else {
                 out << expr;
diff --git a/src/tint/lang/msl/writer/printer/printer.h b/src/tint/lang/msl/writer/printer/printer.h
index 134ad28..9a49a84 100644
--- a/src/tint/lang/msl/writer/printer/printer.h
+++ b/src/tint/lang/msl/writer/printer/printer.h
@@ -95,36 +95,36 @@
     /// Emit a type
     /// @param out the stream to emit too
     /// @param ty the type to emit
-    void EmitType(StringStream& out, const type::Type* ty);
+    void EmitType(StringStream& out, const core::type::Type* ty);
 
     /// Handles generating an array declaration
     /// @param out the output stream
     /// @param arr the array to emit
-    void EmitArrayType(StringStream& out, const type::Array* arr);
+    void EmitArrayType(StringStream& out, const core::type::Array* arr);
     /// Handles generating an atomic declaration
     /// @param out the output stream
     /// @param atomic the atomic to emit
-    void EmitAtomicType(StringStream& out, const type::Atomic* atomic);
+    void EmitAtomicType(StringStream& out, const core::type::Atomic* atomic);
     /// Handles generating a pointer declaration
     /// @param out the output stream
     /// @param ptr the pointer to emit
-    void EmitPointerType(StringStream& out, const type::Pointer* ptr);
+    void EmitPointerType(StringStream& out, const core::type::Pointer* ptr);
     /// Handles generating a vector declaration
     /// @param out the output stream
     /// @param vec the vector to emit
-    void EmitVectorType(StringStream& out, const type::Vector* vec);
+    void EmitVectorType(StringStream& out, const core::type::Vector* vec);
     /// Handles generating a matrix declaration
     /// @param out the output stream
     /// @param mat the matrix to emit
-    void EmitMatrixType(StringStream& out, const type::Matrix* mat);
+    void EmitMatrixType(StringStream& out, const core::type::Matrix* mat);
     /// Handles generating a texture declaration
     /// @param out the output stream
     /// @param tex the texture to emit
-    void EmitTextureType(StringStream& out, const type::Texture* tex);
+    void EmitTextureType(StringStream& out, const core::type::Texture* tex);
     /// Handles generating a struct declaration. If the structure has already been emitted, then
     /// this function will simply return without emitting anything.
     /// @param str the struct to generate
-    void EmitStructType(const type::Struct* str);
+    void EmitStructType(const core::type::Struct* str);
 
     /// Handles generating a address space
     /// @param out the output of the type stream
@@ -143,7 +143,7 @@
     /// Emits the zero value for the given type
     /// @param out the stream to emit too
     /// @param ty the type
-    void EmitZeroValue(StringStream& out, const type::Type* ty);
+    void EmitZeroValue(StringStream& out, const core::type::Type* ty);
 
     /// @returns the name of the templated `tint_array` helper type, generating it if needed
     const std::string& ArrayTemplateName();
@@ -152,7 +152,7 @@
     /// @returns the name of the structure, taking special care of builtin structures that start
     /// with double underscores. If the structure is a builtin, then the returned name will be a
     /// unique name without the leading underscores.
-    std::string StructName(const type::Struct* s);
+    std::string StructName(const core::type::Struct* s);
 
     /// @return a new, unique identifier with the given prefix.
     /// @param prefix optional prefix to apply to the generated identifier. If empty "tint_symbol"
@@ -160,7 +160,7 @@
     std::string UniqueIdentifier(const std::string& prefix = "");
 
     /// Map of builtin structure to unique generated name
-    std::unordered_map<const type::Struct*, std::string> builtin_struct_names_;
+    std::unordered_map<const core::type::Struct*, std::string> builtin_struct_names_;
 
     ir::Module* const ir_;
 
@@ -171,7 +171,7 @@
     /// Non-empty only if an invariant attribute has been generated.
     std::string invariant_define_name_;
 
-    std::unordered_set<const type::Struct*> emitted_structs_;
+    std::unordered_set<const core::type::Struct*> emitted_structs_;
 
     /// The current function being emitted
     ir::Function* current_function_ = nullptr;
diff --git a/src/tint/lang/msl/writer/printer/type_test.cc b/src/tint/lang/msl/writer/printer/type_test.cc
index 2dad67a..f2a52f3 100644
--- a/src/tint/lang/msl/writer/printer/type_test.cc
+++ b/src/tint/lang/msl/writer/printer/type_test.cc
@@ -407,15 +407,15 @@
 
 struct MemberData {
     Symbol name;
-    const type::Type* type;
+    const core::type::Type* type;
     uint32_t size = 0;
     uint32_t align = 0;
 };
-type::Struct* MkStruct(ir::Module& mod,
-                       type::Manager& ty,
-                       std::string_view name,
-                       VectorRef<MemberData> data) {
-    Vector<const type::StructMember*, 26> members;
+core::type::Struct* MkStruct(ir::Module& mod,
+                             core::type::Manager& ty,
+                             std::string_view name,
+                             VectorRef<MemberData> data) {
+    Vector<const core::type::StructMember*, 26> members;
     uint32_t align = 0;
     uint32_t size = 0;
     for (uint32_t i = 0; i < data.Length(); ++i) {
@@ -425,15 +425,15 @@
         uint32_t mem_size = d.size == 0 ? d.type->Size() : d.size;
 
         uint32_t offset = tint::RoundUp(mem_align, size);
-        members.Push(ty.Get<type::StructMember>(d.name, d.type, i, offset, mem_align, mem_size,
-                                                type::StructMemberAttributes{}));
+        members.Push(ty.Get<core::type::StructMember>(
+            d.name, d.type, i, offset, mem_align, mem_size, core::type::StructMemberAttributes{}));
 
         align = std::max(align, mem_align);
         size = offset + mem_size;
     }
 
-    return ty.Get<type::Struct>(mod.symbols.New(name), std::move(members), align,
-                                tint::RoundUp(align, size), size);
+    return ty.Get<core::type::Struct>(mod.symbols.New(name), std::move(members), align,
+                                      tint::RoundUp(align, size), size);
 }
 
 TEST_F(MslPrinterTest, EmitType_Struct_Layout_NonComposites) {
@@ -573,7 +573,7 @@
                                                {mod.symbols.Register("c"), ty.f32()},
                                                {mod.symbols.Register("d"), inner_y},
                                                {mod.symbols.Register("e"), ty.f32()}});
-    const_cast<type::Struct*>(s)->AddUsage(core::AddressSpace::kStorage);
+    const_cast<core::type::Struct*>(s)->AddUsage(core::AddressSpace::kStorage);
 
 // ALL_FIELDS() calls the macro FIELD(ADDR, TYPE, ARRAY_COUNT, NAME)
 // for each field of the structure s.
@@ -677,7 +677,7 @@
                                                {mod.symbols.Register("d"), array_y},
                                                {mod.symbols.Register("e"), ty.f32()},
                                                {mod.symbols.Register("f"), array_z}});
-    const_cast<type::Struct*>(s)->AddUsage(core::AddressSpace::kStorage);
+    const_cast<core::type::Struct*>(s)->AddUsage(core::AddressSpace::kStorage);
 
     // ALL_FIELDS() calls the macro FIELD(ADDR, TYPE, ARRAY_COUNT, NAME)
     // for each field of the structure s.
@@ -772,7 +772,7 @@
                                                   {mod.symbols.Register("b"), array},
                                                   {mod.symbols.Register("c"), ty.i32()},
                                               });
-    const_cast<type::Struct*>(s)->AddUsage(core::AddressSpace::kStorage);
+    const_cast<core::type::Struct*>(s)->AddUsage(core::AddressSpace::kStorage);
 
     // ALL_FIELDS() calls the macro FIELD(ADDR, TYPE, ARRAY_COUNT, NAME)
     // for each field of the structure s.
@@ -928,7 +928,7 @@
 }
 
 struct MslDepthTextureData {
-    type::TextureDimension dim;
+    core::type::TextureDimension dim;
     std::string result;
 };
 inline std::ostream& operator<<(std::ostream& out, MslDepthTextureData data) {
@@ -941,7 +941,7 @@
 TEST_P(MslPrinterDepthTexturesTest, Emit) {
     auto params = GetParam();
 
-    auto* t = ty.Get<type::DepthTexture>(params.dim);
+    auto* t = ty.Get<core::type::DepthTexture>(params.dim);
     auto* func = b.Function("foo", ty.void_());
     b.Append(func->Block(), [&] {
         b.Var("a", ty.ptr(core::AddressSpace::kWorkgroup, t));
@@ -959,16 +959,17 @@
 INSTANTIATE_TEST_SUITE_P(
     MslPrinterTest,
     MslPrinterDepthTexturesTest,
-    testing::Values(
-        MslDepthTextureData{type::TextureDimension::k2d, "depth2d<float, access::sample>"},
-        MslDepthTextureData{type::TextureDimension::k2dArray,
-                            "depth2d_array<float, access::sample>"},
-        MslDepthTextureData{type::TextureDimension::kCube, "depthcube<float, access::sample>"},
-        MslDepthTextureData{type::TextureDimension::kCubeArray,
-                            "depthcube_array<float, access::sample>"}));
+    testing::Values(MslDepthTextureData{core::type::TextureDimension::k2d,
+                                        "depth2d<float, access::sample>"},
+                    MslDepthTextureData{core::type::TextureDimension::k2dArray,
+                                        "depth2d_array<float, access::sample>"},
+                    MslDepthTextureData{core::type::TextureDimension::kCube,
+                                        "depthcube<float, access::sample>"},
+                    MslDepthTextureData{core::type::TextureDimension::kCubeArray,
+                                        "depthcube_array<float, access::sample>"}));
 
 TEST_F(MslPrinterTest, EmiType_DepthMultisampledTexture) {
-    auto* t = ty.Get<type::DepthMultisampledTexture>(type::TextureDimension::k2d);
+    auto* t = ty.Get<core::type::DepthMultisampledTexture>(core::type::TextureDimension::k2d);
     auto* func = b.Function("foo", ty.void_());
     b.Append(func->Block(), [&] {
         b.Var("a", ty.ptr(core::AddressSpace::kWorkgroup, t));
@@ -984,7 +985,7 @@
 }
 
 struct MslTextureData {
-    type::TextureDimension dim;
+    core::type::TextureDimension dim;
     std::string result;
 };
 inline std::ostream& operator<<(std::ostream& out, MslTextureData data) {
@@ -997,7 +998,7 @@
 TEST_P(MslPrinterSampledtexturesTest, Emit) {
     auto params = GetParam();
 
-    auto* t = ty.Get<type::SampledTexture>(params.dim, ty.f32());
+    auto* t = ty.Get<core::type::SampledTexture>(params.dim, ty.f32());
     auto* func = b.Function("foo", ty.void_());
     b.Append(func->Block(), [&] {
         b.Var("a", ty.ptr(core::AddressSpace::kWorkgroup, t));
@@ -1016,16 +1017,17 @@
     MslPrinterTest,
     MslPrinterSampledtexturesTest,
     testing::Values(
-        MslTextureData{type::TextureDimension::k1d, "texture1d<float, access::sample>"},
-        MslTextureData{type::TextureDimension::k2d, "texture2d<float, access::sample>"},
-        MslTextureData{type::TextureDimension::k2dArray, "texture2d_array<float, access::sample>"},
-        MslTextureData{type::TextureDimension::k3d, "texture3d<float, access::sample>"},
-        MslTextureData{type::TextureDimension::kCube, "texturecube<float, access::sample>"},
-        MslTextureData{type::TextureDimension::kCubeArray,
+        MslTextureData{core::type::TextureDimension::k1d, "texture1d<float, access::sample>"},
+        MslTextureData{core::type::TextureDimension::k2d, "texture2d<float, access::sample>"},
+        MslTextureData{core::type::TextureDimension::k2dArray,
+                       "texture2d_array<float, access::sample>"},
+        MslTextureData{core::type::TextureDimension::k3d, "texture3d<float, access::sample>"},
+        MslTextureData{core::type::TextureDimension::kCube, "texturecube<float, access::sample>"},
+        MslTextureData{core::type::TextureDimension::kCubeArray,
                        "texturecube_array<float, access::sample>"}));
 
 TEST_F(MslPrinterTest, Emit_TypeMultisampledTexture) {
-    auto* ms = ty.Get<type::MultisampledTexture>(type::TextureDimension::k2d, ty.u32());
+    auto* ms = ty.Get<core::type::MultisampledTexture>(core::type::TextureDimension::k2d, ty.u32());
     auto* func = b.Function("foo", ty.void_());
     b.Append(func->Block(), [&] {
         b.Var("a", ty.ptr(core::AddressSpace::kWorkgroup, ms));
@@ -1041,7 +1043,7 @@
 }
 
 struct MslStorageTextureData {
-    type::TextureDimension dim;
+    core::type::TextureDimension dim;
     std::string result;
 };
 inline std::ostream& operator<<(std::ostream& out, MslStorageTextureData data) {
@@ -1053,9 +1055,9 @@
 TEST_P(MslPrinterStorageTexturesTest, Emit) {
     auto params = GetParam();
 
-    auto* f32 = const_cast<type::F32*>(ty.f32());
-    auto s = ty.Get<type::StorageTexture>(params.dim, core::TexelFormat::kR32Float,
-                                          core::Access::kWrite, f32);
+    auto* f32 = const_cast<core::type::F32*>(ty.f32());
+    auto s = ty.Get<core::type::StorageTexture>(params.dim, core::TexelFormat::kR32Float,
+                                                core::Access::kWrite, f32);
     auto* func = b.Function("foo", ty.void_());
     b.Append(func->Block(), [&] {
         b.Var("a", ty.ptr(core::AddressSpace::kWorkgroup, s));
@@ -1070,15 +1072,17 @@
 }
 )");
 }
-INSTANTIATE_TEST_SUITE_P(
-    MslPrinterTest,
-    MslPrinterStorageTexturesTest,
-    testing::Values(
-        MslStorageTextureData{type::TextureDimension::k1d, "texture1d<float, access::write>"},
-        MslStorageTextureData{type::TextureDimension::k2d, "texture2d<float, access::write>"},
-        MslStorageTextureData{type::TextureDimension::k2dArray,
-                              "texture2d_array<float, access::write>"},
-        MslStorageTextureData{type::TextureDimension::k3d, "texture3d<float, access::write>"}));
+INSTANTIATE_TEST_SUITE_P(MslPrinterTest,
+                         MslPrinterStorageTexturesTest,
+                         testing::Values(MslStorageTextureData{core::type::TextureDimension::k1d,
+                                                               "texture1d<float, access::write>"},
+                                         MslStorageTextureData{core::type::TextureDimension::k2d,
+                                                               "texture2d<float, access::write>"},
+                                         MslStorageTextureData{
+                                             core::type::TextureDimension::k2dArray,
+                                             "texture2d_array<float, access::write>"},
+                                         MslStorageTextureData{core::type::TextureDimension::k3d,
+                                                               "texture3d<float, access::write>"}));
 
 }  // namespace
 }  // namespace tint::msl::writer
diff --git a/src/tint/lang/spirv/reader/ast_parser/ast_parser.cc b/src/tint/lang/spirv/reader/ast_parser/ast_parser.cc
index 18ad99f..d33730d 100644
--- a/src/tint/lang/spirv/reader/ast_parser/ast_parser.cc
+++ b/src/tint/lang/spirv/reader/ast_parser/ast_parser.cc
@@ -2508,8 +2508,8 @@
     const Type* ast_handle_type = nullptr;
     if (usage.IsSampler()) {
         ast_handle_type =
-            ty_.Sampler(usage.IsComparisonSampler() ? type::SamplerKind::kComparisonSampler
-                                                    : type::SamplerKind::kSampler);
+            ty_.Sampler(usage.IsComparisonSampler() ? core::type::SamplerKind::kComparisonSampler
+                                                    : core::type::SamplerKind::kSampler);
     } else if (usage.IsTexture()) {
         const spvtools::opt::analysis::Image* image_type =
             type_mgr_->GetType(raw_handle_type->result_id())->AsImage();
@@ -2534,9 +2534,9 @@
             }
         }
 
-        const type::TextureDimension dim =
+        const core::type::TextureDimension dim =
             enum_converter_.ToDim(image_type->dim(), image_type->is_arrayed());
-        if (dim == type::TextureDimension::kNone) {
+        if (dim == core::type::TextureDimension::kNone) {
             return nullptr;
         }
 
@@ -2559,7 +2559,7 @@
                     ast_handle_type = ty_.DepthTexture(dim);
                 }
             } else if (image_type->is_multisampled()) {
-                if (dim != type::TextureDimension::k2d) {
+                if (dim != core::type::TextureDimension::k2d) {
                     Fail() << "WGSL multisampled textures must be 2d and non-arrayed: "
                               "invalid multisampled texture variable or function parameter "
                            << namer_.Name(obj.result_id()) << ": " << obj.PrettyPrint();
diff --git a/src/tint/lang/spirv/reader/ast_parser/enum_converter.cc b/src/tint/lang/spirv/reader/ast_parser/enum_converter.cc
index 1941989..67842ab 100644
--- a/src/tint/lang/spirv/reader/ast_parser/enum_converter.cc
+++ b/src/tint/lang/spirv/reader/ast_parser/enum_converter.cc
@@ -100,34 +100,34 @@
     return core::BuiltinValue::kUndefined;
 }
 
-type::TextureDimension EnumConverter::ToDim(spv::Dim dim, bool arrayed) {
+core::type::TextureDimension EnumConverter::ToDim(spv::Dim dim, bool arrayed) {
     if (arrayed) {
         switch (dim) {
             case spv::Dim::Dim2D:
-                return type::TextureDimension::k2dArray;
+                return core::type::TextureDimension::k2dArray;
             case spv::Dim::Cube:
-                return type::TextureDimension::kCubeArray;
+                return core::type::TextureDimension::kCubeArray;
             default:
                 break;
         }
         Fail() << "arrayed dimension must be 2D or Cube. Got " << int(dim);
-        return type::TextureDimension::kNone;
+        return core::type::TextureDimension::kNone;
     }
     // Assume non-arrayed
     switch (dim) {
         case spv::Dim::Dim1D:
-            return type::TextureDimension::k1d;
+            return core::type::TextureDimension::k1d;
         case spv::Dim::Dim2D:
-            return type::TextureDimension::k2d;
+            return core::type::TextureDimension::k2d;
         case spv::Dim::Dim3D:
-            return type::TextureDimension::k3d;
+            return core::type::TextureDimension::k3d;
         case spv::Dim::Cube:
-            return type::TextureDimension::kCube;
+            return core::type::TextureDimension::kCube;
         default:
             break;
     }
     Fail() << "invalid dimension: " << int(dim);
-    return type::TextureDimension::kNone;
+    return core::type::TextureDimension::kNone;
 }
 
 core::TexelFormat EnumConverter::ToTexelFormat(spv::ImageFormat fmt) {
diff --git a/src/tint/lang/spirv/reader/ast_parser/enum_converter.h b/src/tint/lang/spirv/reader/ast_parser/enum_converter.h
index 13b6c87..80f16fd 100644
--- a/src/tint/lang/spirv/reader/ast_parser/enum_converter.h
+++ b/src/tint/lang/spirv/reader/ast_parser/enum_converter.h
@@ -58,14 +58,14 @@
     /// @param dim the SPIR-V Dim value
     /// @param arrayed true if the texture is arrayed
     /// @returns a Tint AST texture dimension
-    type::TextureDimension ToDim(spv::Dim dim, bool arrayed);
+    core::type::TextureDimension ToDim(spv::Dim dim, bool arrayed);
 
     /// Converts a possibly arrayed SPIR-V Dim to a Tint texture dimension.
     /// On failure, logs an error and returns kNone
     /// @param dim the SPIR-V Dim value
     /// @param arrayed true if the texture is arrayed
     /// @returns a Tint AST texture dimension
-    type::TextureDimension ToDim(SpvDim dim, bool arrayed) {
+    core::type::TextureDimension ToDim(SpvDim dim, bool arrayed) {
         return ToDim(static_cast<spv::Dim>(dim), arrayed);
     }
 
diff --git a/src/tint/lang/spirv/reader/ast_parser/enum_converter_test.cc b/src/tint/lang/spirv/reader/ast_parser/enum_converter_test.cc
index 9b78d06..5ce9dc7 100644
--- a/src/tint/lang/spirv/reader/ast_parser/enum_converter_test.cc
+++ b/src/tint/lang/spirv/reader/ast_parser/enum_converter_test.cc
@@ -220,7 +220,7 @@
     spv::Dim dim;
     bool arrayed;
     bool expect_success;
-    type::TextureDimension expected;
+    core::type::TextureDimension expected;
 };
 inline std::ostream& operator<<(std::ostream& out, DimCase dc) {
     out << "DimCase{ spv::Dim:::" << int(dc.dim) << " arrayed?:" << int(dc.arrayed)
@@ -255,35 +255,35 @@
     }
 }
 
-INSTANTIATE_TEST_SUITE_P(EnumConverterGood,
-                         SpvDimTest,
-                         testing::Values(
-                             // Non-arrayed
-                             DimCase{spv::Dim::Dim1D, false, true, type::TextureDimension::k1d},
-                             DimCase{spv::Dim::Dim2D, false, true, type::TextureDimension::k2d},
-                             DimCase{spv::Dim::Dim3D, false, true, type::TextureDimension::k3d},
-                             DimCase{spv::Dim::Cube, false, true, type::TextureDimension::kCube},
-                             // Arrayed
-                             DimCase{spv::Dim::Dim2D, true, true, type::TextureDimension::k2dArray},
-                             DimCase{spv::Dim::Cube, true, true,
-                                     type::TextureDimension::kCubeArray}));
+INSTANTIATE_TEST_SUITE_P(
+    EnumConverterGood,
+    SpvDimTest,
+    testing::Values(
+        // Non-arrayed
+        DimCase{spv::Dim::Dim1D, false, true, core::type::TextureDimension::k1d},
+        DimCase{spv::Dim::Dim2D, false, true, core::type::TextureDimension::k2d},
+        DimCase{spv::Dim::Dim3D, false, true, core::type::TextureDimension::k3d},
+        DimCase{spv::Dim::Cube, false, true, core::type::TextureDimension::kCube},
+        // Arrayed
+        DimCase{spv::Dim::Dim2D, true, true, core::type::TextureDimension::k2dArray},
+        DimCase{spv::Dim::Cube, true, true, core::type::TextureDimension::kCubeArray}));
 
 INSTANTIATE_TEST_SUITE_P(
     EnumConverterBad,
     SpvDimTest,
     testing::Values(
         // Invalid SPIR-V dimensionality.
-        DimCase{spv::Dim::Max, false, false, type::TextureDimension::kNone},
-        DimCase{spv::Dim::Max, true, false, type::TextureDimension::kNone},
+        DimCase{spv::Dim::Max, false, false, core::type::TextureDimension::kNone},
+        DimCase{spv::Dim::Max, true, false, core::type::TextureDimension::kNone},
         // Vulkan non-arrayed dimensionalities not supported by WGSL.
-        DimCase{spv::Dim::Rect, false, false, type::TextureDimension::kNone},
-        DimCase{spv::Dim::Buffer, false, false, type::TextureDimension::kNone},
-        DimCase{spv::Dim::SubpassData, false, false, type::TextureDimension::kNone},
+        DimCase{spv::Dim::Rect, false, false, core::type::TextureDimension::kNone},
+        DimCase{spv::Dim::Buffer, false, false, core::type::TextureDimension::kNone},
+        DimCase{spv::Dim::SubpassData, false, false, core::type::TextureDimension::kNone},
         // Arrayed dimensionalities not supported by WGSL
-        DimCase{spv::Dim::Dim3D, true, false, type::TextureDimension::kNone},
-        DimCase{spv::Dim::Rect, true, false, type::TextureDimension::kNone},
-        DimCase{spv::Dim::Buffer, true, false, type::TextureDimension::kNone},
-        DimCase{spv::Dim::SubpassData, true, false, type::TextureDimension::kNone}));
+        DimCase{spv::Dim::Dim3D, true, false, core::type::TextureDimension::kNone},
+        DimCase{spv::Dim::Rect, true, false, core::type::TextureDimension::kNone},
+        DimCase{spv::Dim::Buffer, true, false, core::type::TextureDimension::kNone},
+        DimCase{spv::Dim::SubpassData, true, false, core::type::TextureDimension::kNone}));
 
 // TexelFormat
 
diff --git a/src/tint/lang/spirv/reader/ast_parser/function.cc b/src/tint/lang/spirv/reader/ast_parser/function.cc
index 13db76f..895efcf 100644
--- a/src/tint/lang/spirv/reader/ast_parser/function.cc
+++ b/src/tint/lang/spirv/reader/ast_parser/function.cc
@@ -5662,9 +5662,9 @@
                           << inst.PrettyPrint();
         }
         switch (texture_type->dims) {
-            case type::TextureDimension::k2d:
-            case type::TextureDimension::k2dArray:
-            case type::TextureDimension::k3d:
+            case core::type::TextureDimension::k2d:
+            case core::type::TextureDimension::k2dArray:
+            case core::type::TextureDimension::k3d:
                 break;
             default:
                 return Fail() << "ConstOffset is only permitted for 2D, 2D Arrayed, "
@@ -5787,14 +5787,14 @@
             const ast::Expression* dims_call =
                 builder_.Call("textureDimensions", std::move(dims_args));
             auto dims = texture_type->dims;
-            if ((dims == type::TextureDimension::kCube) ||
-                (dims == type::TextureDimension::kCubeArray)) {
+            if ((dims == core::type::TextureDimension::kCube) ||
+                (dims == core::type::TextureDimension::kCubeArray)) {
                 // textureDimension returns a 3-element vector but SPIR-V expects 2.
                 dims_call =
                     create<ast::MemberAccessorExpression>(Source{}, dims_call, PrefixSwizzle(2));
             }
             exprs.Push(dims_call);
-            if (type::IsTextureArray(dims)) {
+            if (core::type::IsTextureArray(dims)) {
                 auto num_layers = builder_.Call("textureNumLayers", GetImageExpression(inst));
                 exprs.Push(num_layers);
             }
@@ -5979,10 +5979,10 @@
     if (!texture_type) {
         return {};
     }
-    type::TextureDimension dim = texture_type->dims;
+    core::type::TextureDimension dim = texture_type->dims;
     // Number of regular coordinates.
-    uint32_t num_axes = static_cast<uint32_t>(type::NumCoordinateAxes(dim));
-    bool is_arrayed = type::IsTextureArray(dim);
+    uint32_t num_axes = static_cast<uint32_t>(core::type::NumCoordinateAxes(dim));
+    bool is_arrayed = core::type::IsTextureArray(dim);
     if ((num_axes == 0) || (num_axes > 3)) {
         Fail() << "unsupported image dimensionality for " << texture_type->TypeInfo().name
                << " prompted by " << inst.PrettyPrint();
diff --git a/src/tint/lang/spirv/reader/ast_parser/type.cc b/src/tint/lang/spirv/reader/ast_parser/type.cc
index ef1ee5b..115e6f5 100644
--- a/src/tint/lang/spirv/reader/ast_parser/type.cc
+++ b/src/tint/lang/spirv/reader/ast_parser/type.cc
@@ -238,31 +238,31 @@
     }
 }
 
-Sampler::Sampler(type::SamplerKind k) : kind(k) {}
+Sampler::Sampler(core::type::SamplerKind k) : kind(k) {}
 Sampler::Sampler(const Sampler&) = default;
 
 ast::Type Sampler::Build(ProgramBuilder& b) const {
     return b.ty.sampler(kind);
 }
 
-Texture::Texture(type::TextureDimension d) : dims(d) {}
+Texture::Texture(core::type::TextureDimension d) : dims(d) {}
 Texture::Texture(const Texture&) = default;
 
-DepthTexture::DepthTexture(type::TextureDimension d) : Base(d) {}
+DepthTexture::DepthTexture(core::type::TextureDimension d) : Base(d) {}
 DepthTexture::DepthTexture(const DepthTexture&) = default;
 
 ast::Type DepthTexture::Build(ProgramBuilder& b) const {
     return b.ty.depth_texture(dims);
 }
 
-DepthMultisampledTexture::DepthMultisampledTexture(type::TextureDimension d) : Base(d) {}
+DepthMultisampledTexture::DepthMultisampledTexture(core::type::TextureDimension d) : Base(d) {}
 DepthMultisampledTexture::DepthMultisampledTexture(const DepthMultisampledTexture&) = default;
 
 ast::Type DepthMultisampledTexture::Build(ProgramBuilder& b) const {
     return b.ty.depth_multisampled_texture(dims);
 }
 
-MultisampledTexture::MultisampledTexture(type::TextureDimension d, const Type* t)
+MultisampledTexture::MultisampledTexture(core::type::TextureDimension d, const Type* t)
     : Base(d), type(t) {}
 MultisampledTexture::MultisampledTexture(const MultisampledTexture&) = default;
 
@@ -270,14 +270,14 @@
     return b.ty.multisampled_texture(dims, type->Build(b));
 }
 
-SampledTexture::SampledTexture(type::TextureDimension d, const Type* t) : Base(d), type(t) {}
+SampledTexture::SampledTexture(core::type::TextureDimension d, const Type* t) : Base(d), type(t) {}
 SampledTexture::SampledTexture(const SampledTexture&) = default;
 
 ast::Type SampledTexture::Build(ProgramBuilder& b) const {
     return b.ty.sampled_texture(dims, type->Build(b));
 }
 
-StorageTexture::StorageTexture(type::TextureDimension d, core::TexelFormat f, core::Access a)
+StorageTexture::StorageTexture(core::type::TextureDimension d, core::TexelFormat f, core::Access a)
     : Base(d), format(f), access(a) {}
 StorageTexture::StorageTexture(const StorageTexture&) = default;
 
@@ -512,30 +512,31 @@
     return state->structs_.Get(name, std::move(members));
 }
 
-const reader::Sampler* TypeManager::Sampler(type::SamplerKind kind) {
+const reader::Sampler* TypeManager::Sampler(core::type::SamplerKind kind) {
     return state->samplers_.Get(kind);
 }
 
-const reader::DepthTexture* TypeManager::DepthTexture(type::TextureDimension dims) {
+const reader::DepthTexture* TypeManager::DepthTexture(core::type::TextureDimension dims) {
     return state->depth_textures_.Get(dims);
 }
 
 const reader::DepthMultisampledTexture* TypeManager::DepthMultisampledTexture(
-    type::TextureDimension dims) {
+    core::type::TextureDimension dims) {
     return state->depth_multisampled_textures_.Get(dims);
 }
 
-const reader::MultisampledTexture* TypeManager::MultisampledTexture(type::TextureDimension dims,
-                                                                    const Type* ty) {
+const reader::MultisampledTexture* TypeManager::MultisampledTexture(
+    core::type::TextureDimension dims,
+    const Type* ty) {
     return state->multisampled_textures_.Get(dims, ty);
 }
 
-const reader::SampledTexture* TypeManager::SampledTexture(type::TextureDimension dims,
+const reader::SampledTexture* TypeManager::SampledTexture(core::type::TextureDimension dims,
                                                           const Type* ty) {
     return state->sampled_textures_.Get(dims, ty);
 }
 
-const reader::StorageTexture* TypeManager::StorageTexture(type::TextureDimension dims,
+const reader::StorageTexture* TypeManager::StorageTexture(core::type::TextureDimension dims,
                                                           core::TexelFormat fmt,
                                                           core::Access access) {
     return state->storage_textures_.Get(dims, fmt, access);
@@ -595,9 +596,9 @@
 
 std::string Sampler::String() const {
     switch (kind) {
-        case type::SamplerKind::kSampler:
+        case core::type::SamplerKind::kSampler:
             return "sampler";
-        case type::SamplerKind::kComparisonSampler:
+        case core::type::SamplerKind::kComparisonSampler:
             return "sampler_comparison";
     }
     return "<unknown sampler>";
diff --git a/src/tint/lang/spirv/reader/ast_parser/type.h b/src/tint/lang/spirv/reader/ast_parser/type.h
index 2c08913..65b95f8 100644
--- a/src/tint/lang/spirv/reader/ast_parser/type.h
+++ b/src/tint/lang/spirv/reader/ast_parser/type.h
@@ -305,7 +305,7 @@
 struct Sampler final : public Castable<Sampler, Type> {
     /// Constructor
     /// @param k the sampler kind
-    explicit Sampler(type::SamplerKind k);
+    explicit Sampler(core::type::SamplerKind k);
 
     /// Copy constructor
     /// @param other the other type to copy
@@ -321,7 +321,7 @@
 #endif  // NDEBUG
 
     /// the sampler kind
-    type::SamplerKind const kind;
+    core::type::SamplerKind const kind;
 };
 
 /// Base class for texture types
@@ -330,21 +330,21 @@
 
     /// Constructor
     /// @param d the texture dimensions
-    explicit Texture(type::TextureDimension d);
+    explicit Texture(core::type::TextureDimension d);
 
     /// Copy constructor
     /// @param other the other type to copy
     Texture(const Texture& other);
 
     /// the texture dimensions
-    type::TextureDimension const dims;
+    core::type::TextureDimension const dims;
 };
 
 /// `texture_depth_D` type
 struct DepthTexture final : public Castable<DepthTexture, Texture> {
     /// Constructor
     /// @param d the texture dimensions
-    explicit DepthTexture(type::TextureDimension d);
+    explicit DepthTexture(core::type::TextureDimension d);
 
     /// Copy constructor
     /// @param other the other type to copy
@@ -364,7 +364,7 @@
 struct DepthMultisampledTexture final : public Castable<DepthMultisampledTexture, Texture> {
     /// Constructor
     /// @param d the texture dimensions
-    explicit DepthMultisampledTexture(type::TextureDimension d);
+    explicit DepthMultisampledTexture(core::type::TextureDimension d);
 
     /// Copy constructor
     /// @param other the other type to copy
@@ -385,7 +385,7 @@
     /// Constructor
     /// @param d the texture dimensions
     /// @param t the multisampled texture type
-    MultisampledTexture(type::TextureDimension d, const Type* t);
+    MultisampledTexture(core::type::TextureDimension d, const Type* t);
 
     /// Copy constructor
     /// @param other the other type to copy
@@ -409,7 +409,7 @@
     /// Constructor
     /// @param d the texture dimensions
     /// @param t the sampled texture type
-    SampledTexture(type::TextureDimension d, const Type* t);
+    SampledTexture(core::type::TextureDimension d, const Type* t);
 
     /// Copy constructor
     /// @param other the other type to copy
@@ -434,7 +434,7 @@
     /// @param d the texture dimensions
     /// @param f the storage image format
     /// @param a the access control
-    StorageTexture(type::TextureDimension d, core::TexelFormat f, core::Access a);
+    StorageTexture(core::type::TextureDimension d, core::TexelFormat f, core::Access a);
 
     /// Copy constructor
     /// @param other the other type to copy
@@ -590,31 +590,33 @@
     /// @param k the sampler kind
     /// @return a Sampler type. Repeated calls with the same arguments will return
     /// the same pointer.
-    const reader::Sampler* Sampler(type::SamplerKind k);
+    const reader::Sampler* Sampler(core::type::SamplerKind k);
     /// @param d the texture dimensions
     /// @return a DepthTexture type. Repeated calls with the same arguments will
     /// return the same pointer.
-    const reader::DepthTexture* DepthTexture(type::TextureDimension d);
+    const reader::DepthTexture* DepthTexture(core::type::TextureDimension d);
     /// @param d the texture dimensions
     /// @return a DepthMultisampledTexture type. Repeated calls with the same
     /// arguments will return the same pointer.
-    const reader::DepthMultisampledTexture* DepthMultisampledTexture(type::TextureDimension d);
+    const reader::DepthMultisampledTexture* DepthMultisampledTexture(
+        core::type::TextureDimension d);
     /// @param d the texture dimensions
     /// @param t the multisampled texture type
     /// @return a MultisampledTexture type. Repeated calls with the same arguments
     /// will return the same pointer.
-    const reader::MultisampledTexture* MultisampledTexture(type::TextureDimension d, const Type* t);
+    const reader::MultisampledTexture* MultisampledTexture(core::type::TextureDimension d,
+                                                           const Type* t);
     /// @param d the texture dimensions
     /// @param t the sampled texture type
     /// @return a SampledTexture type. Repeated calls with the same arguments will
     /// return the same pointer.
-    const reader::SampledTexture* SampledTexture(type::TextureDimension d, const Type* t);
+    const reader::SampledTexture* SampledTexture(core::type::TextureDimension d, const Type* t);
     /// @param d the texture dimensions
     /// @param f the storage image format
     /// @param a the access control
     /// @return a StorageTexture type. Repeated calls with the same arguments will
     /// return the same pointer.
-    const reader::StorageTexture* StorageTexture(type::TextureDimension d,
+    const reader::StorageTexture* StorageTexture(core::type::TextureDimension d,
                                                  core::TexelFormat f,
                                                  core::Access a);
 
diff --git a/src/tint/lang/spirv/reader/ast_parser/type_test.cc b/src/tint/lang/spirv/reader/ast_parser/type_test.cc
index fba68b8..1cbd2ff6 100644
--- a/src/tint/lang/spirv/reader/ast_parser/type_test.cc
+++ b/src/tint/lang/spirv/reader/ast_parser/type_test.cc
@@ -36,16 +36,17 @@
     EXPECT_EQ(ty.Array(ty.I32(), 3, 2), ty.Array(ty.I32(), 3, 2));
     EXPECT_EQ(ty.Alias(sym, ty.I32()), ty.Alias(sym, ty.I32()));
     EXPECT_EQ(ty.Struct(sym, {ty.I32()}), ty.Struct(sym, {ty.I32()}));
-    EXPECT_EQ(ty.Sampler(type::SamplerKind::kSampler), ty.Sampler(type::SamplerKind::kSampler));
-    EXPECT_EQ(ty.DepthTexture(type::TextureDimension::k2d),
-              ty.DepthTexture(type::TextureDimension::k2d));
-    EXPECT_EQ(ty.MultisampledTexture(type::TextureDimension::k2d, ty.I32()),
-              ty.MultisampledTexture(type::TextureDimension::k2d, ty.I32()));
-    EXPECT_EQ(ty.SampledTexture(type::TextureDimension::k2d, ty.I32()),
-              ty.SampledTexture(type::TextureDimension::k2d, ty.I32()));
-    EXPECT_EQ(ty.StorageTexture(type::TextureDimension::k2d, core::TexelFormat::kR32Uint,
+    EXPECT_EQ(ty.Sampler(core::type::SamplerKind::kSampler),
+              ty.Sampler(core::type::SamplerKind::kSampler));
+    EXPECT_EQ(ty.DepthTexture(core::type::TextureDimension::k2d),
+              ty.DepthTexture(core::type::TextureDimension::k2d));
+    EXPECT_EQ(ty.MultisampledTexture(core::type::TextureDimension::k2d, ty.I32()),
+              ty.MultisampledTexture(core::type::TextureDimension::k2d, ty.I32()));
+    EXPECT_EQ(ty.SampledTexture(core::type::TextureDimension::k2d, ty.I32()),
+              ty.SampledTexture(core::type::TextureDimension::k2d, ty.I32()));
+    EXPECT_EQ(ty.StorageTexture(core::type::TextureDimension::k2d, core::TexelFormat::kR32Uint,
                                 core::Access::kRead),
-              ty.StorageTexture(type::TextureDimension::k2d, core::TexelFormat::kR32Uint,
+              ty.StorageTexture(core::type::TextureDimension::k2d, core::TexelFormat::kR32Uint,
                                 core::Access::kRead));
 }
 
@@ -68,29 +69,29 @@
     EXPECT_NE(ty.Array(ty.I32(), 3, 2), ty.Array(ty.I32(), 3, 3));
     EXPECT_NE(ty.Alias(sym_a, ty.I32()), ty.Alias(sym_b, ty.I32()));
     EXPECT_NE(ty.Struct(sym_a, {ty.I32()}), ty.Struct(sym_b, {ty.I32()}));
-    EXPECT_NE(ty.Sampler(type::SamplerKind::kSampler),
-              ty.Sampler(type::SamplerKind::kComparisonSampler));
-    EXPECT_NE(ty.DepthTexture(type::TextureDimension::k2d),
-              ty.DepthTexture(type::TextureDimension::k1d));
-    EXPECT_NE(ty.MultisampledTexture(type::TextureDimension::k2d, ty.I32()),
-              ty.MultisampledTexture(type::TextureDimension::k3d, ty.I32()));
-    EXPECT_NE(ty.MultisampledTexture(type::TextureDimension::k2d, ty.I32()),
-              ty.MultisampledTexture(type::TextureDimension::k2d, ty.U32()));
-    EXPECT_NE(ty.SampledTexture(type::TextureDimension::k2d, ty.I32()),
-              ty.SampledTexture(type::TextureDimension::k3d, ty.I32()));
-    EXPECT_NE(ty.SampledTexture(type::TextureDimension::k2d, ty.I32()),
-              ty.SampledTexture(type::TextureDimension::k2d, ty.U32()));
-    EXPECT_NE(ty.StorageTexture(type::TextureDimension::k2d, core::TexelFormat::kR32Uint,
+    EXPECT_NE(ty.Sampler(core::type::SamplerKind::kSampler),
+              ty.Sampler(core::type::SamplerKind::kComparisonSampler));
+    EXPECT_NE(ty.DepthTexture(core::type::TextureDimension::k2d),
+              ty.DepthTexture(core::type::TextureDimension::k1d));
+    EXPECT_NE(ty.MultisampledTexture(core::type::TextureDimension::k2d, ty.I32()),
+              ty.MultisampledTexture(core::type::TextureDimension::k3d, ty.I32()));
+    EXPECT_NE(ty.MultisampledTexture(core::type::TextureDimension::k2d, ty.I32()),
+              ty.MultisampledTexture(core::type::TextureDimension::k2d, ty.U32()));
+    EXPECT_NE(ty.SampledTexture(core::type::TextureDimension::k2d, ty.I32()),
+              ty.SampledTexture(core::type::TextureDimension::k3d, ty.I32()));
+    EXPECT_NE(ty.SampledTexture(core::type::TextureDimension::k2d, ty.I32()),
+              ty.SampledTexture(core::type::TextureDimension::k2d, ty.U32()));
+    EXPECT_NE(ty.StorageTexture(core::type::TextureDimension::k2d, core::TexelFormat::kR32Uint,
                                 core::Access::kRead),
-              ty.StorageTexture(type::TextureDimension::k3d, core::TexelFormat::kR32Uint,
+              ty.StorageTexture(core::type::TextureDimension::k3d, core::TexelFormat::kR32Uint,
                                 core::Access::kRead));
-    EXPECT_NE(ty.StorageTexture(type::TextureDimension::k2d, core::TexelFormat::kR32Uint,
+    EXPECT_NE(ty.StorageTexture(core::type::TextureDimension::k2d, core::TexelFormat::kR32Uint,
                                 core::Access::kRead),
-              ty.StorageTexture(type::TextureDimension::k2d, core::TexelFormat::kR32Sint,
+              ty.StorageTexture(core::type::TextureDimension::k2d, core::TexelFormat::kR32Sint,
                                 core::Access::kRead));
-    EXPECT_NE(ty.StorageTexture(type::TextureDimension::k2d, core::TexelFormat::kR32Uint,
+    EXPECT_NE(ty.StorageTexture(core::type::TextureDimension::k2d, core::TexelFormat::kR32Uint,
                                 core::Access::kRead),
-              ty.StorageTexture(type::TextureDimension::k2d, core::TexelFormat::kR32Uint,
+              ty.StorageTexture(core::type::TextureDimension::k2d, core::TexelFormat::kR32Uint,
                                 core::Access::kWrite));
 }
 
diff --git a/src/tint/lang/spirv/writer/ast_printer/ast_builtin_test.cc b/src/tint/lang/spirv/writer/ast_printer/ast_builtin_test.cc
index 34a34a7..8a34624 100644
--- a/src/tint/lang/spirv/writer/ast_printer/ast_builtin_test.cc
+++ b/src/tint/lang/spirv/writer/ast_printer/ast_builtin_test.cc
@@ -42,8 +42,8 @@
 
 // This tests that we do not push OpTypeSampledImage and float_0 type twice.
 TEST_F(BuiltinSpirvASTPrinterTest, Call_TextureSampleCompare_Twice) {
-    auto s = ty.sampler(type::SamplerKind::kComparisonSampler);
-    auto t = ty.depth_texture(type::TextureDimension::k2d);
+    auto s = ty.sampler(core::type::SamplerKind::kComparisonSampler);
+    auto t = ty.depth_texture(core::type::TextureDimension::k2d);
 
     auto* tex = GlobalVar("texture", t, Binding(0_a), Group(0_a));
     auto* sampler = GlobalVar("sampler", s, Binding(1_a), Group(0_a));
diff --git a/src/tint/lang/spirv/writer/ast_printer/ast_type_test.cc b/src/tint/lang/spirv/writer/ast_printer/ast_type_test.cc
index dca6047..090d165 100644
--- a/src/tint/lang/spirv/writer/ast_printer/ast_type_test.cc
+++ b/src/tint/lang/spirv/writer/ast_printer/ast_type_test.cc
@@ -117,7 +117,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, GenerateBool) {
-    auto* bool_ = create<type::Bool>();
+    auto* bool_ = create<core::type::Bool>();
 
     Builder& b = Build();
 
@@ -131,8 +131,8 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, ReturnsGeneratedBool) {
-    auto* bool_ = create<type::Bool>();
-    auto* i32 = create<type::I32>();
+    auto* bool_ = create<core::type::Bool>();
+    auto* i32 = create<core::type::I32>();
 
     Builder& b = Build();
 
@@ -145,7 +145,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, GenerateF32) {
-    auto* f32 = create<type::F32>();
+    auto* f32 = create<core::type::F32>();
 
     Builder& b = Build();
 
@@ -159,8 +159,8 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, ReturnsGeneratedF32) {
-    auto* f32 = create<type::F32>();
-    auto* i32 = create<type::I32>();
+    auto* f32 = create<core::type::F32>();
+    auto* i32 = create<core::type::I32>();
 
     Builder& b = Build();
 
@@ -173,7 +173,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, GenerateF16) {
-    auto* f16 = create<type::F16>();
+    auto* f16 = create<core::type::F16>();
 
     Builder& b = Build();
 
@@ -187,8 +187,8 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, ReturnsGeneratedF16) {
-    auto* f16 = create<type::F16>();
-    auto* i32 = create<type::I32>();
+    auto* f16 = create<core::type::F16>();
+    auto* i32 = create<core::type::I32>();
 
     Builder& b = Build();
 
@@ -201,7 +201,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, GenerateI32) {
-    auto* i32 = create<type::I32>();
+    auto* i32 = create<core::type::I32>();
 
     Builder& b = Build();
 
@@ -215,8 +215,8 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, ReturnsGeneratedI32) {
-    auto* f32 = create<type::F32>();
-    auto* i32 = create<type::I32>();
+    auto* f32 = create<core::type::F32>();
+    auto* i32 = create<core::type::I32>();
 
     Builder& b = Build();
 
@@ -229,9 +229,9 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, GenerateMatrix) {
-    auto* f32 = create<type::F32>();
-    auto* vec3 = create<type::Vector>(f32, 3u);
-    auto* mat2x3 = create<type::Matrix>(vec3, 2u);
+    auto* f32 = create<core::type::F32>();
+    auto* vec3 = create<core::type::Vector>(f32, 3u);
+    auto* mat2x3 = create<core::type::Matrix>(vec3, 2u);
 
     Builder& b = Build();
 
@@ -247,9 +247,9 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, ReturnsGeneratedMatrix) {
-    auto* i32 = create<type::I32>();
-    auto* col = create<type::Vector>(i32, 4u);
-    auto* mat = create<type::Matrix>(col, 3u);
+    auto* i32 = create<core::type::I32>();
+    auto* col = create<core::type::Vector>(i32, 4u);
+    auto* mat = create<core::type::Matrix>(col, 3u);
 
     Builder& b = Build();
 
@@ -262,9 +262,9 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, GenerateF16Matrix) {
-    auto* f16 = create<type::F16>();
-    auto* vec3 = create<type::Vector>(f16, 3u);
-    auto* mat2x3 = create<type::Matrix>(vec3, 2u);
+    auto* f16 = create<core::type::F16>();
+    auto* vec3 = create<core::type::Vector>(f16, 3u);
+    auto* mat2x3 = create<core::type::Matrix>(vec3, 2u);
 
     Builder& b = Build();
 
@@ -280,9 +280,9 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, ReturnsGeneratedF16Matrix) {
-    auto* f16 = create<type::F16>();
-    auto* col = create<type::Vector>(f16, 4u);
-    auto* mat = create<type::Matrix>(col, 3u);
+    auto* f16 = create<core::type::F16>();
+    auto* col = create<core::type::Vector>(f16, 4u);
+    auto* mat = create<core::type::Matrix>(col, 3u);
 
     Builder& b = Build();
 
@@ -295,8 +295,9 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, GeneratePtr) {
-    auto* i32 = create<type::I32>();
-    auto* ptr = create<type::Pointer>(core::AddressSpace::kOut, i32, core::Access::kReadWrite);
+    auto* i32 = create<core::type::I32>();
+    auto* ptr =
+        create<core::type::Pointer>(core::AddressSpace::kOut, i32, core::Access::kReadWrite);
 
     Builder& b = Build();
 
@@ -310,8 +311,9 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, ReturnsGeneratedPtr) {
-    auto* i32 = create<type::I32>();
-    auto* ptr = create<type::Pointer>(core::AddressSpace::kOut, i32, core::Access::kReadWrite);
+    auto* i32 = create<core::type::I32>();
+    auto* ptr =
+        create<core::type::Pointer>(core::AddressSpace::kOut, i32, core::Access::kReadWrite);
 
     Builder& b = Build();
 
@@ -519,7 +521,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, GenerateU32) {
-    auto* u32 = create<type::U32>();
+    auto* u32 = create<core::type::U32>();
 
     Builder& b = Build();
 
@@ -533,8 +535,8 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, ReturnsGeneratedU32) {
-    auto* u32 = create<type::U32>();
-    auto* f32 = create<type::F32>();
+    auto* u32 = create<core::type::U32>();
+    auto* f32 = create<core::type::F32>();
 
     Builder& b = Build();
 
@@ -547,7 +549,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, GenerateVector) {
-    auto* vec = create<type::Vector>(create<type::F32>(), 3u);
+    auto* vec = create<core::type::Vector>(create<core::type::F32>(), 3u);
 
     Builder& b = Build();
 
@@ -562,8 +564,8 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, ReturnsGeneratedVector) {
-    auto* i32 = create<type::I32>();
-    auto* vec = create<type::Vector>(i32, 3u);
+    auto* i32 = create<core::type::I32>();
+    auto* vec = create<core::type::Vector>(i32, 3u);
 
     Builder& b = Build();
 
@@ -576,7 +578,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, GenerateVoid) {
-    auto* void_ = create<type::Void>();
+    auto* void_ = create<core::type::Void>();
 
     Builder& b = Build();
 
@@ -590,8 +592,8 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, ReturnsGeneratedVoid) {
-    auto* void_ = create<type::Void>();
-    auto* i32 = create<type::I32>();
+    auto* void_ = create<core::type::Void>();
+    auto* i32 = create<core::type::I32>();
 
     Builder& b = Build();
 
@@ -635,7 +637,7 @@
                     PtrData{core::AddressSpace::kFunction, SpvStorageClassFunction}));
 
 TEST_F(SpirvASTPrinterTest_Type, DepthTexture_Generate_2d) {
-    auto* two_d = create<type::DepthTexture>(type::TextureDimension::k2d);
+    auto* two_d = create<core::type::DepthTexture>(core::type::TextureDimension::k2d);
 
     Builder& b = Build();
 
@@ -649,7 +651,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, DepthTexture_Generate_2dArray) {
-    auto* two_d_array = create<type::DepthTexture>(type::TextureDimension::k2dArray);
+    auto* two_d_array = create<core::type::DepthTexture>(core::type::TextureDimension::k2dArray);
 
     Builder& b = Build();
 
@@ -663,7 +665,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, DepthTexture_Generate_Cube) {
-    auto* cube = create<type::DepthTexture>(type::TextureDimension::kCube);
+    auto* cube = create<core::type::DepthTexture>(core::type::TextureDimension::kCube);
 
     Builder& b = Build();
 
@@ -678,7 +680,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, DepthTexture_Generate_CubeArray) {
-    auto* cube_array = create<type::DepthTexture>(type::TextureDimension::kCubeArray);
+    auto* cube_array = create<core::type::DepthTexture>(core::type::TextureDimension::kCubeArray);
 
     Builder& b = Build();
 
@@ -695,8 +697,8 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, MultisampledTexture_Generate_2d_i32) {
-    auto* i32 = create<type::I32>();
-    auto* ms = create<type::MultisampledTexture>(type::TextureDimension::k2d, i32);
+    auto* i32 = create<core::type::I32>();
+    auto* ms = create<core::type::MultisampledTexture>(core::type::TextureDimension::k2d, i32);
 
     Builder& b = Build();
 
@@ -708,8 +710,8 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, MultisampledTexture_Generate_2d_u32) {
-    auto* u32 = create<type::U32>();
-    auto* ms = create<type::MultisampledTexture>(type::TextureDimension::k2d, u32);
+    auto* u32 = create<core::type::U32>();
+    auto* ms = create<core::type::MultisampledTexture>(core::type::TextureDimension::k2d, u32);
 
     Builder& b = Build();
 
@@ -722,8 +724,8 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, MultisampledTexture_Generate_2d_f32) {
-    auto* f32 = create<type::F32>();
-    auto* ms = create<type::MultisampledTexture>(type::TextureDimension::k2d, f32);
+    auto* f32 = create<core::type::F32>();
+    auto* ms = create<core::type::MultisampledTexture>(core::type::TextureDimension::k2d, f32);
 
     Builder& b = Build();
 
@@ -736,7 +738,8 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, SampledTexture_Generate_1d_i32) {
-    auto* s = create<type::SampledTexture>(type::TextureDimension::k1d, create<type::I32>());
+    auto* s = create<core::type::SampledTexture>(core::type::TextureDimension::k1d,
+                                                 create<core::type::I32>());
 
     Builder& b = Build();
 
@@ -753,8 +756,8 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, SampledTexture_Generate_1d_u32) {
-    auto* u32 = create<type::U32>();
-    auto* s = create<type::SampledTexture>(type::TextureDimension::k1d, u32);
+    auto* u32 = create<core::type::U32>();
+    auto* s = create<core::type::SampledTexture>(core::type::TextureDimension::k1d, u32);
 
     Builder& b = Build();
 
@@ -771,8 +774,8 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, SampledTexture_Generate_1d_f32) {
-    auto* f32 = create<type::F32>();
-    auto* s = create<type::SampledTexture>(type::TextureDimension::k1d, f32);
+    auto* f32 = create<core::type::F32>();
+    auto* s = create<core::type::SampledTexture>(core::type::TextureDimension::k1d, f32);
 
     Builder& b = Build();
 
@@ -789,8 +792,8 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, SampledTexture_Generate_2d) {
-    auto* f32 = create<type::F32>();
-    auto* s = create<type::SampledTexture>(type::TextureDimension::k2d, f32);
+    auto* f32 = create<core::type::F32>();
+    auto* s = create<core::type::SampledTexture>(core::type::TextureDimension::k2d, f32);
 
     Builder& b = Build();
 
@@ -803,8 +806,8 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, SampledTexture_Generate_2d_array) {
-    auto* f32 = create<type::F32>();
-    auto* s = create<type::SampledTexture>(type::TextureDimension::k2dArray, f32);
+    auto* f32 = create<core::type::F32>();
+    auto* s = create<core::type::SampledTexture>(core::type::TextureDimension::k2dArray, f32);
 
     Builder& b = Build();
 
@@ -817,8 +820,8 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, SampledTexture_Generate_3d) {
-    auto* f32 = create<type::F32>();
-    auto* s = create<type::SampledTexture>(type::TextureDimension::k3d, f32);
+    auto* f32 = create<core::type::F32>();
+    auto* s = create<core::type::SampledTexture>(core::type::TextureDimension::k3d, f32);
 
     Builder& b = Build();
 
@@ -831,8 +834,8 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, SampledTexture_Generate_Cube) {
-    auto* f32 = create<type::F32>();
-    auto* s = create<type::SampledTexture>(type::TextureDimension::kCube, f32);
+    auto* f32 = create<core::type::F32>();
+    auto* s = create<core::type::SampledTexture>(core::type::TextureDimension::kCube, f32);
 
     Builder& b = Build();
 
@@ -846,8 +849,8 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, SampledTexture_Generate_CubeArray) {
-    auto* f32 = create<type::F32>();
-    auto* s = create<type::SampledTexture>(type::TextureDimension::kCubeArray, f32);
+    auto* f32 = create<core::type::F32>();
+    auto* s = create<core::type::SampledTexture>(core::type::TextureDimension::kCubeArray, f32);
 
     Builder& b = Build();
 
@@ -863,7 +866,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, StorageTexture_Generate_1d) {
-    auto s = ty.storage_texture(type::TextureDimension::k1d, core::TexelFormat::kR32Float,
+    auto s = ty.storage_texture(core::type::TextureDimension::k1d, core::TexelFormat::kR32Float,
                                 core::Access::kWrite);
 
     ast::Type ty = GlobalVar("test_var", s, Binding(0_a), Group(0_a))->type;
@@ -878,7 +881,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, StorageTexture_Generate_2d) {
-    auto s = ty.storage_texture(type::TextureDimension::k2d, core::TexelFormat::kR32Float,
+    auto s = ty.storage_texture(core::type::TextureDimension::k2d, core::TexelFormat::kR32Float,
                                 core::Access::kWrite);
 
     ast::Type ty = GlobalVar("test_var", s, Binding(0_a), Group(0_a))->type;
@@ -893,8 +896,8 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, StorageTexture_Generate_2dArray) {
-    auto s = ty.storage_texture(type::TextureDimension::k2dArray, core::TexelFormat::kR32Float,
-                                core::Access::kWrite);
+    auto s = ty.storage_texture(core::type::TextureDimension::k2dArray,
+                                core::TexelFormat::kR32Float, core::Access::kWrite);
 
     ast::Type ty = GlobalVar("test_var", s, Binding(0_a), Group(0_a))->type;
 
@@ -908,7 +911,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, StorageTexture_Generate_3d) {
-    auto s = ty.storage_texture(type::TextureDimension::k3d, core::TexelFormat::kR32Float,
+    auto s = ty.storage_texture(core::type::TextureDimension::k3d, core::TexelFormat::kR32Float,
                                 core::Access::kWrite);
 
     ast::Type ty = GlobalVar("test_var", s, Binding(0_a), Group(0_a))->type;
@@ -923,7 +926,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, StorageTexture_Generate_SampledTypeFloat_Format_r32float) {
-    auto s = ty.storage_texture(type::TextureDimension::k2d, core::TexelFormat::kR32Float,
+    auto s = ty.storage_texture(core::type::TextureDimension::k2d, core::TexelFormat::kR32Float,
                                 core::Access::kWrite);
 
     ast::Type ty = GlobalVar("test_var", s, Binding(0_a), Group(0_a))->type;
@@ -938,7 +941,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, StorageTexture_Generate_SampledTypeSint_Format_r32sint) {
-    auto s = ty.storage_texture(type::TextureDimension::k2d, core::TexelFormat::kR32Sint,
+    auto s = ty.storage_texture(core::type::TextureDimension::k2d, core::TexelFormat::kR32Sint,
                                 core::Access::kWrite);
 
     ast::Type ty = GlobalVar("test_var", s, Binding(0_a), Group(0_a))->type;
@@ -953,7 +956,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, StorageTexture_Generate_SampledTypeUint_Format_r32uint) {
-    auto s = ty.storage_texture(type::TextureDimension::k2d, core::TexelFormat::kR32Uint,
+    auto s = ty.storage_texture(core::type::TextureDimension::k2d, core::TexelFormat::kR32Uint,
                                 core::Access::kWrite);
 
     ast::Type ty = GlobalVar("test_var", s, Binding(0_a), Group(0_a))->type;
@@ -968,7 +971,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, Sampler) {
-    auto* sampler = create<type::Sampler>(type::SamplerKind::kSampler);
+    auto* sampler = create<core::type::Sampler>(core::type::SamplerKind::kSampler);
 
     Builder& b = Build();
 
@@ -978,7 +981,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, ComparisonSampler) {
-    auto* sampler = create<type::Sampler>(type::SamplerKind::kComparisonSampler);
+    auto* sampler = create<core::type::Sampler>(core::type::SamplerKind::kComparisonSampler);
 
     Builder& b = Build();
 
@@ -988,8 +991,8 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, Dedup_Sampler_And_ComparisonSampler) {
-    auto* comp_sampler = create<type::Sampler>(type::SamplerKind::kComparisonSampler);
-    auto* sampler = create<type::Sampler>(type::SamplerKind::kSampler);
+    auto* comp_sampler = create<core::type::Sampler>(core::type::SamplerKind::kComparisonSampler);
+    auto* sampler = create<core::type::Sampler>(core::type::SamplerKind::kSampler);
 
     Builder& b = Build();
 
diff --git a/src/tint/lang/spirv/writer/ast_printer/builder.cc b/src/tint/lang/spirv/writer/ast_printer/builder.cc
index 99d53d0..4aa4876 100644
--- a/src/tint/lang/spirv/writer/ast_printer/builder.cc
+++ b/src/tint/lang/spirv/writer/ast_printer/builder.cc
@@ -82,11 +82,11 @@
 /// one or more levels of an arrays inside of `type`.
 /// @param type the given type, which must not be null
 /// @returns the nested matrix type, or nullptr if none
-const type::Matrix* GetNestedMatrixType(const type::Type* type) {
-    while (auto* arr = type->As<type::Array>()) {
+const core::type::Matrix* GetNestedMatrixType(const core::type::Type* type) {
+    while (auto* arr = type->As<core::type::Array>()) {
         type = arr->ElemType();
     }
-    return type->As<type::Matrix>();
+    return type->As<core::type::Matrix>();
 }
 
 uint32_t builtin_to_glsl_method(const sem::Builtin* builtin) {
@@ -232,8 +232,8 @@
 }
 
 /// @return the vector element type if ty is a vector, otherwise return ty.
-const type::Type* ElementTypeOf(const type::Type* ty) {
-    if (auto* v = ty->As<type::Vector>()) {
+const core::type::Type* ElementTypeOf(const core::type::Type* ty) {
+    if (auto* v = ty->As<core::type::Vector>()) {
         return v->type();
     }
     return ty;
@@ -572,7 +572,7 @@
     }
 
     if (InsideBasicBlock()) {
-        if (func->ReturnType()->Is<type::Void>()) {
+        if (func->ReturnType()->Is<core::type::Void>()) {
             push_function_inst(spv::Op::OpReturn, {});
         } else {
             auto zero = GenerateConstantNullIfNeeded(func->ReturnType());
@@ -722,8 +722,8 @@
     if (v->initializer) {
         ops.push_back(Operand(init_id));
     } else {
-        auto* st = type->As<type::StorageTexture>();
-        if (st || type->Is<type::Struct>()) {
+        auto* st = type->As<core::type::StorageTexture>();
+        if (st || type->Is<core::type::Struct>()) {
             // type is a type::Struct or a type::StorageTexture
             auto access = st ? st->access() : sem->Access();
             switch (access) {
@@ -740,7 +740,7 @@
                     break;
             }
         }
-        if (!type->Is<type::Sampler>()) {
+        if (!type->Is<core::type::Sampler>()) {
             // If we don't have a initializer and we're an Output or Private
             // variable, then WGSL requires that we zero-initialize.
             // If we're a Workgroup variable, and the
@@ -846,7 +846,7 @@
     // If the source is a reference, we access chain into it.
     // In the future, pointers may support access-chaining.
     // See https://github.com/gpuweb/gpuweb/pull/1580
-    if (info->source_type->Is<type::Reference>()) {
+    if (info->source_type->Is<core::type::Reference>()) {
         info->access_chain_indices.push_back(idx_id);
         info->source_type = builder_.Sem().Get(expr)->UnwrapLoad()->Type();
         return true;
@@ -881,7 +881,7 @@
     }
 
     // If the source is a vector, we use OpVectorExtractDynamic.
-    if (TINT_LIKELY(info->source_type->Is<type::Vector>())) {
+    if (TINT_LIKELY(info->source_type->Is<core::type::Vector>())) {
         if (!push_function_inst(
                 spv::Op::OpVectorExtractDynamic,
                 {Operand(result_type_id), extract, Operand(info->source_id), Operand(idx_id)})) {
@@ -908,7 +908,7 @@
         [&](const sem::StructMemberAccess* access) {
             uint32_t idx = access->Member()->Index();
 
-            if (info->source_type->Is<type::Reference>()) {
+            if (info->source_type->Is<core::type::Reference>()) {
                 auto idx_id = GenerateConstantIfNeeded(ScalarConstant::U32(idx));
                 if (TINT_UNLIKELY(idx_id == 0)) {
                     return false;
@@ -939,7 +939,7 @@
             // Single element swizzle is either an access chain or a composite extract
             auto& indices = swizzle->Indices();
             if (indices.Length() == 1) {
-                if (info->source_type->Is<type::Reference>()) {
+                if (info->source_type->Is<core::type::Reference>()) {
                     auto idx_id = GenerateConstantIfNeeded(ScalarConstant::U32(indices[0]));
                     if (TINT_UNLIKELY(idx_id == 0)) {
                         return false;
@@ -1107,7 +1107,7 @@
     return 0;
 }
 
-uint32_t Builder::GenerateLoad(const type::Reference* type, uint32_t id) {
+uint32_t Builder::GenerateLoad(const core::type::Reference* type, uint32_t id) {
     auto type_id = GenerateTypeIfNeeded(type->StoreType());
     auto result = result_op();
     auto result_id = std::get<uint32_t>(result);
@@ -1117,8 +1117,8 @@
     return result_id;
 }
 
-uint32_t Builder::GenerateLoadIfNeeded(const type::Type* type, uint32_t id) {
-    if (auto* ref = type->As<type::Reference>()) {
+uint32_t Builder::GenerateLoadIfNeeded(const core::type::Type* type, uint32_t id) {
+    if (auto* ref = type->As<core::type::Reference>()) {
         return GenerateLoad(ref, id);
     }
     return id;
@@ -1243,22 +1243,22 @@
         return 0;
     }
 
-    bool can_cast_or_copy = result_type->Is<type::Scalar>();
+    bool can_cast_or_copy = result_type->Is<core::type::Scalar>();
 
-    if (auto* res_vec = result_type->As<type::Vector>()) {
-        if (res_vec->type()->Is<type::Scalar>()) {
+    if (auto* res_vec = result_type->As<core::type::Vector>()) {
+        if (res_vec->type()->Is<core::type::Scalar>()) {
             auto* value_type = args[0]->Type()->UnwrapRef();
-            if (auto* val_vec = value_type->As<type::Vector>()) {
-                if (val_vec->type()->Is<type::Scalar>()) {
+            if (auto* val_vec = value_type->As<core::type::Vector>()) {
+                if (val_vec->type()->Is<core::type::Scalar>()) {
                     can_cast_or_copy = res_vec->Width() == val_vec->Width();
                 }
             }
         }
     }
 
-    if (auto* res_mat = result_type->As<type::Matrix>()) {
+    if (auto* res_mat = result_type->As<core::type::Matrix>()) {
         auto* value_type = args[0]->Type()->UnwrapRef();
-        if (auto* val_mat = value_type->As<type::Matrix>()) {
+        if (auto* val_mat = value_type->As<core::type::Matrix>()) {
             // Generate passthrough for matrices of the same type
             can_cast_or_copy = res_mat == val_mat;
         }
@@ -1276,7 +1276,7 @@
     bool result_is_constant_composite = constructor_is_const;
     bool result_is_spec_composite = false;
 
-    if (auto* vec = result_type->As<type::Vector>()) {
+    if (auto* vec = result_type->As<core::type::Vector>()) {
         result_type = vec->type();
     }
 
@@ -1298,15 +1298,15 @@
         // If the result and value types are the same we can just use the object.
         // If the result is not a vector then we should have validated that the
         // value type is a correctly sized vector so we can just use it directly.
-        if (result_type == value_type || result_type->Is<type::Matrix>() ||
-            result_type->Is<type::Array>() || result_type->Is<type::Struct>()) {
+        if (result_type == value_type || result_type->Is<core::type::Matrix>() ||
+            result_type->Is<core::type::Array>() || result_type->Is<core::type::Struct>()) {
             ops.push_back(Operand(id));
             continue;
         }
 
         // Both scalars, but not the same type so we need to generate a conversion
         // of the value.
-        if (value_type->Is<type::Scalar>() && result_type->Is<type::Scalar>()) {
+        if (value_type->Is<core::type::Scalar>() && result_type->Is<core::type::Scalar>()) {
             id = GenerateCastOrCopyOrPassthrough(result_type, args[0]->Declaration(), global_var);
             ops.push_back(Operand(id));
             continue;
@@ -1321,7 +1321,7 @@
         //
         // For cases 1 and 2, if the type is different we also may need to insert
         // a type cast.
-        if (auto* vec = value_type->As<type::Vector>()) {
+        if (auto* vec = value_type->As<core::type::Vector>()) {
             auto* vec_type = vec->type();
 
             auto value_type_id = GenerateTypeIfNeeded(vec_type);
@@ -1368,8 +1368,8 @@
     // For a single-value vector initializer, splat the initializer value.
     auto* const init_result_type = call->Type()->UnwrapRef();
     if (args.Length() == 1 && init_result_type->is_scalar_vector() &&
-        args[0]->Type()->UnwrapRef()->Is<type::Scalar>()) {
-        size_t vec_size = init_result_type->As<type::Vector>()->Width();
+        args[0]->Type()->UnwrapRef()->Is<core::type::Scalar>()) {
+        size_t vec_size = init_result_type->As<core::type::Vector>()->Width();
         for (size_t i = 0; i < (vec_size - 1); ++i) {
             ops.push_back(ops[kOpsFirstValueIdx]);
         }
@@ -1397,7 +1397,7 @@
     });
 }
 
-uint32_t Builder::GenerateCastOrCopyOrPassthrough(const type::Type* to_type,
+uint32_t Builder::GenerateCastOrCopyOrPassthrough(const core::type::Type* to_type,
                                                   const ast::Expression* from_expr,
                                                   bool is_global_init) {
     // This should not happen as we rely on constant folding to obviate
@@ -1408,11 +1408,11 @@
         return 0;
     }
 
-    auto elem_type_of = [](const type::Type* t) -> const type::Type* {
-        if (t->Is<type::Scalar>()) {
+    auto elem_type_of = [](const core::type::Type* t) -> const core::type::Type* {
+        if (t->Is<core::type::Scalar>()) {
             return t;
         }
-        if (auto* v = t->As<type::Vector>()) {
+        if (auto* v = t->As<core::type::Vector>()) {
             return v->type();
         }
         return nullptr;
@@ -1434,38 +1434,39 @@
     auto* from_type = TypeOf(from_expr)->UnwrapRef();
 
     spv::Op op = spv::Op::OpNop;
-    if ((from_type->Is<type::I32>() && to_type->is_float_scalar()) ||
+    if ((from_type->Is<core::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<type::U32>() && to_type->is_float_scalar()) ||
+    } else if ((from_type->Is<core::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<type::I32>()) ||
+    } else if ((from_type->is_float_scalar() && to_type->Is<core::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<type::U32>()) ||
+    } else if ((from_type->is_float_scalar() && to_type->Is<core::type::U32>()) ||
                (from_type->is_float_vector() && to_type->is_unsigned_integer_vector())) {
         op = spv::Op::OpConvertFToU;
-    } else if (from_type->IsAnyOf<type::Bool, type::F32, type::I32, type::U32, type::F16,
-                                  type::Vector>() &&
+    } else if (from_type->IsAnyOf<core::type::Bool, core::type::F32, core::type::I32,
+                                  core::type::U32, core::type::F16, core::type::Vector>() &&
                from_type == to_type) {
         // Identity initializer for scalar and vector types
         return val_id;
     } else if ((from_type->is_float_scalar() && to_type->is_float_scalar()) ||
                (from_type->is_float_vector() && to_type->is_float_vector() &&
-                from_type->As<type::Vector>()->Width() == to_type->As<type::Vector>()->Width())) {
+                from_type->As<core::type::Vector>()->Width() ==
+                    to_type->As<core::type::Vector>()->Width())) {
         // Convert between f32 and f16 types.
         // OpFConvert requires the scalar component types to be different, and the case of from_type
         // 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<type::I32>() && to_type->Is<type::U32>()) ||
-               (from_type->Is<type::U32>() && to_type->Is<type::I32>()) ||
+    } else if ((from_type->Is<core::type::I32>() && to_type->Is<core::type::U32>()) ||
+               (from_type->Is<core::type::U32>() && to_type->Is<core::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<type::NumericScalar>() && to_type->Is<type::Bool>()) ||
+    } else if ((from_type->Is<core::type::NumericScalar>() && to_type->Is<core::type::Bool>()) ||
                (from_type->is_numeric_vector() && to_type->is_bool_vector())) {
         // Convert scalar (vector) to bool (vector)
 
@@ -1486,23 +1487,23 @@
         const auto* to_elem_type = elem_type_of(to_type);
         uint32_t one_id;
         uint32_t zero_id;
-        if (to_elem_type->Is<type::F32>()) {
+        if (to_elem_type->Is<core::type::F32>()) {
             zero_id = GenerateConstantIfNeeded(ScalarConstant::F32(0));
             one_id = GenerateConstantIfNeeded(ScalarConstant::F32(1));
-        } else if (to_elem_type->Is<type::F16>()) {
+        } else if (to_elem_type->Is<core::type::F16>()) {
             zero_id = GenerateConstantIfNeeded(ScalarConstant::F16(0));
             one_id = GenerateConstantIfNeeded(ScalarConstant::F16(1));
-        } else if (to_elem_type->Is<type::U32>()) {
+        } else if (to_elem_type->Is<core::type::U32>()) {
             zero_id = GenerateConstantIfNeeded(ScalarConstant::U32(0));
             one_id = GenerateConstantIfNeeded(ScalarConstant::U32(1));
-        } else if (to_elem_type->Is<type::I32>()) {
+        } else if (to_elem_type->Is<core::type::I32>()) {
             zero_id = GenerateConstantIfNeeded(ScalarConstant::I32(0));
             one_id = GenerateConstantIfNeeded(ScalarConstant::I32(1));
         } else {
             TINT_ICE() << "invalid destination type for bool conversion";
             return false;
         }
-        if (auto* to_vec = to_type->As<type::Vector>()) {
+        if (auto* to_vec = to_type->As<core::type::Vector>()) {
             // Splat the scalars into vectors.
             zero_id = GenerateConstantVectorSplatIfNeeded(to_vec, zero_id);
             one_id = GenerateConstantVectorSplatIfNeeded(to_vec, one_id);
@@ -1518,12 +1519,13 @@
         }
 
         return result_id;
-    } else if (TINT_LIKELY(from_type->Is<type::Matrix>() && to_type->Is<type::Matrix>())) {
+    } else if (TINT_LIKELY(from_type->Is<core::type::Matrix>() &&
+                           to_type->Is<core::type::Matrix>())) {
         // SPIRV does not support matrix conversion, the only valid case is matrix identity
         // initializer. Matrix conversion between f32 and f16 should be transformed into vector
         // conversions for each column vectors by VectorizeMatrixConversions.
-        auto* from_mat = from_type->As<type::Matrix>();
-        auto* to_mat = to_type->As<type::Matrix>();
+        auto* from_mat = from_type->As<core::type::Matrix>();
+        auto* to_mat = to_type->As<core::type::Matrix>();
         if (TINT_LIKELY(from_mat == to_mat)) {
             return val_id;
         }
@@ -1628,37 +1630,37 @@
 
     return Switch(
         ty,  //
-        [&](const type::Bool*) {
+        [&](const core::type::Bool*) {
             bool val = constant->ValueAs<bool>();
             return GenerateConstantIfNeeded(ScalarConstant::Bool(val));
         },
-        [&](const type::F32*) {
+        [&](const core::type::F32*) {
             auto val = constant->ValueAs<f32>();
             return GenerateConstantIfNeeded(ScalarConstant::F32(val.value));
         },
-        [&](const type::F16*) {
+        [&](const core::type::F16*) {
             auto val = constant->ValueAs<f16>();
             return GenerateConstantIfNeeded(ScalarConstant::F16(val.value));
         },
-        [&](const type::I32*) {
+        [&](const core::type::I32*) {
             auto val = constant->ValueAs<i32>();
             return GenerateConstantIfNeeded(ScalarConstant::I32(val.value));
         },
-        [&](const type::U32*) {
+        [&](const core::type::U32*) {
             auto val = constant->ValueAs<u32>();
             return GenerateConstantIfNeeded(ScalarConstant::U32(val.value));
         },
-        [&](const type::Vector* v) { return composite(v->Width()); },
-        [&](const type::Matrix* m) { return composite(m->columns()); },
-        [&](const type::Array* a) {
+        [&](const core::type::Vector* v) { return composite(v->Width()); },
+        [&](const core::type::Matrix* m) { return composite(m->columns()); },
+        [&](const core::type::Array* a) {
             auto count = a->ConstantCount();
             if (!count) {
-                TINT_ICE() << type::Array::kErrExpectedConstantCount;
+                TINT_ICE() << core::type::Array::kErrExpectedConstantCount;
                 return static_cast<uint32_t>(0);
             }
             return composite(count.value());
         },
-        [&](const type::Struct* s) { return composite(s->Members().Length()); },
+        [&](const core::type::Struct* s) { return composite(s->Members().Length()); },
         [&](Default) {
             TINT_ICE() << "unhandled constant type: " + ty->FriendlyName();
             return 0;
@@ -1675,23 +1677,23 @@
 
     switch (constant.kind) {
         case ScalarConstant::Kind::kU32: {
-            type_id = GenerateTypeIfNeeded(builder_.create<type::U32>());
+            type_id = GenerateTypeIfNeeded(builder_.create<core::type::U32>());
             break;
         }
         case ScalarConstant::Kind::kI32: {
-            type_id = GenerateTypeIfNeeded(builder_.create<type::I32>());
+            type_id = GenerateTypeIfNeeded(builder_.create<core::type::I32>());
             break;
         }
         case ScalarConstant::Kind::kF32: {
-            type_id = GenerateTypeIfNeeded(builder_.create<type::F32>());
+            type_id = GenerateTypeIfNeeded(builder_.create<core::type::F32>());
             break;
         }
         case ScalarConstant::Kind::kF16: {
-            type_id = GenerateTypeIfNeeded(builder_.create<type::F16>());
+            type_id = GenerateTypeIfNeeded(builder_.create<core::type::F16>());
             break;
         }
         case ScalarConstant::Kind::kBool: {
-            type_id = GenerateTypeIfNeeded(builder_.create<type::Bool>());
+            type_id = GenerateTypeIfNeeded(builder_.create<core::type::Bool>());
             break;
         }
     }
@@ -1739,7 +1741,7 @@
     return result_id;
 }
 
-uint32_t Builder::GenerateConstantNullIfNeeded(const type::Type* type) {
+uint32_t Builder::GenerateConstantNullIfNeeded(const core::type::Type* type) {
     auto type_id = GenerateTypeIfNeeded(type);
     if (type_id == 0) {
         return 0;
@@ -1754,7 +1756,8 @@
     });
 }
 
-uint32_t Builder::GenerateConstantVectorSplatIfNeeded(const type::Vector* type, uint32_t value_id) {
+uint32_t Builder::GenerateConstantVectorSplatIfNeeded(const core::type::Vector* type,
+                                                      uint32_t value_id) {
     auto type_id = GenerateTypeIfNeeded(type);
     if (type_id == 0 || value_id == 0) {
         return 0;
@@ -1849,11 +1852,11 @@
     return result_id;
 }
 
-uint32_t Builder::GenerateSplat(uint32_t scalar_id, const type::Type* vec_type) {
+uint32_t Builder::GenerateSplat(uint32_t scalar_id, const core::type::Type* vec_type) {
     // Create a new vector to splat scalar into
     auto splat_vector = result_op();
-    auto* splat_vector_type = builder_.create<type::Pointer>(core::AddressSpace::kFunction,
-                                                             vec_type, core::Access::kReadWrite);
+    auto* splat_vector_type = builder_.create<core::type::Pointer>(
+        core::AddressSpace::kFunction, vec_type, core::Access::kReadWrite);
     push_function_var({Operand(GenerateTypeIfNeeded(splat_vector_type)), splat_vector,
                        U32Operand(ConvertAddressSpace(core::AddressSpace::kFunction)),
                        Operand(GenerateConstantNullIfNeeded(vec_type))});
@@ -1863,7 +1866,7 @@
     OperandList ops;
     ops.push_back(Operand(GenerateTypeIfNeeded(vec_type)));
     ops.push_back(splat_result);
-    for (size_t i = 0; i < vec_type->As<type::Vector>()->Width(); ++i) {
+    for (size_t i = 0; i < vec_type->As<core::type::Vector>()->Width(); ++i) {
         ops.push_back(Operand(scalar_id));
     }
     if (!push_function_inst(spv::Op::OpCompositeConstruct, ops)) {
@@ -1875,7 +1878,7 @@
 
 uint32_t Builder::GenerateMatrixAddOrSub(uint32_t lhs_id,
                                          uint32_t rhs_id,
-                                         const type::Matrix* type,
+                                         const core::type::Matrix* type,
                                          spv::Op op) {
     // Example addition of two matrices:
     // %31 = OpLoad %mat3v4float %m34
@@ -1891,7 +1894,7 @@
     // %41 = OpFAdd %v4float %39 %40
     // %42 = OpCompositeConstruct %mat3v4float %35 %38 %41
 
-    auto* column_type = builder_.create<type::Vector>(type->type(), type->rows());
+    auto* column_type = builder_.create<core::type::Vector>(type->type(), type->rows());
     auto column_type_id = GenerateTypeIfNeeded(column_type);
 
     OperandList ops;
@@ -1966,8 +1969,8 @@
     // Handle matrix-matrix addition and subtraction
     if ((expr->IsAdd() || expr->IsSubtract()) && lhs_type->is_float_matrix() &&
         rhs_type->is_float_matrix()) {
-        auto* lhs_mat = lhs_type->As<type::Matrix>();
-        auto* rhs_mat = rhs_type->As<type::Matrix>();
+        auto* lhs_mat = lhs_type->As<core::type::Matrix>();
+        auto* rhs_mat = rhs_type->As<core::type::Matrix>();
 
         // This should already have been validated by resolver
         if (lhs_mat->rows() != rhs_mat->rows() || lhs_mat->columns() != rhs_mat->columns()) {
@@ -1986,7 +1989,7 @@
                                (lhs_type->is_float_vector() && rhs_type->is_float_scalar()));
 
     if (expr->IsArithmetic() && !is_float_scalar_vector_multiply) {
-        if (lhs_type->Is<type::Vector>() && rhs_type->Is<type::NumericScalar>()) {
+        if (lhs_type->Is<core::type::Vector>() && rhs_type->Is<core::type::NumericScalar>()) {
             uint32_t splat_vector_id = GenerateSplat(rhs_id, lhs_type);
             if (splat_vector_id == 0) {
                 return 0;
@@ -1994,7 +1997,8 @@
             rhs_id = splat_vector_id;
             rhs_type = lhs_type;
 
-        } else if (lhs_type->Is<type::NumericScalar>() && rhs_type->Is<type::Vector>()) {
+        } else if (lhs_type->Is<core::type::NumericScalar>() &&
+                   rhs_type->Is<core::type::Vector>()) {
             uint32_t splat_vector_id = GenerateSplat(lhs_id, rhs_type);
             if (splat_vector_id == 0) {
                 return 0;
@@ -2280,7 +2284,7 @@
             return 0;
         }
 
-        if (generate_load && !param->Type()->Is<type::Pointer>()) {
+        if (generate_load && !param->Type()->Is<core::type::Pointer>()) {
             val_id = GenerateLoadIfNeeded(arg->Type(), val_id);
         }
         return val_id;
@@ -2300,14 +2304,14 @@
 
     switch (builtin->Type()) {
         case core::Function::kAny:
-            if (builtin->Parameters()[0]->Type()->Is<type::Bool>()) {
+            if (builtin->Parameters()[0]->Type()->Is<core::type::Bool>()) {
                 // any(v: bool) just resolves to v.
                 return get_arg_as_value_id(0);
             }
             op = spv::Op::OpAny;
             break;
         case core::Function::kAll:
-            if (builtin->Parameters()[0]->Type()->Is<type::Bool>()) {
+            if (builtin->Parameters()[0]->Type()->Is<core::type::Bool>()) {
                 // all(v: bool) just resolves to v.
                 return get_arg_as_value_id(0);
             }
@@ -2336,13 +2340,14 @@
             params.push_back(Operand(struct_id));
 
             auto* type = TypeOf(accessor->object)->UnwrapRef();
-            if (!type->Is<type::Struct>()) {
+            if (!type->Is<core::type::Struct>()) {
                 TINT_ICE() << "invalid type (" + type->FriendlyName() +
                                   ") for runtime array length";
                 return 0;
             }
             // Runtime array must be the last member in the structure
-            params.push_back(Operand(uint32_t(type->As<type::Struct>()->Members().Length() - 1)));
+            params.push_back(
+                Operand(uint32_t(type->As<core::type::Struct>()->Members().Length() - 1)));
 
             if (!push_function_inst(spv::Op::OpArrayLength, params)) {
                 return 0;
@@ -2354,7 +2359,7 @@
             break;
         case core::Function::kDot: {
             op = spv::Op::OpDot;
-            auto* vec_ty = builtin->Parameters()[0]->Type()->As<type::Vector>();
+            auto* vec_ty = builtin->Parameters()[0]->Type()->As<core::type::Vector>();
             if (vec_ty->type()->is_integer_scalar()) {
                 // TODO(crbug.com/tint/1267): OpDot requires floating-point types, but
                 // WGSL also supports integer types. SPV_KHR_integer_dot_product adds
@@ -2440,8 +2445,8 @@
 
             // If the interpolant is scalar but the objects are vectors, we need to
             // splat the interpolant into a vector of the same size.
-            auto* result_vector_type = builtin->ReturnType()->As<type::Vector>();
-            if (result_vector_type && builtin->Parameters()[2]->Type()->Is<type::Scalar>()) {
+            auto* result_vector_type = builtin->ReturnType()->As<core::type::Vector>();
+            if (result_vector_type && builtin->Parameters()[2]->Type()->Is<core::type::Scalar>()) {
                 f_id = GenerateSplat(f_id, builtin->Parameters()[0]->Type());
                 if (f_id == 0) {
                     return 0;
@@ -2473,10 +2478,10 @@
             // If the condition is scalar but the objects are vectors, we need to
             // splat the condition into a vector of the same size.
             // TODO(jrprice): If we're targeting SPIR-V 1.4, we don't need to do this.
-            auto* result_vector_type = builtin->ReturnType()->As<type::Vector>();
-            if (result_vector_type && builtin->Parameters()[2]->Type()->Is<type::Scalar>()) {
-                auto* bool_vec_ty = builder_.create<type::Vector>(builder_.create<type::Bool>(),
-                                                                  result_vector_type->Width());
+            auto* result_vector_type = builtin->ReturnType()->As<core::type::Vector>();
+            if (result_vector_type && builtin->Parameters()[2]->Type()->Is<core::type::Scalar>()) {
+                auto* bool_vec_ty = builder_.create<core::type::Vector>(
+                    builder_.create<core::type::Bool>(), result_vector_type->Width());
                 if (!GenerateTypeIfNeeded(bool_vec_ty)) {
                     return 0;
                 }
@@ -2606,7 +2611,7 @@
         TINT_ICE() << "missing texture argument";
     }
 
-    auto* texture_type = texture->Type()->UnwrapRef()->As<type::Texture>();
+    auto* texture_type = texture->Type()->UnwrapRef()->As<core::type::Texture>();
 
     auto op = spv::Op::OpNop;
 
@@ -2642,9 +2647,10 @@
     // If the texture is not a depth texture, then this function simply delegates
     // 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<type::F32>();
-            auto* spirv_result_type = builder_.create<type::Vector>(f32, 4u);
+        if (texture_type
+                ->IsAnyOf<core::type::DepthTexture, core::type::DepthMultisampledTexture>()) {
+            auto* f32 = builder_.create<core::type::F32>();
+            auto* spirv_result_type = builder_.create<core::type::Vector>(f32, 4u);
             auto spirv_result = result_op();
             post_emission = [=] {
                 return push_function_inst(spv::Op::OpCompositeExtract,
@@ -2675,7 +2681,7 @@
             auto* element_type = ElementTypeOf(call->Type());
             auto spirv_result = result_op();
             auto* spirv_result_type =
-                builder_.create<type::Vector>(element_type, spirv_result_width);
+                builder_.create<core::type::Vector>(element_type, spirv_result_width);
             if (swizzle.size() > 1) {
                 post_emission = [=] {
                     OperandList operands{
@@ -2744,16 +2750,16 @@
             std::vector<uint32_t> swizzle;
             uint32_t spirv_dims = 0;
             switch (texture_type->dim()) {
-                case type::TextureDimension::kNone:
+                case core::type::TextureDimension::kNone:
                     TINT_ICE() << "texture dimension is kNone";
                     return false;
-                case type::TextureDimension::k1d:
-                case type::TextureDimension::k2d:
-                case type::TextureDimension::k3d:
-                case type::TextureDimension::kCube:
+                case core::type::TextureDimension::k1d:
+                case core::type::TextureDimension::k2d:
+                case core::type::TextureDimension::k3d:
+                case core::type::TextureDimension::kCube:
                     break;  // No swizzle needed
-                case type::TextureDimension::kCubeArray:
-                case type::TextureDimension::k2dArray:
+                case core::type::TextureDimension::kCubeArray:
+                case core::type::TextureDimension::k2dArray:
                     swizzle = {0, 1};  // Strip array index
                     spirv_dims = 3;    // [width, height, array_count]
                     break;
@@ -2764,9 +2770,9 @@
             }
 
             spirv_params.emplace_back(gen_arg(Usage::kTexture));
-            if (texture_type->IsAnyOf<type::MultisampledTexture,       //
-                                      type::DepthMultisampledTexture,  //
-                                      type::StorageTexture>()) {
+            if (texture_type->IsAnyOf<core::type::MultisampledTexture,       //
+                                      core::type::DepthMultisampledTexture,  //
+                                      core::type::StorageTexture>()) {
                 op = spv::Op::OpImageQuerySize;
             } else if (auto* level = arg(Usage::kLevel)) {
                 op = spv::Op::OpImageQuerySizeLod;
@@ -2784,8 +2790,8 @@
                 default:
                     TINT_ICE() << "texture is not arrayed";
                     return false;
-                case type::TextureDimension::k2dArray:
-                case type::TextureDimension::kCubeArray:
+                case core::type::TextureDimension::k2dArray:
+                case core::type::TextureDimension::kCubeArray:
                     spirv_dims = 3;
                     break;
             }
@@ -2798,8 +2804,8 @@
 
             spirv_params.emplace_back(gen_arg(Usage::kTexture));
 
-            if (texture_type->Is<type::MultisampledTexture>() ||
-                texture_type->Is<type::StorageTexture>()) {
+            if (texture_type->Is<core::type::MultisampledTexture>() ||
+                texture_type->Is<core::type::StorageTexture>()) {
                 op = spv::Op::OpImageQuerySize;
             } else {
                 op = spv::Op::OpImageQuerySizeLod;
@@ -2821,8 +2827,8 @@
             break;
         }
         case core::Function::kTextureLoad: {
-            op = texture_type->Is<type::StorageTexture>() ? spv::Op::OpImageRead
-                                                          : spv::Op::OpImageFetch;
+            op = texture_type->Is<core::type::StorageTexture>() ? spv::Op::OpImageRead
+                                                                : spv::Op::OpImageFetch;
             append_result_type_and_id_to_spirv_params_for_read();
             spirv_params.emplace_back(gen_arg(Usage::kTexture));
             if (!append_coords_to_spirv_params()) {
@@ -2897,10 +2903,13 @@
                 return false;
             }
             auto level = Operand(0u);
-            if (arg(Usage::kLevel)->Type()->UnwrapRef()->IsAnyOf<type::I32, type::U32>()) {
+            if (arg(Usage::kLevel)
+                    ->Type()
+                    ->UnwrapRef()
+                    ->IsAnyOf<core::type::I32, core::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<type::F32>());
+                auto f32_type_id = GenerateTypeIfNeeded(builder_.create<core::type::F32>());
                 if (f32_type_id == 0) {
                     return 0;
                 }
@@ -3024,12 +3033,13 @@
                                     const sem::Builtin* builtin,
                                     Operand result_type,
                                     Operand result_id) {
-    auto is_value_signed = [&] { return builtin->Parameters()[1]->Type()->Is<type::I32>(); };
+    auto is_value_signed = [&] { return builtin->Parameters()[1]->Type()->Is<core::type::I32>(); };
 
-    auto address_space = builtin->Parameters()[0]->Type()->As<type::Pointer>()->AddressSpace();
+    auto address_space =
+        builtin->Parameters()[0]->Type()->As<core::type::Pointer>()->AddressSpace();
 
     uint32_t memory_id = 0;
-    switch (builtin->Parameters()[0]->Type()->As<type::Pointer>()->AddressSpace()) {
+    switch (builtin->Parameters()[0]->Type()->As<core::type::Pointer>()->AddressSpace()) {
         case core::AddressSpace::kWorkgroup:
             memory_id = GenerateConstantIfNeeded(
                 ScalarConstant::U32(static_cast<uint32_t>(spv::Scope::Workgroup)));
@@ -3173,7 +3183,7 @@
                 return false;
             }
 
-            auto* bool_sem_ty = builder_.create<type::Bool>();
+            auto* bool_sem_ty = builder_.create<core::type::Bool>();
             auto bool_type = GenerateTypeIfNeeded(bool_sem_ty);
             if (bool_type == 0) {
                 return false;
@@ -3226,16 +3236,16 @@
     }
 }
 
-uint32_t Builder::GenerateSampledImage(const type::Type* texture_type,
+uint32_t Builder::GenerateSampledImage(const core::type::Type* texture_type,
                                        Operand texture_operand,
                                        Operand sampler_operand) {
     // DepthTexture is always declared as SampledTexture.
     // The Vulkan spec says: The "Depth" operand of OpTypeImage is ignored.
     // In SPIRV, 0 means not depth, 1 means depth, and 2 means unknown.
     // 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<type::F32>());
+    if (auto* depthTextureType = texture_type->As<core::type::DepthTexture>()) {
+        texture_type = builder_.create<core::type::SampledTexture>(
+            depthTextureType->dim(), builder_.create<core::type::F32>());
     }
 
     uint32_t sampled_image_type_id =
@@ -3583,7 +3593,7 @@
     return GenerateFunctionVariable(stmt->variable);
 }
 
-uint32_t Builder::GenerateTypeIfNeeded(const type::Type* type) {
+uint32_t Builder::GenerateTypeIfNeeded(const core::type::Type* type) {
     if (type == nullptr) {
         TINT_ICE() << "attempting to generate type from null type";
         return 0;
@@ -3591,7 +3601,7 @@
 
     // Atomics are a type in WGSL, but aren't a distinct type in SPIR-V.
     // Just emit the type inside the atomic.
-    if (auto* atomic = type->As<type::Atomic>()) {
+    if (auto* atomic = type->As<core::type::Atomic>()) {
         return GenerateTypeIfNeeded(atomic->Type());
     }
 
@@ -3599,12 +3609,13 @@
     // The Vulkan spec says: The "Depth" operand of OpTypeImage is ignored.
     // In SPIRV, 0 means not depth, 1 means depth, and 2 means unknown.
     // 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<type::F32>());
-    } else if (auto* multisampledDepthTextureType = type->As<type::DepthMultisampledTexture>()) {
-        type = builder_.create<type::MultisampledTexture>(multisampledDepthTextureType->dim(),
-                                                          builder_.create<type::F32>());
+    if (auto* depthTextureType = type->As<core::type::DepthTexture>()) {
+        type = builder_.create<core::type::SampledTexture>(depthTextureType->dim(),
+                                                           builder_.create<core::type::F32>());
+    } else if (auto* multisampledDepthTextureType =
+                   type->As<core::type::DepthMultisampledTexture>()) {
+        type = builder_.create<core::type::MultisampledTexture>(multisampledDepthTextureType->dim(),
+                                                                builder_.create<core::type::F32>());
     }
 
     // Pointers and references with differing accesses should not result in a
@@ -3614,12 +3625,12 @@
     // definitions in the generated SPIR-V. Note that nested pointers and
     // references are not legal in WGSL, so only considering the top-level type is
     // fine.
-    if (auto* ptr = type->As<type::Pointer>()) {
-        type = builder_.create<type::Pointer>(ptr->AddressSpace(), ptr->StoreType(),
-                                              core::Access::kReadWrite);
-    } else if (auto* ref = type->As<type::Reference>()) {
-        type = builder_.create<type::Pointer>(ref->AddressSpace(), ref->StoreType(),
-                                              core::Access::kReadWrite);
+    if (auto* ptr = type->As<core::type::Pointer>()) {
+        type = builder_.create<core::type::Pointer>(ptr->AddressSpace(), ptr->StoreType(),
+                                                    core::Access::kReadWrite);
+    } else if (auto* ref = type->As<core::type::Reference>()) {
+        type = builder_.create<core::type::Pointer>(ref->AddressSpace(), ref->StoreType(),
+                                                    core::Access::kReadWrite);
     }
 
     return tint::GetOrCreate(type_to_id_, type, [&]() -> uint32_t {
@@ -3627,49 +3638,49 @@
         auto id = std::get<uint32_t>(result);
         bool ok = Switch(
             type,
-            [&](const type::Array* arr) {  //
+            [&](const core::type::Array* arr) {  //
                 return GenerateArrayType(arr, result);
             },
-            [&](const type::Bool*) {
+            [&](const core::type::Bool*) {
                 module_.PushType(spv::Op::OpTypeBool, {result});
                 return true;
             },
-            [&](const type::F32*) {
+            [&](const core::type::F32*) {
                 module_.PushType(spv::Op::OpTypeFloat, {result, Operand(32u)});
                 return true;
             },
-            [&](const type::F16*) {
+            [&](const core::type::F16*) {
                 module_.PushType(spv::Op::OpTypeFloat, {result, Operand(16u)});
                 return true;
             },
-            [&](const type::I32*) {
+            [&](const core::type::I32*) {
                 module_.PushType(spv::Op::OpTypeInt, {result, Operand(32u), Operand(1u)});
                 return true;
             },
-            [&](const type::Matrix* mat) {  //
+            [&](const core::type::Matrix* mat) {  //
                 return GenerateMatrixType(mat, result);
             },
-            [&](const type::Pointer* ptr) {  //
+            [&](const core::type::Pointer* ptr) {  //
                 return GeneratePointerType(ptr, result);
             },
-            [&](const type::Reference* ref) {  //
+            [&](const core::type::Reference* ref) {  //
                 return GenerateReferenceType(ref, result);
             },
-            [&](const type::Struct* str) {  //
+            [&](const core::type::Struct* str) {  //
                 return GenerateStructType(str, result);
             },
-            [&](const type::U32*) {
+            [&](const core::type::U32*) {
                 module_.PushType(spv::Op::OpTypeInt, {result, Operand(32u), Operand(0u)});
                 return true;
             },
-            [&](const type::Vector* vec) {  //
+            [&](const core::type::Vector* vec) {  //
                 return GenerateVectorType(vec, result);
             },
-            [&](const type::Void*) {
+            [&](const core::type::Void*) {
                 module_.PushType(spv::Op::OpTypeVoid, {result});
                 return true;
             },
-            [&](const type::StorageTexture* tex) {
+            [&](const core::type::StorageTexture* tex) {
                 if (!GenerateTextureType(tex, result)) {
                     return false;
                 }
@@ -3677,25 +3688,26 @@
                 // Register all three access types of StorageTexture names. In
                 // SPIR-V, we must output a single type, while the variable is
                 // annotated with the access type. Doing this ensures we de-dupe.
-                type_to_id_[builder_.create<type::StorageTexture>(
+                type_to_id_[builder_.create<core::type::StorageTexture>(
                     tex->dim(), tex->texel_format(), core::Access::kRead, tex->type())] = id;
-                type_to_id_[builder_.create<type::StorageTexture>(
+                type_to_id_[builder_.create<core::type::StorageTexture>(
                     tex->dim(), tex->texel_format(), core::Access::kWrite, tex->type())] = id;
-                type_to_id_[builder_.create<type::StorageTexture>(
+                type_to_id_[builder_.create<core::type::StorageTexture>(
                     tex->dim(), tex->texel_format(), core::Access::kReadWrite, tex->type())] = id;
                 return true;
             },
-            [&](const type::Texture* tex) { return GenerateTextureType(tex, result); },
-            [&](const type::Sampler* s) {
+            [&](const core::type::Texture* tex) { return GenerateTextureType(tex, result); },
+            [&](const core::type::Sampler* s) {
                 module_.PushType(spv::Op::OpTypeSampler, {result});
 
                 // Register both of the sampler type names. In SPIR-V they're the same
                 // sampler type, so we need to match that when we do the dedup check.
-                if (s->kind() == type::SamplerKind::kSampler) {
-                    type_to_id_[builder_.create<type::Sampler>(
-                        type::SamplerKind::kComparisonSampler)] = id;
+                if (s->kind() == core::type::SamplerKind::kSampler) {
+                    type_to_id_[builder_.create<core::type::Sampler>(
+                        core::type::SamplerKind::kComparisonSampler)] = id;
                 } else {
-                    type_to_id_[builder_.create<type::Sampler>(type::SamplerKind::kSampler)] = id;
+                    type_to_id_[builder_.create<core::type::Sampler>(
+                        core::type::SamplerKind::kSampler)] = id;
                 }
                 return true;
             },
@@ -3712,36 +3724,38 @@
     });
 }
 
-bool Builder::GenerateTextureType(const type::Texture* texture, const Operand& result) {
-    if (TINT_UNLIKELY(texture->Is<type::ExternalTexture>())) {
+bool Builder::GenerateTextureType(const core::type::Texture* texture, const Operand& result) {
+    if (TINT_UNLIKELY(texture->Is<core::type::ExternalTexture>())) {
         TINT_ICE() << "Multiplanar external texture transform was not run.";
         return false;
     }
 
     uint32_t array_literal = 0u;
     const auto dim = texture->dim();
-    if (dim == type::TextureDimension::k2dArray || dim == type::TextureDimension::kCubeArray) {
+    if (dim == core::type::TextureDimension::k2dArray ||
+        dim == core::type::TextureDimension::kCubeArray) {
         array_literal = 1u;
     }
 
     uint32_t dim_literal = SpvDim2D;
-    if (dim == type::TextureDimension::k1d) {
+    if (dim == core::type::TextureDimension::k1d) {
         dim_literal = SpvDim1D;
-        if (texture->Is<type::SampledTexture>()) {
+        if (texture->Is<core::type::SampledTexture>()) {
             module_.PushCapability(SpvCapabilitySampled1D);
-        } else if (texture->Is<type::StorageTexture>()) {
+        } else if (texture->Is<core::type::StorageTexture>()) {
             module_.PushCapability(SpvCapabilityImage1D);
         }
     }
-    if (dim == type::TextureDimension::k3d) {
+    if (dim == core::type::TextureDimension::k3d) {
         dim_literal = SpvDim3D;
     }
-    if (dim == type::TextureDimension::kCube || dim == type::TextureDimension::kCubeArray) {
+    if (dim == core::type::TextureDimension::kCube ||
+        dim == core::type::TextureDimension::kCubeArray) {
         dim_literal = SpvDimCube;
     }
 
     uint32_t ms_literal = 0u;
-    if (texture->IsAnyOf<type::MultisampledTexture, type::DepthMultisampledTexture>()) {
+    if (texture->IsAnyOf<core::type::MultisampledTexture, core::type::DepthMultisampledTexture>()) {
         ms_literal = 1u;
     }
 
@@ -3751,35 +3765,35 @@
     // Using anything other than 0 is problematic on various Vulkan drivers.
 
     uint32_t sampled_literal = 2u;
-    if (texture->IsAnyOf<type::MultisampledTexture, type::SampledTexture, type::DepthTexture,
-                         type::DepthMultisampledTexture>()) {
+    if (texture->IsAnyOf<core::type::MultisampledTexture, core::type::SampledTexture,
+                         core::type::DepthTexture, core::type::DepthMultisampledTexture>()) {
         sampled_literal = 1u;
     }
 
-    if (dim == type::TextureDimension::kCubeArray) {
-        if (texture->IsAnyOf<type::SampledTexture, type::DepthTexture>()) {
+    if (dim == core::type::TextureDimension::kCubeArray) {
+        if (texture->IsAnyOf<core::type::SampledTexture, core::type::DepthTexture>()) {
             module_.PushCapability(SpvCapabilitySampledCubeArray);
         }
     }
 
     uint32_t type_id = Switch(
         texture,
-        [&](const type::DepthTexture*) {
-            return GenerateTypeIfNeeded(builder_.create<type::F32>());
+        [&](const core::type::DepthTexture*) {
+            return GenerateTypeIfNeeded(builder_.create<core::type::F32>());
         },
-        [&](const type::DepthMultisampledTexture*) {
-            return GenerateTypeIfNeeded(builder_.create<type::F32>());
+        [&](const core::type::DepthMultisampledTexture*) {
+            return GenerateTypeIfNeeded(builder_.create<core::type::F32>());
         },
-        [&](const type::SampledTexture* t) { return GenerateTypeIfNeeded(t->type()); },
-        [&](const type::MultisampledTexture* t) { return GenerateTypeIfNeeded(t->type()); },
-        [&](const type::StorageTexture* t) { return GenerateTypeIfNeeded(t->type()); },
+        [&](const core::type::SampledTexture* t) { return GenerateTypeIfNeeded(t->type()); },
+        [&](const core::type::MultisampledTexture* t) { return GenerateTypeIfNeeded(t->type()); },
+        [&](const core::type::StorageTexture* t) { return GenerateTypeIfNeeded(t->type()); },
         [&](Default) { return 0u; });
     if (type_id == 0u) {
         return false;
     }
 
     uint32_t format_literal = SpvImageFormat_::SpvImageFormatUnknown;
-    if (auto* t = texture->As<type::StorageTexture>()) {
+    if (auto* t = texture->As<core::type::StorageTexture>()) {
         format_literal = convert_texel_format_to_spv(t->texel_format());
     }
 
@@ -3791,19 +3805,19 @@
     return true;
 }
 
-bool Builder::GenerateArrayType(const type::Array* arr, const Operand& result) {
+bool Builder::GenerateArrayType(const core::type::Array* arr, const Operand& result) {
     auto elem_type = GenerateTypeIfNeeded(arr->ElemType());
     if (elem_type == 0) {
         return false;
     }
 
     auto result_id = std::get<uint32_t>(result);
-    if (arr->Count()->Is<type::RuntimeArrayCount>()) {
+    if (arr->Count()->Is<core::type::RuntimeArrayCount>()) {
         module_.PushType(spv::Op::OpTypeRuntimeArray, {result, Operand(elem_type)});
     } else {
         auto count = arr->ConstantCount();
         if (!count) {
-            TINT_ICE() << type::Array::kErrExpectedConstantCount;
+            TINT_ICE() << core::type::Array::kErrExpectedConstantCount;
             return static_cast<uint32_t>(0);
         }
 
@@ -3821,8 +3835,8 @@
     return true;
 }
 
-bool Builder::GenerateMatrixType(const type::Matrix* mat, const Operand& result) {
-    auto* col_type = builder_.create<type::Vector>(mat->type(), mat->rows());
+bool Builder::GenerateMatrixType(const core::type::Matrix* mat, const Operand& result) {
+    auto* col_type = builder_.create<core::type::Vector>(mat->type(), mat->rows());
     auto col_type_id = GenerateTypeIfNeeded(col_type);
     if (has_error()) {
         return false;
@@ -3833,7 +3847,7 @@
     return true;
 }
 
-bool Builder::GeneratePointerType(const type::Pointer* ptr, const Operand& result) {
+bool Builder::GeneratePointerType(const core::type::Pointer* ptr, const Operand& result) {
     auto subtype_id = GenerateTypeIfNeeded(ptr->StoreType());
     if (subtype_id == 0) {
         return false;
@@ -3850,7 +3864,7 @@
     return true;
 }
 
-bool Builder::GenerateReferenceType(const type::Reference* ref, const Operand& result) {
+bool Builder::GenerateReferenceType(const core::type::Reference* ref, const Operand& result) {
     auto subtype_id = GenerateTypeIfNeeded(ref->StoreType());
     if (subtype_id == 0) {
         return false;
@@ -3867,7 +3881,7 @@
     return true;
 }
 
-bool Builder::GenerateStructType(const type::Struct* struct_type, const Operand& result) {
+bool Builder::GenerateStructType(const core::type::Struct* struct_type, const Operand& result) {
     auto struct_id = std::get<uint32_t>(result);
 
     if (struct_type->Name().IsValid()) {
@@ -3902,7 +3916,7 @@
 
 uint32_t Builder::GenerateStructMember(uint32_t struct_id,
                                        uint32_t idx,
-                                       const type::StructMember* member) {
+                                       const core::type::StructMember* member) {
     module_.PushDebug(spv::Op::OpMemberName,
                       {Operand(struct_id), Operand(idx), Operand(member->Name().Name())});
 
@@ -3931,7 +3945,7 @@
     return GenerateTypeIfNeeded(member->Type());
 }
 
-bool Builder::GenerateVectorType(const type::Vector* vec, const Operand& result) {
+bool Builder::GenerateVectorType(const core::type::Vector* vec, const Operand& result) {
     auto type_id = GenerateTypeIfNeeded(vec->type());
     if (has_error()) {
         return false;
diff --git a/src/tint/lang/spirv/writer/ast_printer/builder.h b/src/tint/lang/spirv/writer/ast_printer/builder.h
index 89bcacd..adca66c 100644
--- a/src/tint/lang/spirv/writer/ast_printer/builder.h
+++ b/src/tint/lang/spirv/writer/ast_printer/builder.h
@@ -50,9 +50,9 @@
 class ValueConstructor;
 class ValueConversion;
 }  // namespace tint::sem
-namespace tint::type {
+namespace tint::core::type {
 class Reference;
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 namespace tint::spirv::writer {
 
@@ -72,7 +72,7 @@
         uint32_t source_id;
         /// The type of the current chain source. This type matches the deduced
         /// result_type of the current source defined above.
-        const type::Type* source_type;
+        const core::type::Type* source_type;
         /// A list of access chain indices to emit. Note, we _only_ have access
         /// chain indices if the source is reference.
         std::vector<uint32_t> access_chain_indices;
@@ -212,7 +212,7 @@
     /// @param type the type to generate for
     /// @param struct_id the struct id
     /// @param member_idx the member index
-    void GenerateMemberAccessIfNeeded(const type::Type* type,
+    void GenerateMemberAccessIfNeeded(const core::type::Type* type,
                                       uint32_t struct_id,
                                       uint32_t member_idx);
     /// Generates a function variable
@@ -328,7 +328,7 @@
     /// @param texture_operand the texture operand
     /// @param sampler_operand the sampler operand
     /// @returns the expression ID
-    uint32_t GenerateSampledImage(const type::Type* texture_type,
+    uint32_t GenerateSampledImage(const core::type::Type* texture_type,
                                   Operand texture_operand,
                                   Operand sampler_operand);
     /// Generates a cast or object copy for the expression result,
@@ -338,7 +338,7 @@
     /// @param from_expr the expression to cast
     /// @param is_global_init if this is a global initializer
     /// @returns the expression ID on success or 0 otherwise
-    uint32_t GenerateCastOrCopyOrPassthrough(const type::Type* to_type,
+    uint32_t GenerateCastOrCopyOrPassthrough(const core::type::Type* to_type,
                                              const ast::Expression* from_expr,
                                              bool is_global_init);
     /// Generates a loop statement
@@ -369,13 +369,13 @@
     /// @param type the reference type of the expression
     /// @param id the SPIR-V id of the expression
     /// @returns the ID of the loaded value or 0 on failure.
-    uint32_t GenerateLoad(const type::Reference* type, uint32_t id);
+    uint32_t GenerateLoad(const core::type::Reference* type, uint32_t id);
     /// Generates an OpLoad on the given ID if it has reference type in WGSL, otherwise return the
     /// ID itself.
     /// @param type the type of the expression
     /// @param id the SPIR-V id of the expression
     /// @returns the ID of the loaded value or `id` if type is not a reference
-    uint32_t GenerateLoadIfNeeded(const type::Type* type, uint32_t id);
+    uint32_t GenerateLoadIfNeeded(const core::type::Type* type, uint32_t id);
     /// Generates an OpStore. Emits an error and returns false if we're
     /// currently outside a function.
     /// @param to the ID to store too
@@ -385,37 +385,37 @@
     /// Generates a type if not already created
     /// @param type the type to create
     /// @returns the ID to use for the given type. Returns 0 on unknown type.
-    uint32_t GenerateTypeIfNeeded(const type::Type* type);
+    uint32_t GenerateTypeIfNeeded(const core::type::Type* type);
     /// Generates a texture type declaration
     /// @param texture the texture to generate
     /// @param result the result operand
     /// @returns true if the texture was successfully generated
-    bool GenerateTextureType(const type::Texture* texture, const Operand& result);
+    bool GenerateTextureType(const core::type::Texture* texture, const Operand& result);
     /// Generates an array type declaration
     /// @param ary the array to generate
     /// @param result the result operand
     /// @returns true if the array was successfully generated
-    bool GenerateArrayType(const type::Array* ary, const Operand& result);
+    bool GenerateArrayType(const core::type::Array* ary, const Operand& result);
     /// Generates a matrix type declaration
     /// @param mat the matrix to generate
     /// @param result the result operand
     /// @returns true if the matrix was successfully generated
-    bool GenerateMatrixType(const type::Matrix* mat, const Operand& result);
+    bool GenerateMatrixType(const core::type::Matrix* mat, const Operand& result);
     /// Generates a pointer type declaration
     /// @param ptr the pointer type to generate
     /// @param result the result operand
     /// @returns true if the pointer was successfully generated
-    bool GeneratePointerType(const type::Pointer* ptr, const Operand& result);
+    bool GeneratePointerType(const core::type::Pointer* ptr, const Operand& result);
     /// Generates a reference type declaration
     /// @param ref the reference type to generate
     /// @param result the result operand
     /// @returns true if the reference was successfully generated
-    bool GenerateReferenceType(const type::Reference* ref, const Operand& result);
+    bool GenerateReferenceType(const core::type::Reference* ref, const Operand& result);
     /// Generates a vector type declaration
     /// @param struct_type the vector to generate
     /// @param result the result operand
     /// @returns true if the vector was successfully generated
-    bool GenerateStructType(const type::Struct* struct_type, const Operand& result);
+    bool GenerateStructType(const core::type::Struct* struct_type, const Operand& result);
     /// Generates a struct member
     /// @param struct_id the id of the parent structure
     /// @param idx the index of the member
@@ -423,7 +423,7 @@
     /// @returns the id of the struct member or 0 on error.
     uint32_t GenerateStructMember(uint32_t struct_id,
                                   uint32_t idx,
-                                  const type::StructMember* member);
+                                  const core::type::StructMember* member);
     /// Generates a variable declaration statement
     /// @param stmt the statement to generate
     /// @returns true on successfull generation
@@ -432,14 +432,14 @@
     /// @param vec the vector to generate
     /// @param result the result operand
     /// @returns true if the vector was successfully generated
-    bool GenerateVectorType(const type::Vector* vec, const Operand& result);
+    bool GenerateVectorType(const core::type::Vector* vec, const Operand& result);
 
     /// Generates instructions to splat `scalar_id` into a vector of type
     /// `vec_type`
     /// @param scalar_id scalar to splat
     /// @param vec_type type of vector
     /// @returns id of the new vector
-    uint32_t GenerateSplat(uint32_t scalar_id, const type::Type* vec_type);
+    uint32_t GenerateSplat(uint32_t scalar_id, const core::type::Type* vec_type);
 
     /// Generates instructions to add or subtract two matrices
     /// @param lhs_id id of multiplicand
@@ -449,7 +449,7 @@
     /// @returns id of the result matrix
     uint32_t GenerateMatrixAddOrSub(uint32_t lhs_id,
                                     uint32_t rhs_id,
-                                    const type::Matrix* type,
+                                    const core::type::Matrix* type,
                                     spv::Op op);
 
     /// Converts TexelFormat to SPIR-V and pushes an appropriate capability.
@@ -469,7 +469,9 @@
 
     /// @returns the resolved type of the ast::Expression `expr`
     /// @param expr the expression
-    const type::Type* TypeOf(const ast::Expression* expr) const { return builder_.TypeOf(expr); }
+    const core::type::Type* TypeOf(const ast::Expression* expr) const {
+        return builder_.TypeOf(expr);
+    }
 
     /// Generates a constant value if needed
     /// @param constant the constant to generate.
@@ -484,13 +486,13 @@
     /// Generates a constant-null of the given type, if needed
     /// @param type the type of the constant null to generate.
     /// @returns the ID on success or 0 on failure
-    uint32_t GenerateConstantNullIfNeeded(const type::Type* type);
+    uint32_t GenerateConstantNullIfNeeded(const core::type::Type* type);
 
     /// Generates a vector constant splat if needed
     /// @param type the type of the vector to generate
     /// @param value_id the ID of the scalar value to splat
     /// @returns the ID on success or 0 on failure
-    uint32_t GenerateConstantVectorSplatIfNeeded(const type::Vector* type, uint32_t value_id);
+    uint32_t GenerateConstantVectorSplatIfNeeded(const core::type::Vector* type, uint32_t value_id);
 
     /// Registers the semantic variable to the given SPIR-V ID
     /// @param var the semantic variable
@@ -526,11 +528,11 @@
     std::unordered_map<std::string, uint32_t> import_name_to_id_;
     std::unordered_map<Symbol, uint32_t> func_symbol_to_id_;
     std::unordered_map<sem::CallTargetSignature, uint32_t> func_sig_to_id_;
-    std::unordered_map<const type::Type*, uint32_t> type_to_id_;
+    std::unordered_map<const core::type::Type*, uint32_t> type_to_id_;
     std::unordered_map<ScalarConstant, uint32_t> const_to_id_;
-    std::unordered_map<const type::Type*, uint32_t> const_null_to_id_;
+    std::unordered_map<const core::type::Type*, uint32_t> const_null_to_id_;
     std::unordered_map<uint64_t, uint32_t> const_splat_to_id_;
-    std::unordered_map<const type::Type*, uint32_t> texture_type_to_sampled_image_type_id_;
+    std::unordered_map<const core::type::Type*, uint32_t> texture_type_to_sampled_image_type_id_;
     std::vector<Scope> scope_stack_;
     std::vector<uint32_t> merge_stack_;
     std::vector<uint32_t> continue_stack_;
diff --git a/src/tint/lang/spirv/writer/ast_printer/global_variable_test.cc b/src/tint/lang/spirv/writer/ast_printer/global_variable_test.cc
index 6a0c808..2364f69 100644
--- a/src/tint/lang/spirv/writer/ast_printer/global_variable_test.cc
+++ b/src/tint/lang/spirv/writer/ast_printer/global_variable_test.cc
@@ -235,7 +235,8 @@
 }
 
 TEST_F(SpirvASTPrinterTest, GlobalVar_WithBindingAndGroup) {
-    auto* v = GlobalVar("var", ty.sampler(type::SamplerKind::kSampler), Binding(2_a), Group(3_a));
+    auto* v =
+        GlobalVar("var", ty.sampler(core::type::SamplerKind::kSampler), Binding(2_a), Group(3_a));
 
     Builder& b = Build();
 
@@ -475,7 +476,7 @@
 TEST_F(SpirvASTPrinterTest, GlobalVar_TextureStorageWriteOnly) {
     // var<uniform_constant> a : texture_storage_2d<r32uint, write>;
 
-    auto type = ty.storage_texture(type::TextureDimension::k2d, core::TexelFormat::kR32Uint,
+    auto type = ty.storage_texture(core::type::TextureDimension::k2d, core::TexelFormat::kR32Uint,
                                    core::Access::kWrite);
 
     auto* var_a = GlobalVar("a", type, Binding(0_a), Group(0_a));
diff --git a/src/tint/lang/spirv/writer/atomic_builtin_test.cc b/src/tint/lang/spirv/writer/atomic_builtin_test.cc
index 99c4047..5818a7e 100644
--- a/src/tint/lang/spirv/writer/atomic_builtin_test.cc
+++ b/src/tint/lang/spirv/writer/atomic_builtin_test.cc
@@ -86,7 +86,7 @@
     func->SetParams({cmp, val});
 
     b.Append(func->Block(), [&] {
-        auto* result_ty = type::CreateAtomicCompareExchangeResult(ty, mod.symbols, ty.i32());
+        auto* result_ty = core::type::CreateAtomicCompareExchangeResult(ty, mod.symbols, ty.i32());
         auto* result = b.Call(result_ty, core::Function::kAtomicCompareExchangeWeak, var, cmp, val);
         auto* original = b.Access(ty.i32(), result, 0_u);
         b.Return(func, original);
diff --git a/src/tint/lang/spirv/writer/builtin_test.cc b/src/tint/lang/spirv/writer/builtin_test.cc
index 169406d..be61e83 100644
--- a/src/tint/lang/spirv/writer/builtin_test.cc
+++ b/src/tint/lang/spirv/writer/builtin_test.cc
@@ -255,7 +255,7 @@
 }
 
 TEST_F(SpirvWriterTest, Builtin_Frexp_F32) {
-    auto* str = type::CreateFrexpResult(ty, mod.symbols, ty.f32());
+    auto* str = core::type::CreateFrexpResult(ty, mod.symbols, ty.f32());
     auto* arg = b.FunctionParam("arg", ty.f32());
     auto* func = b.Function("foo", str);
     func->SetParams({arg});
@@ -270,7 +270,7 @@
 }
 
 TEST_F(SpirvWriterTest, Builtin_Frexp_F16) {
-    auto* str = type::CreateFrexpResult(ty, mod.symbols, ty.f16());
+    auto* str = core::type::CreateFrexpResult(ty, mod.symbols, ty.f16());
     auto* arg = b.FunctionParam("arg", ty.f16());
     auto* func = b.Function("foo", str);
     func->SetParams({arg});
@@ -285,7 +285,7 @@
 }
 
 TEST_F(SpirvWriterTest, Builtin_Frexp_Vec2f) {
-    auto* str = type::CreateFrexpResult(ty, mod.symbols, ty.vec2<f32>());
+    auto* str = core::type::CreateFrexpResult(ty, mod.symbols, ty.vec2<f32>());
     auto* arg = b.FunctionParam("arg", ty.vec2<f32>());
     auto* func = b.Function("foo", str);
     func->SetParams({arg});
@@ -300,7 +300,7 @@
 }
 
 TEST_F(SpirvWriterTest, Builtin_Frexp_Vec3h) {
-    auto* str = type::CreateFrexpResult(ty, mod.symbols, ty.vec3<f16>());
+    auto* str = core::type::CreateFrexpResult(ty, mod.symbols, ty.vec3<f16>());
     auto* arg = b.FunctionParam("arg", ty.vec3<f16>());
     auto* func = b.Function("foo", str);
     func->SetParams({arg});
@@ -329,7 +329,7 @@
 }
 
 TEST_F(SpirvWriterTest, Builtin_Modf_F32) {
-    auto* str = type::CreateModfResult(ty, mod.symbols, ty.f32());
+    auto* str = core::type::CreateModfResult(ty, mod.symbols, ty.f32());
     auto* arg = b.FunctionParam("arg", ty.f32());
     auto* func = b.Function("foo", str);
     func->SetParams({arg});
@@ -344,7 +344,7 @@
 }
 
 TEST_F(SpirvWriterTest, Builtin_Modf_F16) {
-    auto* str = type::CreateModfResult(ty, mod.symbols, ty.f16());
+    auto* str = core::type::CreateModfResult(ty, mod.symbols, ty.f16());
     auto* arg = b.FunctionParam("arg", ty.f16());
     auto* func = b.Function("foo", str);
     func->SetParams({arg});
@@ -359,7 +359,7 @@
 }
 
 TEST_F(SpirvWriterTest, Builtin_Modf_Vec2f) {
-    auto* str = type::CreateModfResult(ty, mod.symbols, ty.vec2<f32>());
+    auto* str = core::type::CreateModfResult(ty, mod.symbols, ty.vec2<f32>());
     auto* arg = b.FunctionParam("arg", ty.vec2<f32>());
     auto* func = b.Function("foo", str);
     func->SetParams({arg});
@@ -374,7 +374,7 @@
 }
 
 TEST_F(SpirvWriterTest, Builtin_Modf_Vec3h) {
-    auto* str = type::CreateModfResult(ty, mod.symbols, ty.vec3<f16>());
+    auto* str = core::type::CreateModfResult(ty, mod.symbols, ty.vec3<f16>());
     auto* arg = b.FunctionParam("arg", ty.vec3<f16>());
     auto* func = b.Function("foo", str);
     func->SetParams({arg});
diff --git a/src/tint/lang/spirv/writer/common/helper_test.h b/src/tint/lang/spirv/writer/common/helper_test.h
index 24d8ca1..cb946dc 100644
--- a/src/tint/lang/spirv/writer/common/helper_test.h
+++ b/src/tint/lang/spirv/writer/common/helper_test.h
@@ -83,7 +83,7 @@
     /// The test builder.
     ir::Builder b{mod};
     /// The type manager.
-    type::Manager& ty{mod.Types()};
+    core::type::Manager& ty{mod.Types()};
 
   protected:
     /// The SPIR-V writer.
@@ -170,7 +170,7 @@
     /// Helper to make a scalar type corresponding to the element type `type`.
     /// @param type the element type
     /// @returns the scalar type
-    const type::Type* MakeScalarType(TestElementType type) {
+    const core::type::Type* MakeScalarType(TestElementType type) {
         switch (type) {
             case kBool:
                 return ty.bool_();
@@ -189,7 +189,9 @@
     /// Helper to make a vector type corresponding to the element type `type`.
     /// @param type the element type
     /// @returns the vector type
-    const type::Type* MakeVectorType(TestElementType type) { return ty.vec2(MakeScalarType(type)); }
+    const core::type::Type* MakeVectorType(TestElementType type) {
+        return ty.vec2(MakeScalarType(type));
+    }
 
     /// Helper to make a scalar value with the scalar type `type`.
     /// @param type the element type
diff --git a/src/tint/lang/spirv/writer/printer/printer.cc b/src/tint/lang/spirv/writer/printer/printer.cc
index 29efe57..da1791c 100644
--- a/src/tint/lang/spirv/writer/printer/printer.cc
+++ b/src/tint/lang/spirv/writer/printer/printer.cc
@@ -112,31 +112,31 @@
     }
 }
 
-const type::Type* DedupType(const type::Type* ty, type::Manager& types) {
+const core::type::Type* DedupType(const core::type::Type* ty, core::type::Manager& types) {
     return Switch(
         ty,
 
         // Atomics are not a distinct type in SPIR-V.
-        [&](const type::Atomic* atomic) { return atomic->Type(); },
+        [&](const core::type::Atomic* atomic) { return atomic->Type(); },
 
         // Depth textures are always declared as sampled textures.
-        [&](const type::DepthTexture* depth) {
-            return types.Get<type::SampledTexture>(depth->dim(), types.f32());
+        [&](const core::type::DepthTexture* depth) {
+            return types.Get<core::type::SampledTexture>(depth->dim(), types.f32());
         },
-        [&](const type::DepthMultisampledTexture* depth) {
-            return types.Get<type::MultisampledTexture>(depth->dim(), types.f32());
+        [&](const core::type::DepthMultisampledTexture* depth) {
+            return types.Get<core::type::MultisampledTexture>(depth->dim(), types.f32());
         },
 
         // Both sampler types are the same in SPIR-V.
-        [&](const type::Sampler* s) -> const type::Type* {
+        [&](const core::type::Sampler* s) -> const core::type::Type* {
             if (s->IsComparison()) {
-                return types.Get<type::Sampler>(type::SamplerKind::kSampler);
+                return types.Get<core::type::Sampler>(core::type::SamplerKind::kSampler);
             }
             return s;
         },
 
         // Dedup a SampledImage if its underlying image will be deduped.
-        [&](const raise::SampledImage* si) -> const type::Type* {
+        [&](const raise::SampledImage* si) -> const core::type::Type* {
             auto* img = DedupType(si->Image(), types);
             if (img != si->Image()) {
                 return types.Get<raise::SampledImage>(img);
@@ -252,41 +252,41 @@
         auto* ty = constant->Type();
         Switch(
             ty,  //
-            [&](const type::Bool*) {
+            [&](const core::type::Bool*) {
                 module_.PushType(
                     constant->ValueAs<bool>() ? spv::Op::OpConstantTrue : spv::Op::OpConstantFalse,
                     {Type(ty), id});
             },
-            [&](const type::I32*) {
+            [&](const core::type::I32*) {
                 module_.PushType(spv::Op::OpConstant, {Type(ty), id, constant->ValueAs<u32>()});
             },
-            [&](const type::U32*) {
+            [&](const core::type::U32*) {
                 module_.PushType(spv::Op::OpConstant,
                                  {Type(ty), id, U32Operand(constant->ValueAs<i32>())});
             },
-            [&](const type::F32*) {
+            [&](const core::type::F32*) {
                 module_.PushType(spv::Op::OpConstant, {Type(ty), id, constant->ValueAs<f32>()});
             },
-            [&](const type::F16*) {
+            [&](const core::type::F16*) {
                 module_.PushType(
                     spv::Op::OpConstant,
                     {Type(ty), id, U32Operand(constant->ValueAs<f16>().BitsRepresentation())});
             },
-            [&](const type::Vector* vec) {
+            [&](const core::type::Vector* vec) {
                 OperandList operands = {Type(ty), id};
                 for (uint32_t i = 0; i < vec->Width(); i++) {
                     operands.push_back(Constant(constant->Index(i)));
                 }
                 module_.PushType(spv::Op::OpConstantComposite, operands);
             },
-            [&](const type::Matrix* mat) {
+            [&](const core::type::Matrix* mat) {
                 OperandList operands = {Type(ty), id};
                 for (uint32_t i = 0; i < mat->columns(); i++) {
                     operands.push_back(Constant(constant->Index(i)));
                 }
                 module_.PushType(spv::Op::OpConstantComposite, operands);
             },
-            [&](const type::Array* arr) {
+            [&](const core::type::Array* arr) {
                 TINT_ASSERT(arr->ConstantCount());
                 OperandList operands = {Type(ty), id};
                 for (uint32_t i = 0; i < arr->ConstantCount(); i++) {
@@ -294,7 +294,7 @@
                 }
                 module_.PushType(spv::Op::OpConstantComposite, operands);
             },
-            [&](const type::Struct* str) {
+            [&](const core::type::Struct* str) {
                 OperandList operands = {Type(ty), id};
                 for (uint32_t i = 0; i < str->Members().Length(); i++) {
                     operands.push_back(Constant(constant->Index(i)));
@@ -306,7 +306,7 @@
     });
 }
 
-uint32_t Printer::ConstantNull(const type::Type* type) {
+uint32_t Printer::ConstantNull(const core::type::Type* type) {
     return constant_nulls_.GetOrCreate(type, [&] {
         auto id = module_.NextId();
         module_.PushType(spv::Op::OpConstantNull, {Type(type), id});
@@ -314,7 +314,7 @@
     });
 }
 
-uint32_t Printer::Undef(const type::Type* type) {
+uint32_t Printer::Undef(const core::type::Type* type) {
     return undef_values_.GetOrCreate(type, [&] {
         auto id = module_.NextId();
         module_.PushType(spv::Op::OpUndef, {Type(type), id});
@@ -322,57 +322,58 @@
     });
 }
 
-uint32_t Printer::Type(const type::Type* ty, core::AddressSpace addrspace /* = kUndefined */) {
+uint32_t Printer::Type(const core::type::Type* ty,
+                       core::AddressSpace addrspace /* = kUndefined */) {
     ty = DedupType(ty, ir_->Types());
     return types_.GetOrCreate(ty, [&] {
         auto id = module_.NextId();
         Switch(
             ty,  //
-            [&](const type::Void*) { module_.PushType(spv::Op::OpTypeVoid, {id}); },
-            [&](const type::Bool*) { module_.PushType(spv::Op::OpTypeBool, {id}); },
-            [&](const type::I32*) {
+            [&](const core::type::Void*) { module_.PushType(spv::Op::OpTypeVoid, {id}); },
+            [&](const core::type::Bool*) { module_.PushType(spv::Op::OpTypeBool, {id}); },
+            [&](const core::type::I32*) {
                 module_.PushType(spv::Op::OpTypeInt, {id, 32u, 1u});
             },
-            [&](const type::U32*) {
+            [&](const core::type::U32*) {
                 module_.PushType(spv::Op::OpTypeInt, {id, 32u, 0u});
             },
-            [&](const type::F32*) {
+            [&](const core::type::F32*) {
                 module_.PushType(spv::Op::OpTypeFloat, {id, 32u});
             },
-            [&](const type::F16*) {
+            [&](const core::type::F16*) {
                 module_.PushCapability(SpvCapabilityFloat16);
                 module_.PushCapability(SpvCapabilityUniformAndStorageBuffer16BitAccess);
                 module_.PushCapability(SpvCapabilityStorageBuffer16BitAccess);
                 module_.PushCapability(SpvCapabilityStorageInputOutput16);
                 module_.PushType(spv::Op::OpTypeFloat, {id, 16u});
             },
-            [&](const type::Vector* vec) {
+            [&](const core::type::Vector* vec) {
                 module_.PushType(spv::Op::OpTypeVector, {id, Type(vec->type()), vec->Width()});
             },
-            [&](const type::Matrix* mat) {
+            [&](const core::type::Matrix* mat) {
                 module_.PushType(spv::Op::OpTypeMatrix,
                                  {id, Type(mat->ColumnType()), mat->columns()});
             },
-            [&](const type::Array* arr) {
+            [&](const core::type::Array* arr) {
                 if (arr->ConstantCount()) {
                     auto* count = b_.ConstantValue(u32(arr->ConstantCount().value()));
                     module_.PushType(spv::Op::OpTypeArray,
                                      {id, Type(arr->ElemType()), Constant(count)});
                 } else {
-                    TINT_ASSERT(arr->Count()->Is<type::RuntimeArrayCount>());
+                    TINT_ASSERT(arr->Count()->Is<core::type::RuntimeArrayCount>());
                     module_.PushType(spv::Op::OpTypeRuntimeArray, {id, Type(arr->ElemType())});
                 }
                 module_.PushAnnot(spv::Op::OpDecorate,
                                   {id, U32Operand(SpvDecorationArrayStride), arr->Stride()});
             },
-            [&](const type::Pointer* ptr) {
+            [&](const core::type::Pointer* ptr) {
                 module_.PushType(spv::Op::OpTypePointer,
                                  {id, U32Operand(StorageClass(ptr->AddressSpace())),
                                   Type(ptr->StoreType(), ptr->AddressSpace())});
             },
-            [&](const type::Struct* str) { EmitStructType(id, str, addrspace); },
-            [&](const type::Texture* tex) { EmitTextureType(id, tex); },
-            [&](const type::Sampler*) { module_.PushType(spv::Op::OpTypeSampler, {id}); },
+            [&](const core::type::Struct* str) { EmitStructType(id, str, addrspace); },
+            [&](const core::type::Texture* tex) { EmitTextureType(id, tex); },
+            [&](const core::type::Sampler*) { module_.PushType(spv::Op::OpTypeSampler, {id}); },
             [&](const raise::SampledImage* s) {
                 module_.PushType(spv::Op::OpTypeSampledImage, {id, Type(s->Image())});
             },
@@ -397,15 +398,15 @@
 }
 
 void Printer::EmitStructType(uint32_t id,
-                             const type::Struct* str,
+                             const core::type::Struct* str,
                              core::AddressSpace addrspace /* = kUndefined */) {
     // Helper to return `type` or a potentially nested array element type within `type` as a matrix
     // type, or nullptr if no such matrix type is present.
-    auto get_nested_matrix_type = [&](const type::Type* type) {
-        while (auto* arr = type->As<type::Array>()) {
+    auto get_nested_matrix_type = [&](const core::type::Type* type) {
+        while (auto* arr = type->As<core::type::Array>()) {
             type = arr->ElemType();
         }
-        return type->As<type::Matrix>();
+        return type->As<core::type::Matrix>();
     };
 
     OperandList operands = {id};
@@ -485,7 +486,7 @@
     module_.PushType(spv::Op::OpTypeStruct, std::move(operands));
 
     // Add a Block decoration if necessary.
-    if (str->StructFlags().Contains(type::StructFlag::kBlock)) {
+    if (str->StructFlags().Contains(core::type::StructFlag::kBlock)) {
         module_.PushAnnot(spv::Op::OpDecorate, {id, U32Operand(SpvDecorationBlock)});
     }
 
@@ -494,49 +495,49 @@
     }
 }
 
-void Printer::EmitTextureType(uint32_t id, const type::Texture* texture) {
+void Printer::EmitTextureType(uint32_t id, const core::type::Texture* texture) {
     uint32_t sampled_type = Switch(
         texture,  //
-        [&](const type::SampledTexture* t) { return Type(t->type()); },
-        [&](const type::MultisampledTexture* t) { return Type(t->type()); },
-        [&](const type::StorageTexture* t) { return Type(t->type()); });
+        [&](const core::type::SampledTexture* t) { return Type(t->type()); },
+        [&](const core::type::MultisampledTexture* t) { return Type(t->type()); },
+        [&](const core::type::StorageTexture* t) { return Type(t->type()); });
 
     uint32_t dim = SpvDimMax;
     uint32_t array = 0u;
     switch (texture->dim()) {
-        case type::TextureDimension::kNone: {
+        case core::type::TextureDimension::kNone: {
             break;
         }
-        case type::TextureDimension::k1d: {
+        case core::type::TextureDimension::k1d: {
             dim = SpvDim1D;
-            if (texture->Is<type::SampledTexture>()) {
+            if (texture->Is<core::type::SampledTexture>()) {
                 module_.PushCapability(SpvCapabilitySampled1D);
-            } else if (texture->Is<type::StorageTexture>()) {
+            } else if (texture->Is<core::type::StorageTexture>()) {
                 module_.PushCapability(SpvCapabilityImage1D);
             }
             break;
         }
-        case type::TextureDimension::k2d: {
+        case core::type::TextureDimension::k2d: {
             dim = SpvDim2D;
             break;
         }
-        case type::TextureDimension::k2dArray: {
+        case core::type::TextureDimension::k2dArray: {
             dim = SpvDim2D;
             array = 1u;
             break;
         }
-        case type::TextureDimension::k3d: {
+        case core::type::TextureDimension::k3d: {
             dim = SpvDim3D;
             break;
         }
-        case type::TextureDimension::kCube: {
+        case core::type::TextureDimension::kCube: {
             dim = SpvDimCube;
             break;
         }
-        case type::TextureDimension::kCubeArray: {
+        case core::type::TextureDimension::kCubeArray: {
             dim = SpvDimCube;
             array = 1u;
-            if (texture->Is<type::SampledTexture>()) {
+            if (texture->Is<core::type::SampledTexture>()) {
                 module_.PushCapability(SpvCapabilitySampledCubeArray);
             }
             break;
@@ -549,17 +550,17 @@
     uint32_t depth = 0u;
 
     uint32_t ms = 0u;
-    if (texture->Is<type::MultisampledTexture>()) {
+    if (texture->Is<core::type::MultisampledTexture>()) {
         ms = 1u;
     }
 
     uint32_t sampled = 2u;
-    if (texture->IsAnyOf<type::MultisampledTexture, type::SampledTexture>()) {
+    if (texture->IsAnyOf<core::type::MultisampledTexture, core::type::SampledTexture>()) {
         sampled = 1u;
     }
 
     uint32_t format = SpvImageFormat_::SpvImageFormatUnknown;
-    if (auto* st = texture->As<type::StorageTexture>()) {
+    if (auto* st = texture->As<core::type::StorageTexture>()) {
         format = TexelFormat(st->texel_format());
     }
 
@@ -658,7 +659,7 @@
                 continue;
             }
 
-            auto* ptr = var->Result()->Type()->As<type::Pointer>();
+            auto* ptr = var->Result()->Type()->As<core::type::Pointer>();
             if (!(ptr->AddressSpace() == core::AddressSpace::kIn ||
                   ptr->AddressSpace() == core::AddressSpace::kOut)) {
                 continue;
@@ -682,7 +683,7 @@
             operands.push_back(Value(var));
 
             // Add the `DepthReplacing` execution mode if `frag_depth` is used.
-            if (auto* str = ptr->StoreType()->As<type::Struct>()) {
+            if (auto* str = ptr->StoreType()->As<core::type::Struct>()) {
                 for (auto* member : str->Members()) {
                     if (member->Attributes().builtin == core::BuiltinValue::kFragDepth) {
                         module_.PushExecutionMode(spv::Op::OpExecutionMode,
@@ -874,7 +875,7 @@
     auto id = Value(access);
     OperandList operands = {Type(ty), id, Value(access->Object())};
 
-    if (ty->Is<type::Pointer>()) {
+    if (ty->Is<core::type::Pointer>()) {
         // Use OpAccessChain for accesses into pointer types.
         for (auto* idx : access->Indices()) {
             operands.push_back(Value(idx));
@@ -895,7 +896,7 @@
         } else {
             // The VarForDynamicIndex transform ensures that only value types that are vectors
             // will be dynamically indexed, as we can use OpVectorExtractDynamic for this case.
-            TINT_ASSERT(source_ty->Is<type::Vector>());
+            TINT_ASSERT(source_ty->Is<core::type::Vector>());
 
             // If this wasn't the first access in the chain then emit the chain so far as an
             // OpCompositeExtract, creating a new result ID for the resulting vector.
@@ -1083,7 +1084,7 @@
         return;
     }
     if ((builtin->Func() == core::Function::kAll || builtin->Func() == core::Function::kAny) &&
-        builtin->Args()[0]->Type()->Is<type::Bool>()) {
+        builtin->Args()[0]->Type()->Is<core::type::Bool>()) {
         // all() and any() are passthroughs for scalar arguments.
         values_.Add(builtin->Result(), Value(builtin->Args()[0]));
         return;
@@ -1474,25 +1475,25 @@
         ir::Constant* zero = nullptr;
         Switch(
             res_ty->DeepestElement(),  //
-            [&](const type::F32*) {
+            [&](const core::type::F32*) {
                 one = b_.Constant(1_f);
                 zero = b_.Constant(0_f);
             },
-            [&](const type::F16*) {
+            [&](const core::type::F16*) {
                 one = b_.Constant(1_h);
                 zero = b_.Constant(0_h);
             },
-            [&](const type::I32*) {
+            [&](const core::type::I32*) {
                 one = b_.Constant(1_i);
                 zero = b_.Constant(0_i);
             },
-            [&](const type::U32*) {
+            [&](const core::type::U32*) {
                 one = b_.Constant(1_u);
                 zero = b_.Constant(0_u);
             });
         TINT_ASSERT_OR_RETURN(one && zero);
 
-        if (auto* vec = res_ty->As<type::Vector>()) {
+        if (auto* vec = res_ty->As<core::type::Vector>()) {
             // Splat the scalars into vectors.
             one = b_.Splat(vec, one, vec->Width());
             zero = b_.Splat(vec, zero, vec->Width());
@@ -1614,7 +1615,7 @@
     }
 
     OperandList operands;
-    if (!call->Result()->Type()->Is<type::Void>()) {
+    if (!call->Result()->Type()->Is<core::type::Void>()) {
         operands = {Type(call->Result()->Type()), id};
     }
     for (auto* arg : call->Args()) {
@@ -1629,7 +1630,7 @@
 }
 
 void Printer::EmitLoadVectorElement(ir::LoadVectorElement* load) {
-    auto* vec_ptr_ty = load->From()->Type()->As<type::Pointer>();
+    auto* vec_ptr_ty = load->From()->Type()->As<core::type::Pointer>();
     auto* el_ty = load->Result()->Type();
     auto* el_ptr_ty = ir_->Types().ptr(vec_ptr_ty->AddressSpace(), el_ty, vec_ptr_ty->Access());
     auto el_ptr_id = module_.NextId();
@@ -1748,7 +1749,7 @@
 }
 
 void Printer::EmitStoreVectorElement(ir::StoreVectorElement* store) {
-    auto* vec_ptr_ty = store->To()->Type()->As<type::Pointer>();
+    auto* vec_ptr_ty = store->To()->Type()->As<core::type::Pointer>();
     auto* el_ty = store->Value()->Type();
     auto* el_ptr_ty = ir_->Types().ptr(vec_ptr_ty->AddressSpace(), el_ty, vec_ptr_ty->Access());
     auto el_ptr_id = module_.NextId();
@@ -1788,7 +1789,7 @@
 
 void Printer::EmitVar(ir::Var* var) {
     auto id = Value(var);
-    auto* ptr = var->Result()->Type()->As<type::Pointer>();
+    auto* ptr = var->Result()->Type()->As<core::type::Pointer>();
     auto ty = Type(ptr);
 
     switch (ptr->AddressSpace()) {
diff --git a/src/tint/lang/spirv/writer/printer/printer.h b/src/tint/lang/spirv/writer/printer/printer.h
index 18c98d9..dceafb0 100644
--- a/src/tint/lang/spirv/writer/printer/printer.h
+++ b/src/tint/lang/spirv/writer/printer/printer.h
@@ -66,11 +66,11 @@
 class Value;
 class Var;
 }  // namespace tint::ir
-namespace tint::type {
+namespace tint::core::type {
 class Struct;
 class Texture;
 class Type;
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 namespace tint::spirv::writer {
 
@@ -98,7 +98,7 @@
     /// @param ty the type to get the ID for
     /// @param addrspace the optional address space that this type is being used for
     /// @returns the result ID of the type
-    uint32_t Type(const type::Type* ty,
+    uint32_t Type(const core::type::Type* ty,
                   core::AddressSpace addrspace = core::AddressSpace::kUndefined);
 
   private:
@@ -122,7 +122,7 @@
     /// Get the result ID of the OpConstantNull instruction for `type`, emitting it if necessary.
     /// @param type the type to get the ID for
     /// @returns the result ID of the OpConstantNull instruction
-    uint32_t ConstantNull(const type::Type* type);
+    uint32_t ConstantNull(const core::type::Type* type);
 
     /// Get the ID of the label for `block`.
     /// @param block the block to get the label ID for
@@ -142,20 +142,20 @@
     /// Get the result ID of the OpUndef instruction with type `ty`, emitting it if necessary.
     /// @param ty the type of the undef value
     /// @returns the result ID of the instruction
-    uint32_t Undef(const type::Type* ty);
+    uint32_t Undef(const core::type::Type* ty);
 
     /// Emit a struct type.
     /// @param id the result ID to use
     /// @param addrspace the optional address space that this type is being used for
     /// @param str the struct type to emit
     void EmitStructType(uint32_t id,
-                        const type::Struct* str,
+                        const core::type::Struct* str,
                         core::AddressSpace addrspace = core::AddressSpace::kUndefined);
 
     /// Emit a texture type.
     /// @param id the result ID to use
     /// @param texture the texture type to emit
-    void EmitTextureType(uint32_t id, const type::Texture* texture);
+    void EmitTextureType(uint32_t id, const core::type::Texture* texture);
 
     /// Emit a function.
     /// @param func the function to emit
@@ -297,7 +297,7 @@
     };
 
     /// The map of types to their result IDs.
-    Hashmap<const type::Type*, uint32_t, 8> types_;
+    Hashmap<const core::type::Type*, uint32_t, 8> types_;
 
     /// The map of function types to their result IDs.
     Hashmap<FunctionType, uint32_t, 8, FunctionType::Hasher> function_types_;
@@ -306,10 +306,10 @@
     Hashmap<const core::constant::Value*, uint32_t, 16> constants_;
 
     /// The map of types to the result IDs of their OpConstantNull instructions.
-    Hashmap<const type::Type*, uint32_t, 4> constant_nulls_;
+    Hashmap<const core::type::Type*, uint32_t, 4> constant_nulls_;
 
     /// The map of types to the result IDs of their OpUndef instructions.
-    Hashmap<const type::Type*, uint32_t, 4> undef_values_;
+    Hashmap<const core::type::Type*, uint32_t, 4> undef_values_;
 
     /// The map of non-constant values to their result IDs.
     Hashmap<ir::Value*, uint32_t, 8> values_;
diff --git a/src/tint/lang/spirv/writer/raise/builtin_polyfill.cc b/src/tint/lang/spirv/writer/raise/builtin_polyfill.cc
index def794c..1173d66 100644
--- a/src/tint/lang/spirv/writer/raise/builtin_polyfill.cc
+++ b/src/tint/lang/spirv/writer/raise/builtin_polyfill.cc
@@ -47,7 +47,7 @@
     ir::Builder b{*ir};
 
     /// The type manager.
-    type::Manager& ty{ir->Types()};
+    core::type::Manager& ty{ir->Types()};
 
     /// Process the module.
     void Process() {
@@ -178,7 +178,7 @@
         auto* access = ptr->Source()->As<ir::Access>();
         TINT_ASSERT_OR_RETURN_VALUE(access, nullptr);
         TINT_ASSERT_OR_RETURN_VALUE(access->Indices().Length() == 1u, nullptr);
-        TINT_ASSERT_OR_RETURN_VALUE(access->Object()->Type()->UnwrapPtr()->Is<type::Struct>(),
+        TINT_ASSERT_OR_RETURN_VALUE(access->Object()->Type()->UnwrapPtr()->Is<core::type::Struct>(),
                                     nullptr);
         auto* const_idx = access->Indices()[0]->As<ir::Constant>();
 
@@ -198,7 +198,7 @@
 
         auto* pointer = builtin->Args()[0];
         auto* memory = [&]() -> ir::Value* {
-            switch (pointer->Type()->As<type::Pointer>()->AddressSpace()) {
+            switch (pointer->Type()->As<core::type::Pointer>()->AddressSpace()) {
                 case core::AddressSpace::kWorkgroup:
                     return b.Constant(u32(SpvScopeWorkgroup));
                 case core::AddressSpace::kStorage:
@@ -211,7 +211,7 @@
         auto* memory_semantics = b.Constant(u32(SpvMemorySemanticsMaskNone));
 
         // Helper to build the intrinsic call with the common operands.
-        auto build = [&](const type::Type* type, enum ir::IntrinsicCall::Kind intrinsic) {
+        auto build = [&](const core::type::Type* type, enum ir::IntrinsicCall::Kind intrinsic) {
             return b.Call(type, intrinsic, pointer, memory, memory_semantics);
         };
 
@@ -242,8 +242,9 @@
                 compare->InsertBefore(builtin);
 
                 // Construct the atomicCompareExchange result structure.
-                call = b.Construct(type::CreateAtomicCompareExchangeResult(ty, ir->symbols, int_ty),
-                                   Vector{original, compare->Result()});
+                call = b.Construct(
+                    core::type::CreateAtomicCompareExchangeResult(ty, ir->symbols, int_ty),
+                    Vector{original, compare->Result()});
                 break;
             }
             case core::Function::kAtomicExchange:
@@ -304,7 +305,7 @@
 
             auto* v1 = builtin->Args()[0];
             auto* v2 = builtin->Args()[1];
-            auto* vec = v1->Type()->As<type::Vector>();
+            auto* vec = v1->Type()->As<core::type::Vector>();
             auto* elty = vec->type();
             for (uint32_t i = 0; i < vec->Width(); i++) {
                 b.InsertBefore(builtin, [&] {
@@ -343,8 +344,8 @@
         // If the condition is scalar and the objects are vectors, we need to splat the condition
         // into a vector of the same size.
         // TODO(jrprice): We don't need to do this if we're targeting SPIR-V 1.4 or newer.
-        auto* vec = builtin->Result()->Type()->As<type::Vector>();
-        if (vec && args[0]->Type()->Is<type::Scalar>()) {
+        auto* vec = builtin->Result()->Type()->As<core::type::Vector>();
+        if (vec && args[0]->Type()->Is<core::type::Scalar>()) {
             Vector<ir::Value*, 4> elements;
             elements.Resize(vec->Width(), args[0]);
 
@@ -431,7 +432,7 @@
     ir::Value* AppendArrayIndex(ir::Value* coords,
                                 ir::Value* array_idx,
                                 ir::Instruction* insertion_point) {
-        auto* vec = coords->Type()->As<type::Vector>();
+        auto* vec = coords->Type()->As<core::type::Vector>();
         auto* element_ty = vec->type();
 
         // Convert the index to match the coordinate type if needed.
@@ -462,7 +463,7 @@
         auto* texture = next_arg();
         auto* sampler = next_arg();
         auto* coords = next_arg();
-        auto* texture_ty = texture->Type()->As<type::Texture>();
+        auto* texture_ty = texture->Type()->As<core::type::Texture>();
 
         // Use OpSampledImage to create an OpTypeSampledImage object.
         auto* sampled_image =
@@ -531,7 +532,7 @@
 
         // Call the intrinsic.
         // If this is a depth comparison, the result is always f32, otherwise vec4f.
-        auto* result_ty = depth ? static_cast<const type::Type*>(ty.f32()) : ty.vec4<f32>();
+        auto* result_ty = depth ? static_cast<const core::type::Type*>(ty.f32()) : ty.vec4<f32>();
         auto* texture_call = b.Call(result_ty, intrinsic, std::move(intrinsic_args));
         texture_call->InsertBefore(builtin);
 
@@ -539,7 +540,8 @@
 
         // If this is not a depth comparison but we are sampling a depth texture, extract the first
         // component to get the scalar f32 that SPIR-V expects.
-        if (!depth && texture_ty->IsAnyOf<type::DepthTexture, type::DepthMultisampledTexture>()) {
+        if (!depth &&
+            texture_ty->IsAnyOf<core::type::DepthTexture, core::type::DepthMultisampledTexture>()) {
             auto* extract = b.Access(ty.f32(), result, 0_u);
             extract->InsertBefore(builtin);
             result = extract->Result();
@@ -568,7 +570,7 @@
         auto* texture = next_arg();
         auto* sampler = next_arg();
         auto* coords = next_arg();
-        auto* texture_ty = texture->Type()->As<type::Texture>();
+        auto* texture_ty = texture->Type()->As<core::type::Texture>();
 
         // Use OpSampledImage to create an OpTypeSampledImage object.
         auto* sampled_image =
@@ -634,7 +636,7 @@
 
         auto* texture = next_arg();
         auto* coords = next_arg();
-        auto* texture_ty = texture->Type()->As<type::Texture>();
+        auto* texture_ty = texture->Type()->As<core::type::Texture>();
 
         // Append the array index to the coordinates if provided.
         auto* array_idx = IsTextureArray(texture_ty->dim()) ? next_arg() : nullptr;
@@ -650,7 +652,8 @@
 
         // Add the optional image operands, if any.
         ImageOperands operands;
-        if (texture_ty->IsAnyOf<type::MultisampledTexture, type::DepthMultisampledTexture>()) {
+        if (texture_ty->IsAnyOf<core::type::MultisampledTexture,
+                                core::type::DepthMultisampledTexture>()) {
             operands.sample = next_arg();
         } else {
             operands.lod = next_arg();
@@ -660,7 +663,7 @@
         // Call the intrinsic.
         // The result is always a vec4 in SPIR-V.
         auto* result_ty = builtin->Result()->Type();
-        bool expects_scalar_result = result_ty->Is<type::Scalar>();
+        bool expects_scalar_result = result_ty->Is<core::type::Scalar>();
         if (expects_scalar_result) {
             result_ty = ty.vec4(result_ty);
         }
@@ -691,7 +694,7 @@
 
         auto* texture = next_arg();
         auto* coords = next_arg();
-        auto* texture_ty = texture->Type()->As<type::Texture>();
+        auto* texture_ty = texture->Type()->As<core::type::Texture>();
 
         // Append the array index to the coordinates if provided.
         auto* array_idx = IsTextureArray(texture_ty->dim()) ? next_arg() : nullptr;
@@ -729,15 +732,16 @@
         };
 
         auto* texture = next_arg();
-        auto* texture_ty = texture->Type()->As<type::Texture>();
+        auto* texture_ty = texture->Type()->As<core::type::Texture>();
 
         Vector<ir::Value*, 8> intrinsic_args;
         intrinsic_args.Push(texture);
 
         // Determine which SPIR-V intrinsic to use, and add the Lod argument if needed.
         enum ir::IntrinsicCall::Kind intrinsic;
-        if (texture_ty->IsAnyOf<type::MultisampledTexture, type::DepthMultisampledTexture,
-                                type::StorageTexture>()) {
+        if (texture_ty
+                ->IsAnyOf<core::type::MultisampledTexture, core::type::DepthMultisampledTexture,
+                          core::type::StorageTexture>()) {
             intrinsic = ir::IntrinsicCall::Kind::kSpirvImageQuerySize;
         } else {
             intrinsic = ir::IntrinsicCall::Kind::kSpirvImageQuerySizeLod;
@@ -751,8 +755,8 @@
 
         // Add an extra component to the result vector for arrayed textures.
         auto* result_ty = builtin->Result()->Type();
-        if (type::IsTextureArray(texture_ty->dim())) {
-            auto* vec = result_ty->As<type::Vector>();
+        if (core::type::IsTextureArray(texture_ty->dim())) {
+            auto* vec = result_ty->As<core::type::Vector>();
             result_ty = ty.vec(vec->type(), vec->Width() + 1);
         }
 
@@ -763,7 +767,7 @@
         auto* result = texture_call->Result();
 
         // Swizzle the first two components from the result for arrayed textures.
-        if (type::IsTextureArray(texture_ty->dim())) {
+        if (core::type::IsTextureArray(texture_ty->dim())) {
             auto* swizzle = b.Swizzle(builtin->Result()->Type(), result, {0, 1});
             swizzle->InsertBefore(builtin);
             result = swizzle->Result();
@@ -777,15 +781,16 @@
     /// @returns the replacement value
     ir::Value* TextureNumLayers(ir::CoreBuiltinCall* builtin) {
         auto* texture = builtin->Args()[0];
-        auto* texture_ty = texture->Type()->As<type::Texture>();
+        auto* texture_ty = texture->Type()->As<core::type::Texture>();
 
         Vector<ir::Value*, 2> intrinsic_args;
         intrinsic_args.Push(texture);
 
         // Determine which SPIR-V intrinsic to use, and add the Lod argument if needed.
         enum ir::IntrinsicCall::Kind intrinsic;
-        if (texture_ty->IsAnyOf<type::MultisampledTexture, type::DepthMultisampledTexture,
-                                type::StorageTexture>()) {
+        if (texture_ty
+                ->IsAnyOf<core::type::MultisampledTexture, core::type::DepthMultisampledTexture,
+                          core::type::StorageTexture>()) {
             intrinsic = ir::IntrinsicCall::Kind::kSpirvImageQuerySize;
         } else {
             intrinsic = ir::IntrinsicCall::Kind::kSpirvImageQuerySizeLod;
@@ -820,12 +825,12 @@
 
 LiteralOperand::~LiteralOperand() = default;
 
-SampledImage::SampledImage(const type::Type* image)
+SampledImage::SampledImage(const core::type::Type* image)
     : Base(static_cast<size_t>(Hash(tint::TypeInfo::Of<SampledImage>().full_hashcode, image)),
-           type::Flags{}),
+           core::type::Flags{}),
       image_(image) {}
 
-SampledImage* SampledImage::Clone(type::CloneContext& ctx) const {
+SampledImage* SampledImage::Clone(core::type::CloneContext& ctx) const {
     auto* image = image_->Clone(ctx);
     return ctx.dst.mgr->Get<SampledImage>(image);
 }
diff --git a/src/tint/lang/spirv/writer/raise/builtin_polyfill.h b/src/tint/lang/spirv/writer/raise/builtin_polyfill.h
index 936174f..343caf6 100644
--- a/src/tint/lang/spirv/writer/raise/builtin_polyfill.h
+++ b/src/tint/lang/spirv/writer/raise/builtin_polyfill.h
@@ -49,11 +49,11 @@
 
 /// SampledImage represents an OpTypeSampledImage in SPIR-V.
 /// TODO(jrprice): Move this to lang/spirv.
-class SampledImage final : public Castable<SampledImage, type::Type> {
+class SampledImage final : public Castable<SampledImage, core::type::Type> {
   public:
     /// Constructor
     /// @param image the image type
-    explicit SampledImage(const type::Type* image);
+    explicit SampledImage(const core::type::Type* image);
 
     /// @param other the other node to compare against
     /// @returns true if the this type is equal to @p other
@@ -64,13 +64,13 @@
 
     /// @param ctx the clone context
     /// @returns a clone of this type
-    SampledImage* Clone(type::CloneContext& ctx) const override;
+    SampledImage* Clone(core::type::CloneContext& ctx) const override;
 
     /// @returns the image type
-    const type::Type* Image() const { return image_; }
+    const core::type::Type* Image() const { return image_; }
 
   private:
-    const type::Type* image_;
+    const core::type::Type* image_;
 };
 
 }  // namespace tint::spirv::writer::raise
diff --git a/src/tint/lang/spirv/writer/raise/builtin_polyfill_test.cc b/src/tint/lang/spirv/writer/raise/builtin_polyfill_test.cc
index 0b179a9..5f827d7 100644
--- a/src/tint/lang/spirv/writer/raise/builtin_polyfill_test.cc
+++ b/src/tint/lang/spirv/writer/raise/builtin_polyfill_test.cc
@@ -380,7 +380,7 @@
     func->SetParams({cmp, val});
 
     b.Append(func->Block(), [&] {
-        auto* result_ty = type::CreateAtomicCompareExchangeResult(ty, mod.symbols, ty.i32());
+        auto* result_ty = core::type::CreateAtomicCompareExchangeResult(ty, mod.symbols, ty.i32());
         auto* result = b.Call(result_ty, core::Function::kAtomicCompareExchangeWeak, var, cmp, val);
         b.Return(func, b.Access(ty.i32(), result, 0_u));
     });
@@ -1104,8 +1104,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureLoad_2D) {
-    auto* t =
-        b.FunctionParam("t", ty.Get<type::SampledTexture>(type::TextureDimension::k2d, ty.f32()));
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2d, ty.f32()));
     auto* coords = b.FunctionParam("coords", ty.vec2<i32>());
     auto* lod = b.FunctionParam("lod", ty.i32());
     auto* func = b.Function("foo", ty.vec4<f32>());
@@ -1142,7 +1142,7 @@
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureLoad_2DArray) {
     auto* t = b.FunctionParam(
-        "t", ty.Get<type::SampledTexture>(type::TextureDimension::k2dArray, ty.f32()));
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2dArray, ty.f32()));
     auto* coords = b.FunctionParam("coords", ty.vec2<i32>());
     auto* array_idx = b.FunctionParam("array_idx", ty.i32());
     auto* lod = b.FunctionParam("lod", ty.i32());
@@ -1182,7 +1182,7 @@
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureLoad_2DArray_IndexDifferentType) {
     auto* t = b.FunctionParam(
-        "t", ty.Get<type::SampledTexture>(type::TextureDimension::k2dArray, ty.f32()));
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2dArray, ty.f32()));
     auto* coords = b.FunctionParam("coords", ty.vec2<i32>());
     auto* array_idx = b.FunctionParam("array_idx", ty.u32());
     auto* lod = b.FunctionParam("lod", ty.i32());
@@ -1223,7 +1223,7 @@
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureLoad_Multisampled2D) {
     auto* t = b.FunctionParam(
-        "t", ty.Get<type::MultisampledTexture>(type::TextureDimension::k2d, ty.f32()));
+        "t", ty.Get<core::type::MultisampledTexture>(core::type::TextureDimension::k2d, ty.f32()));
     auto* coords = b.FunctionParam("coords", ty.vec2<i32>());
     auto* sample_idx = b.FunctionParam("sample_idx", ty.i32());
     auto* func = b.Function("foo", ty.vec4<f32>());
@@ -1259,7 +1259,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureLoad_Depth2D) {
-    auto* t = b.FunctionParam("t", ty.Get<type::DepthTexture>(type::TextureDimension::k2d));
+    auto* t =
+        b.FunctionParam("t", ty.Get<core::type::DepthTexture>(core::type::TextureDimension::k2d));
     auto* coords = b.FunctionParam("coords", ty.vec2<i32>());
     auto* lod = b.FunctionParam("lod", ty.i32());
     auto* func = b.Function("foo", ty.f32());
@@ -1296,8 +1297,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureSample_1D) {
-    auto* t =
-        b.FunctionParam("t", ty.Get<type::SampledTexture>(type::TextureDimension::k1d, ty.f32()));
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k1d, ty.f32()));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.f32());
     auto* func = b.Function("foo", ty.vec4<f32>());
@@ -1334,8 +1335,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureSample_2D) {
-    auto* t =
-        b.FunctionParam("t", ty.Get<type::SampledTexture>(type::TextureDimension::k2d, ty.f32()));
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2d, ty.f32()));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
     auto* func = b.Function("foo", ty.vec4<f32>());
@@ -1372,8 +1373,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureSample_2D_Offset) {
-    auto* t =
-        b.FunctionParam("t", ty.Get<type::SampledTexture>(type::TextureDimension::k2d, ty.f32()));
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2d, ty.f32()));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
     auto* func = b.Function("foo", ty.vec4<f32>());
@@ -1412,7 +1413,7 @@
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureSample_2DArray_Offset) {
     auto* t = b.FunctionParam(
-        "t", ty.Get<type::SampledTexture>(type::TextureDimension::k2dArray, ty.f32()));
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2dArray, ty.f32()));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
     auto* array_idx = b.FunctionParam("array_idx", ty.i32());
@@ -1453,8 +1454,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureSampleBias_2D) {
-    auto* t =
-        b.FunctionParam("t", ty.Get<type::SampledTexture>(type::TextureDimension::k2d, ty.f32()));
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2d, ty.f32()));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
     auto* bias = b.FunctionParam("bias", ty.f32());
@@ -1493,8 +1494,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureSampleBias_2D_Offset) {
-    auto* t =
-        b.FunctionParam("t", ty.Get<type::SampledTexture>(type::TextureDimension::k2d, ty.f32()));
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2d, ty.f32()));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
     auto* bias = b.FunctionParam("bias", ty.f32());
@@ -1534,7 +1535,7 @@
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureSampleBias_2DArray_Offset) {
     auto* t = b.FunctionParam(
-        "t", ty.Get<type::SampledTexture>(type::TextureDimension::k2dArray, ty.f32()));
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2dArray, ty.f32()));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
     auto* array_idx = b.FunctionParam("array_idx", ty.i32());
@@ -1576,7 +1577,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureSampleCompare_2D) {
-    auto* t = b.FunctionParam("t", ty.Get<type::DepthTexture>(type::TextureDimension::k2d));
+    auto* t =
+        b.FunctionParam("t", ty.Get<core::type::DepthTexture>(core::type::TextureDimension::k2d));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
     auto* dref = b.FunctionParam("dref", ty.f32());
@@ -1614,7 +1616,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureSampleCompare_2D_Offset) {
-    auto* t = b.FunctionParam("t", ty.Get<type::DepthTexture>(type::TextureDimension::k2d));
+    auto* t =
+        b.FunctionParam("t", ty.Get<core::type::DepthTexture>(core::type::TextureDimension::k2d));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
     auto* dref = b.FunctionParam("dref", ty.f32());
@@ -1653,7 +1656,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureSampleCompare_2DArray_Offset) {
-    auto* t = b.FunctionParam("t", ty.Get<type::DepthTexture>(type::TextureDimension::k2dArray));
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::DepthTexture>(core::type::TextureDimension::k2dArray));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
     auto* array_idx = b.FunctionParam("array_idx", ty.i32());
@@ -1695,7 +1699,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureSampleCompareLevel_2D) {
-    auto* t = b.FunctionParam("t", ty.Get<type::DepthTexture>(type::TextureDimension::k2d));
+    auto* t =
+        b.FunctionParam("t", ty.Get<core::type::DepthTexture>(core::type::TextureDimension::k2d));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
     auto* dref = b.FunctionParam("dref", ty.f32());
@@ -1734,7 +1739,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureSampleCompareLevel_2D_Offset) {
-    auto* t = b.FunctionParam("t", ty.Get<type::DepthTexture>(type::TextureDimension::k2d));
+    auto* t =
+        b.FunctionParam("t", ty.Get<core::type::DepthTexture>(core::type::TextureDimension::k2d));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
     auto* dref = b.FunctionParam("dref", ty.f32());
@@ -1773,7 +1779,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureSampleCompareLevel_2DArray_Offset) {
-    auto* t = b.FunctionParam("t", ty.Get<type::DepthTexture>(type::TextureDimension::k2dArray));
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::DepthTexture>(core::type::TextureDimension::k2dArray));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
     auto* array_idx = b.FunctionParam("array_idx", ty.i32());
@@ -1815,8 +1822,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureSampleGrad_2D) {
-    auto* t =
-        b.FunctionParam("t", ty.Get<type::SampledTexture>(type::TextureDimension::k2d, ty.f32()));
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2d, ty.f32()));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
     auto* ddx = b.FunctionParam("ddx", ty.vec2<f32>());
@@ -1856,8 +1863,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureSampleGrad_2D_Offset) {
-    auto* t =
-        b.FunctionParam("t", ty.Get<type::SampledTexture>(type::TextureDimension::k2d, ty.f32()));
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2d, ty.f32()));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
     auto* ddx = b.FunctionParam("ddx", ty.vec2<f32>());
@@ -1898,7 +1905,7 @@
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureSampleGrad_2DArray_Offset) {
     auto* t = b.FunctionParam(
-        "t", ty.Get<type::SampledTexture>(type::TextureDimension::k2dArray, ty.f32()));
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2dArray, ty.f32()));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
     auto* array_idx = b.FunctionParam("array_idx", ty.i32());
@@ -1941,8 +1948,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureSampleLevel_2D) {
-    auto* t =
-        b.FunctionParam("t", ty.Get<type::SampledTexture>(type::TextureDimension::k2d, ty.f32()));
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2d, ty.f32()));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
     auto* lod = b.FunctionParam("lod", ty.f32());
@@ -1981,8 +1988,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureSampleLevel_2D_Offset) {
-    auto* t =
-        b.FunctionParam("t", ty.Get<type::SampledTexture>(type::TextureDimension::k2d, ty.f32()));
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2d, ty.f32()));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
     auto* lod = b.FunctionParam("lod", ty.f32());
@@ -2022,7 +2029,7 @@
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureSampleLevel_2DArray_Offset) {
     auto* t = b.FunctionParam(
-        "t", ty.Get<type::SampledTexture>(type::TextureDimension::k2dArray, ty.f32()));
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2dArray, ty.f32()));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
     auto* array_idx = b.FunctionParam("array_idx", ty.i32());
@@ -2064,8 +2071,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureGather_2D) {
-    auto* t =
-        b.FunctionParam("t", ty.Get<type::SampledTexture>(type::TextureDimension::k2d, ty.f32()));
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2d, ty.f32()));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* component = b.FunctionParam("component", ty.i32());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
@@ -2104,8 +2111,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureGather_2D_Offset) {
-    auto* t =
-        b.FunctionParam("t", ty.Get<type::SampledTexture>(type::TextureDimension::k2d, ty.f32()));
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2d, ty.f32()));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* component = b.FunctionParam("component", ty.i32());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
@@ -2145,7 +2152,7 @@
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureGather_2DArray_Offset) {
     auto* t = b.FunctionParam(
-        "t", ty.Get<type::SampledTexture>(type::TextureDimension::k2dArray, ty.f32()));
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2dArray, ty.f32()));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* component = b.FunctionParam("component", ty.i32());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
@@ -2187,7 +2194,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureGather_Depth2D) {
-    auto* t = b.FunctionParam("t", ty.Get<type::DepthTexture>(type::TextureDimension::k2d));
+    auto* t =
+        b.FunctionParam("t", ty.Get<core::type::DepthTexture>(core::type::TextureDimension::k2d));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
     auto* func = b.Function("foo", ty.vec4<f32>());
@@ -2224,7 +2232,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureGatherCompare_Depth2D) {
-    auto* t = b.FunctionParam("t", ty.Get<type::DepthTexture>(type::TextureDimension::k2d));
+    auto* t =
+        b.FunctionParam("t", ty.Get<core::type::DepthTexture>(core::type::TextureDimension::k2d));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
     auto* depth = b.FunctionParam("depth", ty.f32());
@@ -2263,7 +2272,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureGatherCompare_Depth2D_Offset) {
-    auto* t = b.FunctionParam("t", ty.Get<type::DepthTexture>(type::TextureDimension::k2d));
+    auto* t =
+        b.FunctionParam("t", ty.Get<core::type::DepthTexture>(core::type::TextureDimension::k2d));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
     auto* depth = b.FunctionParam("depth", ty.f32());
@@ -2302,7 +2312,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureGatherCompare_Depth2DArray) {
-    auto* t = b.FunctionParam("t", ty.Get<type::DepthTexture>(type::TextureDimension::k2dArray));
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::DepthTexture>(core::type::TextureDimension::k2dArray));
     auto* s = b.FunctionParam("s", ty.sampler());
     auto* coords = b.FunctionParam("coords", ty.vec2<f32>());
     auto* array_idx = b.FunctionParam("array_idx", ty.u32());
@@ -2345,9 +2356,10 @@
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureStore_2D) {
     auto format = core::TexelFormat::kR32Float;
-    auto* t = b.FunctionParam(
-        "t", ty.Get<type::StorageTexture>(type::TextureDimension::k2d, format, core::Access::kWrite,
-                                          type::StorageTexture::SubtypeFor(format, ty)));
+    auto* t =
+        b.FunctionParam("t", ty.Get<core::type::StorageTexture>(
+                                 core::type::TextureDimension::k2d, format, core::Access::kWrite,
+                                 core::type::StorageTexture::SubtypeFor(format, ty)));
     auto* coords = b.FunctionParam("coords", ty.vec2<i32>());
     auto* texel = b.FunctionParam("texel", ty.i32());
     auto* func = b.Function("foo", ty.void_());
@@ -2385,9 +2397,9 @@
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureStore_2DArray) {
     auto format = core::TexelFormat::kR32Float;
     auto* t = b.FunctionParam(
-        "t",
-        ty.Get<type::StorageTexture>(type::TextureDimension::k2dArray, format, core::Access::kWrite,
-                                     type::StorageTexture::SubtypeFor(format, ty)));
+        "t", ty.Get<core::type::StorageTexture>(
+                 core::type::TextureDimension::k2dArray, format, core::Access::kWrite,
+                 core::type::StorageTexture::SubtypeFor(format, ty)));
     auto* coords = b.FunctionParam("coords", ty.vec2<i32>());
     auto* array_idx = b.FunctionParam("array_idx", ty.i32());
     auto* texel = b.FunctionParam("texel", ty.i32());
@@ -2427,9 +2439,9 @@
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureStore_2DArray_IndexDifferentType) {
     auto format = core::TexelFormat::kR32Float;
     auto* t = b.FunctionParam(
-        "t",
-        ty.Get<type::StorageTexture>(type::TextureDimension::k2dArray, format, core::Access::kWrite,
-                                     type::StorageTexture::SubtypeFor(format, ty)));
+        "t", ty.Get<core::type::StorageTexture>(
+                 core::type::TextureDimension::k2dArray, format, core::Access::kWrite,
+                 core::type::StorageTexture::SubtypeFor(format, ty)));
     auto* coords = b.FunctionParam("coords", ty.vec2<i32>());
     auto* array_idx = b.FunctionParam("array_idx", ty.u32());
     auto* texel = b.FunctionParam("texel", ty.i32());
@@ -2468,8 +2480,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureDimensions_2D_ImplicitLod) {
-    auto* t =
-        b.FunctionParam("t", ty.Get<type::SampledTexture>(type::TextureDimension::k2d, ty.f32()));
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2d, ty.f32()));
     auto* func = b.Function("foo", ty.vec2<u32>());
     func->SetParams({t});
 
@@ -2503,8 +2515,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureDimensions_2D_ExplicitLod) {
-    auto* t =
-        b.FunctionParam("t", ty.Get<type::SampledTexture>(type::TextureDimension::k2d, ty.f32()));
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2d, ty.f32()));
     auto* lod = b.FunctionParam("lod", ty.i32());
     auto* func = b.Function("foo", ty.vec2<u32>());
     func->SetParams({t, lod});
@@ -2540,7 +2552,7 @@
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureDimensions_2DArray) {
     auto* t = b.FunctionParam(
-        "t", ty.Get<type::SampledTexture>(type::TextureDimension::k2dArray, ty.f32()));
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2dArray, ty.f32()));
     auto* func = b.Function("foo", ty.vec2<u32>());
     func->SetParams({t});
 
@@ -2576,7 +2588,7 @@
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureDimensions_Multisampled) {
     auto* t = b.FunctionParam(
-        "t", ty.Get<type::MultisampledTexture>(type::TextureDimension::k2d, ty.f32()));
+        "t", ty.Get<core::type::MultisampledTexture>(core::type::TextureDimension::k2d, ty.f32()));
     auto* func = b.Function("foo", ty.vec2<u32>());
     func->SetParams({t});
 
@@ -2611,7 +2623,7 @@
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureNumLayers_2DArray) {
     auto* t = b.FunctionParam(
-        "t", ty.Get<type::SampledTexture>(type::TextureDimension::k2dArray, ty.f32()));
+        "t", ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2dArray, ty.f32()));
     auto* func = b.Function("foo", ty.u32());
     func->SetParams({t});
 
@@ -2646,8 +2658,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureNumLayers_CubeArray) {
-    auto* t = b.FunctionParam(
-        "t", ty.Get<type::SampledTexture>(type::TextureDimension::kCubeArray, ty.f32()));
+    auto* t = b.FunctionParam("t", ty.Get<core::type::SampledTexture>(
+                                       core::type::TextureDimension::kCubeArray, ty.f32()));
     auto* func = b.Function("foo", ty.u32());
     func->SetParams({t});
 
@@ -2682,7 +2694,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureNumLayers_Depth2DArray) {
-    auto* t = b.FunctionParam("t", ty.Get<type::DepthTexture>(type::TextureDimension::k2dArray));
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::DepthTexture>(core::type::TextureDimension::k2dArray));
     auto* func = b.Function("foo", ty.u32());
     func->SetParams({t});
 
@@ -2717,7 +2730,8 @@
 }
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureNumLayers_DepthCubeArray) {
-    auto* t = b.FunctionParam("t", ty.Get<type::DepthTexture>(type::TextureDimension::kCubeArray));
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::DepthTexture>(core::type::TextureDimension::kCubeArray));
     auto* func = b.Function("foo", ty.u32());
     func->SetParams({t});
 
@@ -2753,9 +2767,10 @@
 
 TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureNumLayers_Storage2DArray) {
     auto format = core::TexelFormat::kR32Float;
-    auto* t = b.FunctionParam(
-        "t", ty.Get<type::StorageTexture>(type::TextureDimension::k2d, format, core::Access::kWrite,
-                                          type::StorageTexture::SubtypeFor(format, ty)));
+    auto* t =
+        b.FunctionParam("t", ty.Get<core::type::StorageTexture>(
+                                 core::type::TextureDimension::k2d, format, core::Access::kWrite,
+                                 core::type::StorageTexture::SubtypeFor(format, ty)));
     auto* func = b.Function("foo", ty.u32());
     func->SetParams({t});
 
diff --git a/src/tint/lang/spirv/writer/raise/expand_implicit_splats.cc b/src/tint/lang/spirv/writer/raise/expand_implicit_splats.cc
index c392ec5..591d240 100644
--- a/src/tint/lang/spirv/writer/raise/expand_implicit_splats.cc
+++ b/src/tint/lang/spirv/writer/raise/expand_implicit_splats.cc
@@ -40,10 +40,10 @@
         if (auto* construct = inst->As<ir::Construct>()) {
             // A vector constructor with a single scalar argument needs to be modified to replicate
             // the argument N times.
-            auto* vec = construct->Result()->Type()->As<type::Vector>();
+            auto* vec = construct->Result()->Type()->As<core::type::Vector>();
             if (vec &&  //
                 construct->Args().Length() == 1 &&
-                construct->Args()[0]->Type()->Is<type::Scalar>()) {
+                construct->Args()[0]->Type()->Is<core::type::Scalar>()) {
                 for (uint32_t i = 1; i < vec->Width(); i++) {
                     construct->AppendArg(construct->Args()[0]);
                 }
@@ -51,9 +51,9 @@
         } else if (auto* binary = inst->As<ir::Binary>()) {
             // A binary instruction that mixes vector and scalar operands needs to have the scalar
             // operand replaced with an explicit vector constructor.
-            if (binary->Result()->Type()->Is<type::Vector>()) {
-                if (binary->LHS()->Type()->Is<type::Scalar>() ||
-                    binary->RHS()->Type()->Is<type::Scalar>()) {
+            if (binary->Result()->Type()->Is<core::type::Vector>()) {
+                if (binary->LHS()->Type()->Is<core::type::Scalar>() ||
+                    binary->RHS()->Type()->Is<core::type::Scalar>()) {
                     binary_worklist.Push(binary);
                 }
             }
@@ -61,8 +61,8 @@
             // A mix builtin call that mixes vector and scalar operands needs to have the scalar
             // operand replaced with an explicit vector constructor.
             if (builtin->Func() == core::Function::kMix) {
-                if (builtin->Result()->Type()->Is<type::Vector>()) {
-                    if (builtin->Args()[2]->Type()->Is<type::Scalar>()) {
+                if (builtin->Result()->Type()->Is<core::type::Vector>()) {
+                    if (builtin->Args()[2]->Type()->Is<core::type::Scalar>()) {
                         builtin_worklist.Push(builtin);
                     }
                 }
@@ -73,7 +73,7 @@
     // Helper to expand a scalar operand of an instruction by replacing it with an explicitly
     // constructed vector that matches the result type.
     auto expand_operand = [&](ir::Instruction* inst, size_t operand_idx) {
-        auto* vec = inst->Result()->Type()->As<type::Vector>();
+        auto* vec = inst->Result()->Type()->As<core::type::Vector>();
 
         Vector<ir::Value*, 4> args;
         args.Resize(vec->Width(), inst->Operands()[operand_idx]);
@@ -89,7 +89,7 @@
         if (result_ty->is_float_vector() && binary->Kind() == ir::Binary::Kind::kMultiply) {
             // Use OpVectorTimesScalar for floating point multiply.
             auto* vts = b.Call(result_ty, ir::IntrinsicCall::Kind::kSpirvVectorTimesScalar);
-            if (binary->LHS()->Type()->Is<type::Scalar>()) {
+            if (binary->LHS()->Type()->Is<core::type::Scalar>()) {
                 vts->AppendArg(binary->RHS());
                 vts->AppendArg(binary->LHS());
             } else {
@@ -104,9 +104,9 @@
             binary->Destroy();
         } else {
             // Expand the scalar argument into an explicitly constructed vector.
-            if (binary->LHS()->Type()->Is<type::Scalar>()) {
+            if (binary->LHS()->Type()->Is<core::type::Scalar>()) {
                 expand_operand(binary, ir::Binary::kLhsOperandOffset);
-            } else if (binary->RHS()->Type()->Is<type::Scalar>()) {
+            } else if (binary->RHS()->Type()->Is<core::type::Scalar>()) {
                 expand_operand(binary, ir::Binary::kRhsOperandOffset);
             }
         }
diff --git a/src/tint/lang/spirv/writer/raise/handle_matrix_arithmetic.cc b/src/tint/lang/spirv/writer/raise/handle_matrix_arithmetic.cc
index 0a96b1c..5e49d45 100644
--- a/src/tint/lang/spirv/writer/raise/handle_matrix_arithmetic.cc
+++ b/src/tint/lang/spirv/writer/raise/handle_matrix_arithmetic.cc
@@ -40,12 +40,12 @@
         }
         if (auto* binary = inst->As<ir::Binary>()) {
             TINT_ASSERT(binary->Operands().Length() == 2);
-            if (binary->LHS()->Type()->Is<type::Matrix>() ||
-                binary->RHS()->Type()->Is<type::Matrix>()) {
+            if (binary->LHS()->Type()->Is<core::type::Matrix>() ||
+                binary->RHS()->Type()->Is<core::type::Matrix>()) {
                 binary_worklist.Push(binary);
             }
         } else if (auto* convert = inst->As<ir::Convert>()) {
-            if (convert->Result()->Type()->Is<type::Matrix>()) {
+            if (convert->Result()->Type()->Is<core::type::Matrix>()) {
                 convert_worklist.Push(convert);
             }
         }
@@ -71,7 +71,7 @@
 
         // Helper to replace the instruction with a column-wise operation.
         auto column_wise = [&](enum ir::Binary::Kind op) {
-            auto* mat = ty->As<type::Matrix>();
+            auto* mat = ty->As<core::type::Matrix>();
             Vector<ir::Value*, 4> args;
             for (uint32_t col = 0; col < mat->columns(); col++) {
                 b.InsertBefore(binary, [&] {
@@ -93,22 +93,22 @@
                 break;
             case ir::Binary::Kind::kMultiply:
                 // Select the SPIR-V intrinsic that corresponds to the operation being performed.
-                if (lhs_ty->Is<type::Matrix>()) {
-                    if (rhs_ty->Is<type::Scalar>()) {
+                if (lhs_ty->Is<core::type::Matrix>()) {
+                    if (rhs_ty->Is<core::type::Scalar>()) {
                         replace(
                             b.Call(ty, ir::IntrinsicCall::Kind::kSpirvMatrixTimesScalar, lhs, rhs));
-                    } else if (rhs_ty->Is<type::Vector>()) {
+                    } else if (rhs_ty->Is<core::type::Vector>()) {
                         replace(
                             b.Call(ty, ir::IntrinsicCall::Kind::kSpirvMatrixTimesVector, lhs, rhs));
-                    } else if (rhs_ty->Is<type::Matrix>()) {
+                    } else if (rhs_ty->Is<core::type::Matrix>()) {
                         replace(
                             b.Call(ty, ir::IntrinsicCall::Kind::kSpirvMatrixTimesMatrix, lhs, rhs));
                     }
                 } else {
-                    if (lhs_ty->Is<type::Scalar>()) {
+                    if (lhs_ty->Is<core::type::Scalar>()) {
                         replace(
                             b.Call(ty, ir::IntrinsicCall::Kind::kSpirvMatrixTimesScalar, rhs, lhs));
-                    } else if (lhs_ty->Is<type::Vector>()) {
+                    } else if (lhs_ty->Is<core::type::Vector>()) {
                         replace(
                             b.Call(ty, ir::IntrinsicCall::Kind::kSpirvVectorTimesMatrix, lhs, rhs));
                     }
@@ -124,8 +124,8 @@
     // Replace the matrix convert instructions that we found.
     for (auto* convert : convert_worklist) {
         auto* arg = convert->Args()[ir::Convert::kValueOperandOffset];
-        auto* in_mat = arg->Type()->As<type::Matrix>();
-        auto* out_mat = convert->Result()->Type()->As<type::Matrix>();
+        auto* in_mat = arg->Type()->As<core::type::Matrix>();
+        auto* out_mat = convert->Result()->Type()->As<core::type::Matrix>();
 
         // Extract and convert each column separately.
         Vector<ir::Value*, 4> args;
diff --git a/src/tint/lang/spirv/writer/raise/merge_return.cc b/src/tint/lang/spirv/writer/raise/merge_return.cc
index 15a42bb..31e4731 100644
--- a/src/tint/lang/spirv/writer/raise/merge_return.cc
+++ b/src/tint/lang/spirv/writer/raise/merge_return.cc
@@ -39,7 +39,7 @@
     ir::Builder b{*ir};
 
     /// The type manager.
-    type::Manager& ty{ir->Types()};
+    core::type::Manager& ty{ir->Types()};
 
     /// The "has not returned" flag.
     ir::Var* continue_execution = nullptr;
@@ -80,7 +80,7 @@
         fn->Block()->Prepend(continue_execution);
 
         // Create a variable to hold the return value if needed.
-        if (!fn->ReturnType()->Is<type::Void>()) {
+        if (!fn->ReturnType()->Is<core::type::Void>()) {
             return_val = b.Var("return_value", ty.ptr(function, fn->ReturnType()));
             fn->Block()->Prepend(return_val);
         }
diff --git a/src/tint/lang/spirv/writer/raise/shader_io.cc b/src/tint/lang/spirv/writer/raise/shader_io.cc
index e2a0a33..c3e3399 100644
--- a/src/tint/lang/spirv/writer/raise/shader_io.cc
+++ b/src/tint/lang/spirv/writer/raise/shader_io.cc
@@ -68,15 +68,15 @@
     void MakeStructs(ir::Var*& builtin_var,
                      ir::Var*& location_var,
                      Vector<uint32_t, 4>* indices,
-                     Vector<type::Manager::StructMemberDesc, 4>& entries,
+                     Vector<core::type::Manager::StructMemberDesc, 4>& entries,
                      core::AddressSpace addrspace,
                      core::Access access,
                      const char* name_suffix) {
         // Build separate lists of builtin and location entries and record their new indices.
         uint32_t next_builtin_idx = 0;
         uint32_t next_location_idx = 0;
-        Vector<type::Manager::StructMemberDesc, 4> builtin_members;
-        Vector<type::Manager::StructMemberDesc, 4> location_members;
+        Vector<core::type::Manager::StructMemberDesc, 4> builtin_members;
+        Vector<core::type::Manager::StructMemberDesc, 4> location_members;
         for (auto io : entries) {
             if (io.attributes.builtin) {
                 // SampleMask must be an array for Vulkan.
@@ -96,7 +96,7 @@
             auto name = ir->NameOf(func).Name() + iotype + name_suffix;
             auto* str = ty.Struct(ir->symbols.New(name + "Struct"), std::move(members));
             auto* var = b.Var(name, ty.ptr(addrspace, str, access));
-            str->SetStructFlag(type::kBlock);
+            str->SetStructFlag(core::type::kBlock);
             b.RootBlock()->Append(var);
             return var;
         };
diff --git a/src/tint/lang/spirv/writer/raise/var_for_dynamic_index.cc b/src/tint/lang/spirv/writer/raise/var_for_dynamic_index.cc
index 0fb16f0..644f05c 100644
--- a/src/tint/lang/spirv/writer/raise/var_for_dynamic_index.cc
+++ b/src/tint/lang/spirv/writer/raise/var_for_dynamic_index.cc
@@ -37,9 +37,9 @@
     // The index of the first dynamic index.
     size_t first_dynamic_index = 0;
     // The object type that corresponds to the source of the first dynamic index.
-    const type::Type* dynamic_index_source_type = nullptr;
+    const core::type::Type* dynamic_index_source_type = nullptr;
     // If the access indexes a vector, then the type of that vector
-    const type::Vector* vector_access_type = nullptr;
+    const core::type::Vector* vector_access_type = nullptr;
 };
 
 // A partial access chain that uses constant indices to get to an object that will be
@@ -79,14 +79,14 @@
 }
 
 std::optional<AccessToReplace> ShouldReplace(ir::Access* access) {
-    if (access->Result()->Type()->Is<type::Pointer>()) {
+    if (access->Result()->Type()->Is<core::type::Pointer>()) {
         // No need to modify accesses into pointer types.
         return {};
     }
 
     std::optional<AccessToReplace> result;
-    WalkAccessChain(access, [&](size_t i, ir::Value* index, const type::Type* ty) {
-        if (auto* vec = ty->As<type::Vector>()) {
+    WalkAccessChain(access, [&](size_t i, ir::Value* index, const core::type::Type* ty) {
+        if (auto* vec = ty->As<core::type::Vector>()) {
             // If we haven't found a dynamic index before the vector, then the transform doesn't
             // need to hoist the access into a var as a vector value can be dynamically indexed.
             // If we have found a dynamic index before the vector, then make a note that we're
@@ -153,7 +153,7 @@
 
         // Create a new access instruction using the local variable as the source.
         Vector<ir::Value*, 4> indices{access->Indices().Offset(to_replace.first_dynamic_index)};
-        const type::Type* access_type = access->Result()->Type();
+        const core::type::Type* access_type = access->Result()->Type();
         ir::Value* vector_index = nullptr;
         if (to_replace.vector_access_type) {
             // The old access indexed the element of a vector.
diff --git a/src/tint/lang/spirv/writer/texture_builtin_test.cc b/src/tint/lang/spirv/writer/texture_builtin_test.cc
index ab05203..ad331ac 100644
--- a/src/tint/lang/spirv/writer/texture_builtin_test.cc
+++ b/src/tint/lang/spirv/writer/texture_builtin_test.cc
@@ -50,7 +50,7 @@
     /// The texture type.
     TextureType texture_type;
     /// The dimensionality of the texture.
-    type::TextureDimension dim;
+    core::type::TextureDimension dim;
     /// The texel type of the texture.
     TestElementType texel_type;
     /// The builtin function arguments.
@@ -94,18 +94,18 @@
 
 class TextureBuiltinTest : public SpirvWriterTestWithParam<TextureBuiltinTestCase> {
   protected:
-    const type::Texture* MakeTextureType(TextureType type,
-                                         type::TextureDimension dim,
-                                         TestElementType texel_type) {
+    const core::type::Texture* MakeTextureType(TextureType type,
+                                               core::type::TextureDimension dim,
+                                               TestElementType texel_type) {
         switch (type) {
             case kSampledTexture:
-                return ty.Get<type::SampledTexture>(dim, MakeScalarType(texel_type));
+                return ty.Get<core::type::SampledTexture>(dim, MakeScalarType(texel_type));
             case kMultisampledTexture:
-                return ty.Get<type::MultisampledTexture>(dim, MakeScalarType(texel_type));
+                return ty.Get<core::type::MultisampledTexture>(dim, MakeScalarType(texel_type));
             case kDepthTexture:
-                return ty.Get<type::DepthTexture>(dim);
+                return ty.Get<core::type::DepthTexture>(dim);
             case kDepthMultisampledTexture:
-                return ty.Get<type::DepthMultisampledTexture>(dim);
+                return ty.Get<core::type::DepthMultisampledTexture>(dim);
             case kStorageTexture:
                 core::TexelFormat format;
                 switch (texel_type) {
@@ -121,8 +121,9 @@
                     default:
                         return nullptr;
                 }
-                return ty.Get<type::StorageTexture>(dim, format, core::Access::kWrite,
-                                                    type::StorageTexture::SubtypeFor(format, ty));
+                return ty.Get<core::type::StorageTexture>(
+                    dim, format, core::Access::kWrite,
+                    core::type::StorageTexture::SubtypeFor(format, ty));
         }
         return nullptr;
     }
@@ -180,7 +181,7 @@
                 mod.SetName(value, arg.name);
             }
             auto* result = b.Call(result_ty, function, std::move(args));
-            if (result_ty->Is<type::Void>()) {
+            if (result_ty->Is<core::type::Void>()) {
                 b.Return(func);
             } else {
                 b.Return(func, result);
@@ -208,7 +209,7 @@
     testing::Values(
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k1d,
+            core::type::TextureDimension::k1d,
             /* texel type */ kF32,
             {{"coord", 1, kF32}},
             {"result", 4, kF32},
@@ -219,7 +220,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kF32,
             {{"coords", 2, kF32}},
             {"result", 4, kF32},
@@ -230,7 +231,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"offset", 2, kI32}},
             {"result", 4, kF32},
@@ -241,7 +242,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"array_idx", 1, kI32}},
             {"result", 4, kF32},
@@ -254,7 +255,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"array_idx", 1, kI32}, {"offset", 2, kI32}},
             {"result", 4, kF32},
@@ -267,7 +268,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k3d,
+            core::type::TextureDimension::k3d,
             /* texel type */ kF32,
             {{"coords", 3, kF32}},
             {"result", 4, kF32},
@@ -278,7 +279,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k3d,
+            core::type::TextureDimension::k3d,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"offset", 3, kI32}},
             {"result", 4, kF32},
@@ -289,7 +290,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::kCube,
+            core::type::TextureDimension::kCube,
             /* texel type */ kF32,
             {{"coords", 3, kF32}},
             {"result", 4, kF32},
@@ -300,7 +301,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::kCubeArray,
+            core::type::TextureDimension::kCubeArray,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"array_idx", 1, kI32}},
             {"result", 4, kF32},
@@ -313,7 +314,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kF32,
             {{"coords", 2, kF32}},
             {"result", 1, kF32},
@@ -325,7 +326,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"offset", 2, kI32}},
             {"result", 1, kF32},
@@ -337,7 +338,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::kCube,
+            core::type::TextureDimension::kCube,
             /* texel type */ kF32,
             {{"coords", 3, kF32}},
             {"result", 1, kF32},
@@ -349,7 +350,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"array_idx", 1, kI32}},
             {"result", 1, kF32},
@@ -363,7 +364,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"array_idx", 1, kI32}, {"offset", 2, kI32}},
             {"result", 1, kF32},
@@ -377,7 +378,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::kCubeArray,
+            core::type::TextureDimension::kCubeArray,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"array_idx", 1, kI32}},
             {"result", 1, kF32},
@@ -403,7 +404,7 @@
     testing::Values(
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"bias", 1, kF32}},
             {"result", 4, kF32},
@@ -414,7 +415,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"bias", 1, kF32}, {"offset", 2, kI32}},
             {"result", 4, kF32},
@@ -425,7 +426,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"array_idx", 1, kI32}, {"bias", 1, kF32}},
             {"result", 4, kF32},
@@ -438,7 +439,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"array_idx", 1, kI32}, {"bias", 1, kF32}, {"offset", 2, kI32}},
             {"result", 4, kF32},
@@ -451,7 +452,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k3d,
+            core::type::TextureDimension::k3d,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"bias", 1, kF32}},
             {"result", 4, kF32},
@@ -462,7 +463,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k3d,
+            core::type::TextureDimension::k3d,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"bias", 1, kF32}, {"offset", 3, kI32}},
             {"result", 4, kF32},
@@ -473,7 +474,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::kCube,
+            core::type::TextureDimension::kCube,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"bias", 1, kF32}},
             {"result", 4, kF32},
@@ -484,7 +485,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::kCubeArray,
+            core::type::TextureDimension::kCubeArray,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"array_idx", 1, kI32}, {"bias", 1, kF32}},
             {"result", 4, kF32},
@@ -510,7 +511,7 @@
     testing::Values(
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"ddx", 2, kF32}, {"ddy", 2, kF32}},
             {"result", 4, kF32},
@@ -521,7 +522,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"ddx", 2, kF32}, {"ddy", 2, kF32}, {"offset", 2, kI32}},
             {"result", 4, kF32},
@@ -532,7 +533,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"array_idx", 1, kI32}, {"ddx", 2, kF32}, {"ddy", 2, kF32}},
             {"result", 4, kF32},
@@ -545,7 +546,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             /* texel type */ kF32,
             {{"coords", 2, kF32},
              {"array_idx", 1, kI32},
@@ -562,7 +563,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k3d,
+            core::type::TextureDimension::k3d,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"ddx", 3, kF32}, {"ddy", 3, kF32}},
             {"result", 4, kF32},
@@ -573,7 +574,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k3d,
+            core::type::TextureDimension::k3d,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"ddx", 3, kF32}, {"ddy", 3, kF32}, {"offset", 3, kI32}},
             {"result", 4, kF32},
@@ -584,7 +585,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::kCube,
+            core::type::TextureDimension::kCube,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"ddx", 3, kF32}, {"ddy", 3, kF32}},
             {"result", 4, kF32},
@@ -595,7 +596,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::kCubeArray,
+            core::type::TextureDimension::kCubeArray,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"array_idx", 1, kI32}, {"ddx", 3, kF32}, {"ddy", 3, kF32}},
             {"result", 4, kF32},
@@ -621,7 +622,7 @@
     testing::Values(
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"lod", 1, kF32}},
             {"result", 4, kF32},
@@ -632,7 +633,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"lod", 1, kF32}, {"offset", 2, kI32}},
             {"result", 4, kF32},
@@ -643,7 +644,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"array_idx", 1, kI32}, {"lod", 1, kF32}},
             {"result", 4, kF32},
@@ -656,7 +657,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"array_idx", 1, kI32}, {"lod", 1, kF32}, {"offset", 2, kI32}},
             {"result", 4, kF32},
@@ -669,7 +670,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k3d,
+            core::type::TextureDimension::k3d,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"lod", 1, kF32}},
             {"result", 4, kF32},
@@ -680,7 +681,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k3d,
+            core::type::TextureDimension::k3d,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"lod", 1, kF32}, {"offset", 3, kI32}},
             {"result", 4, kF32},
@@ -691,7 +692,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::kCube,
+            core::type::TextureDimension::kCube,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"lod", 1, kF32}},
             {"result", 4, kF32},
@@ -702,7 +703,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::kCubeArray,
+            core::type::TextureDimension::kCubeArray,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"array_idx", 1, kI32}, {"lod", 1, kF32}},
             {"result", 4, kF32},
@@ -715,7 +716,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"lod", 1, kI32}},
             {"result", 1, kF32},
@@ -728,7 +729,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"lod", 1, kI32}, {"offset", 2, kI32}},
             {"result", 1, kF32},
@@ -741,7 +742,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"array_idx", 1, kI32}, {"lod", 1, kI32}},
             {"result", 1, kF32},
@@ -756,7 +757,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"array_idx", 1, kI32}, {"lod", 1, kI32}, {"offset", 2, kI32}},
             {"result", 1, kF32},
@@ -771,7 +772,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::kCube,
+            core::type::TextureDimension::kCube,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"lod", 1, kI32}},
             {"result", 1, kF32},
@@ -784,7 +785,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::kCubeArray,
+            core::type::TextureDimension::kCubeArray,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"array_idx", 1, kI32}, {"lod", 1, kI32}},
             {"result", 1, kF32},
@@ -811,7 +812,7 @@
     testing::Values(
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"depth", 1, kF32}},
             {"result", 1, kF32},
@@ -822,7 +823,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"depth", 1, kF32}, {"offset", 2, kI32}},
             {"result", 1, kF32},
@@ -833,7 +834,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"array_idx", 1, kI32}, {"depth", 1, kF32}},
             {"result", 1, kF32},
@@ -846,7 +847,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"array_idx", 1, kI32}, {"depth", 1, kF32}, {"offset", 2, kI32}},
             {"result", 1, kF32},
@@ -859,7 +860,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::kCube,
+            core::type::TextureDimension::kCube,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"depth", 1, kF32}},
             {"result", 1, kF32},
@@ -870,7 +871,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::kCubeArray,
+            core::type::TextureDimension::kCubeArray,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"array_idx", 1, kI32}, {"depth", 1, kF32}},
             {"result", 1, kF32},
@@ -896,7 +897,7 @@
     testing::Values(
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"depth_l0", 1, kF32}},
             {"result", 1, kF32},
@@ -907,7 +908,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"depth_l0", 1, kF32}, {"offset", 2, kI32}},
             {"result", 1, kF32},
@@ -919,7 +920,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"array_idx", 1, kI32}, {"depth_l0", 1, kF32}},
             {"result", 1, kF32},
@@ -932,7 +933,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             /* texel type */ kF32,
             {{"coords", 2, kF32},
              {"array_idx", 1, kI32},
@@ -949,7 +950,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::kCube,
+            core::type::TextureDimension::kCube,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"depth_l0", 1, kF32}},
             {"result", 1, kF32},
@@ -960,7 +961,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::kCubeArray,
+            core::type::TextureDimension::kCubeArray,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"array_idx", 1, kI32}, {"depth_l0", 1, kF32}},
             {"result", 1, kF32},
@@ -986,7 +987,7 @@
     testing::Values(
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kF32,
             {{"coords", 2, kF32}},
             {"result", 4, kF32},
@@ -997,7 +998,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"offset", 2, kI32}},
             {"result", 4, kF32},
@@ -1008,7 +1009,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"array_idx", 1, kI32}},
             {"result", 4, kF32},
@@ -1021,7 +1022,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"array_idx", 1, kI32}, {"offset", 2, kI32}},
             {"result", 4, kF32},
@@ -1034,7 +1035,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::kCube,
+            core::type::TextureDimension::kCube,
             /* texel type */ kF32,
             {{"coords", 3, kF32}},
             {"result", 4, kF32},
@@ -1045,7 +1046,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::kCubeArray,
+            core::type::TextureDimension::kCubeArray,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"array_idx", 1, kI32}},
             {"result", 4, kF32},
@@ -1058,7 +1059,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kF32,
             {{"coords", 2, kF32}},
             {"result", 4, kF32},
@@ -1069,7 +1070,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"offset", 2, kI32}},
             {"result", 4, kF32},
@@ -1080,7 +1081,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::kCube,
+            core::type::TextureDimension::kCube,
             /* texel type */ kF32,
             {{"coords", 3, kF32}},
             {"result", 4, kF32},
@@ -1091,7 +1092,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"array_idx", 1, kI32}},
             {"result", 4, kF32},
@@ -1104,7 +1105,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"array_idx", 1, kI32}, {"offset", 2, kI32}},
             {"result", 4, kF32},
@@ -1117,7 +1118,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::kCubeArray,
+            core::type::TextureDimension::kCubeArray,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"array_idx", 1, kI32}},
             {"result", 4, kF32},
@@ -1132,7 +1133,7 @@
         // Test some textures with integer texel types.
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kI32,
             {{"coords", 2, kF32}},
             {"result", 4, kI32},
@@ -1143,7 +1144,7 @@
         },
         TextureBuiltinTestCase{
             kSampledTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kU32,
             {{"coords", 2, kF32}},
             {"result", 4, kU32},
@@ -1167,7 +1168,7 @@
     testing::Values(
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"depth", 1, kF32}},
             {"result", 4, kF32},
@@ -1178,7 +1179,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"depth", 1, kF32}, {"offset", 2, kI32}},
             {"result", 4, kF32},
@@ -1189,7 +1190,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"array_idx", 1, kI32}, {"depth", 1, kF32}},
             {"result", 4, kF32},
@@ -1202,7 +1203,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             /* texel type */ kF32,
             {{"coords", 2, kF32}, {"array_idx", 1, kI32}, {"depth", 1, kF32}, {"offset", 2, kI32}},
             {"result", 4, kF32},
@@ -1215,7 +1216,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::kCube,
+            core::type::TextureDimension::kCube,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"depth", 1, kF32}},
             {"result", 4, kF32},
@@ -1226,7 +1227,7 @@
         },
         TextureBuiltinTestCase{
             kDepthTexture,
-            type::TextureDimension::kCubeArray,
+            core::type::TextureDimension::kCubeArray,
             /* texel type */ kF32,
             {{"coords", 3, kF32}, {"array_idx", 1, kI32}, {"depth", 1, kF32}},
             {"result", 4, kF32},
@@ -1251,7 +1252,7 @@
                          testing::Values(
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::k1d,
+                                 core::type::TextureDimension::k1d,
                                  /* texel type */ kF32,
                                  {{"coord", 1, kI32}, {"lod", 1, kI32}},
                                  {"result", 4, kF32},
@@ -1261,7 +1262,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  /* texel type */ kF32,
                                  {{"coords", 2, kI32}, {"lod", 1, kI32}},
                                  {"result", 4, kF32},
@@ -1271,7 +1272,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::k2dArray,
+                                 core::type::TextureDimension::k2dArray,
                                  /* texel type */ kF32,
                                  {{"coords", 2, kI32}, {"array_idx", 1, kI32}, {"lod", 1, kI32}},
                                  {"result", 4, kF32},
@@ -1282,7 +1283,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::k3d,
+                                 core::type::TextureDimension::k3d,
                                  /* texel type */ kF32,
                                  {{"coords", 3, kI32}, {"lod", 1, kI32}},
                                  {"result", 4, kF32},
@@ -1292,7 +1293,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kMultisampledTexture,
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  /* texel type */ kF32,
                                  {{"coords", 2, kI32}, {"sample_idx", 1, kI32}},
                                  {"result", 4, kF32},
@@ -1302,7 +1303,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kDepthTexture,
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  /* texel type */ kF32,
                                  {{"coords", 2, kI32}, {"lod", 1, kI32}},
                                  {"result", 1, kF32},
@@ -1313,7 +1314,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kDepthTexture,
-                                 type::TextureDimension::k2dArray,
+                                 core::type::TextureDimension::k2dArray,
                                  /* texel type */ kF32,
                                  {{"coords", 2, kI32}, {"array_idx", 1, kI32}, {"lod", 1, kI32}},
                                  {"result", 1, kF32},
@@ -1325,7 +1326,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kDepthMultisampledTexture,
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  /* texel type */ kF32,
                                  {{"coords", 3, kI32}, {"sample_idx", 1, kI32}},
                                  {"result", 1, kF32},
@@ -1338,7 +1339,7 @@
                              // Test some textures with integer texel types.
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  /* texel type */ kI32,
                                  {{"coords", 2, kI32}, {"lod", 1, kI32}},
                                  {"result", 4, kI32},
@@ -1348,7 +1349,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  /* texel type */ kU32,
                                  {{"coords", 2, kI32}, {"lod", 1, kI32}},
                                  {"result", 4, kU32},
@@ -1370,7 +1371,7 @@
                          testing::Values(
                              TextureBuiltinTestCase{
                                  kStorageTexture,
-                                 type::TextureDimension::k1d,
+                                 core::type::TextureDimension::k1d,
                                  /* texel type */ kF32,
                                  {{"coord", 1, kI32}, {"texel", 4, kF32}},
                                  {},
@@ -1380,7 +1381,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kStorageTexture,
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  /* texel type */ kF32,
                                  {{"coords", 2, kI32}, {"texel", 4, kF32}},
                                  {},
@@ -1390,7 +1391,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kStorageTexture,
-                                 type::TextureDimension::k2dArray,
+                                 core::type::TextureDimension::k2dArray,
                                  /* texel type */ kF32,
                                  {{"coords", 2, kI32}, {"array_idx", 1, kI32}, {"texel", 4, kF32}},
                                  {},
@@ -1401,7 +1402,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kStorageTexture,
-                                 type::TextureDimension::k3d,
+                                 core::type::TextureDimension::k3d,
                                  /* texel type */ kF32,
                                  {{"coords", 3, kI32}, {"texel", 4, kF32}},
                                  {},
@@ -1413,7 +1414,7 @@
                              // Test some textures with integer texel types.
                              TextureBuiltinTestCase{
                                  kStorageTexture,
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  /* texel type */ kI32,
                                  {{"coords", 2, kI32}, {"texel", 4, kI32}},
                                  {},
@@ -1423,7 +1424,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kStorageTexture,
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  /* texel type */ kU32,
                                  {{"coords", 2, kI32}, {"texel", 4, kU32}},
                                  {},
@@ -1446,7 +1447,7 @@
                              // 1D implicit Lod.
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::k1d,
+                                 core::type::TextureDimension::k1d,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 1, kU32},
@@ -1454,7 +1455,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kStorageTexture,
-                                 type::TextureDimension::k1d,
+                                 core::type::TextureDimension::k1d,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 1, kU32},
@@ -1464,7 +1465,7 @@
                              // 1D explicit Lod.
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::k1d,
+                                 core::type::TextureDimension::k1d,
                                  /* texel type */ kF32,
                                  {{"lod", 1, kU32}},
                                  {"result", 1, kU32},
@@ -1474,7 +1475,7 @@
                              // 2D implicit Lod.
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 2, kU32},
@@ -1482,7 +1483,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::k2dArray,
+                                 core::type::TextureDimension::k2dArray,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 2, kU32},
@@ -1493,7 +1494,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::kCube,
+                                 core::type::TextureDimension::kCube,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 2, kU32},
@@ -1501,7 +1502,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::kCubeArray,
+                                 core::type::TextureDimension::kCubeArray,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 2, kU32},
@@ -1512,7 +1513,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kMultisampledTexture,
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 2, kU32},
@@ -1520,7 +1521,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kDepthTexture,
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 2, kU32},
@@ -1528,7 +1529,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kDepthTexture,
-                                 type::TextureDimension::k2dArray,
+                                 core::type::TextureDimension::k2dArray,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 2, kU32},
@@ -1539,7 +1540,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kDepthTexture,
-                                 type::TextureDimension::kCube,
+                                 core::type::TextureDimension::kCube,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 2, kU32},
@@ -1547,7 +1548,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kDepthTexture,
-                                 type::TextureDimension::kCubeArray,
+                                 core::type::TextureDimension::kCubeArray,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 2, kU32},
@@ -1558,7 +1559,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kDepthMultisampledTexture,
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 2, kU32},
@@ -1566,7 +1567,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kStorageTexture,
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 2, kU32},
@@ -1574,7 +1575,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kStorageTexture,
-                                 type::TextureDimension::k2dArray,
+                                 core::type::TextureDimension::k2dArray,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 2, kU32},
@@ -1587,7 +1588,7 @@
                              // 2D explicit Lod.
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  /* texel type */ kF32,
                                  {{"lod", 1, kU32}},
                                  {"result", 2, kU32},
@@ -1595,7 +1596,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::k2dArray,
+                                 core::type::TextureDimension::k2dArray,
                                  /* texel type */ kF32,
                                  {{"lod", 1, kU32}},
                                  {"result", 2, kU32},
@@ -1606,7 +1607,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::kCube,
+                                 core::type::TextureDimension::kCube,
                                  /* texel type */ kF32,
                                  {{"lod", 1, kU32}},
                                  {"result", 2, kU32},
@@ -1614,7 +1615,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::kCubeArray,
+                                 core::type::TextureDimension::kCubeArray,
                                  /* texel type */ kF32,
                                  {{"lod", 1, kU32}},
                                  {"result", 2, kU32},
@@ -1625,7 +1626,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kDepthTexture,
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  /* texel type */ kF32,
                                  {{"lod", 1, kU32}},
                                  {"result", 2, kU32},
@@ -1633,7 +1634,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kDepthTexture,
-                                 type::TextureDimension::k2dArray,
+                                 core::type::TextureDimension::k2dArray,
                                  /* texel type */ kF32,
                                  {{"lod", 1, kU32}},
                                  {"result", 2, kU32},
@@ -1644,7 +1645,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kDepthTexture,
-                                 type::TextureDimension::kCube,
+                                 core::type::TextureDimension::kCube,
                                  /* texel type */ kF32,
                                  {{"lod", 1, kU32}},
                                  {"result", 2, kU32},
@@ -1652,7 +1653,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kDepthTexture,
-                                 type::TextureDimension::kCubeArray,
+                                 core::type::TextureDimension::kCubeArray,
                                  /* texel type */ kF32,
                                  {{"lod", 1, kU32}},
                                  {"result", 2, kU32},
@@ -1665,7 +1666,7 @@
                              // 3D implicit lod.
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::k3d,
+                                 core::type::TextureDimension::k3d,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 3, kU32},
@@ -1675,7 +1676,7 @@
                              // 3D explicit lod.
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::k3d,
+                                 core::type::TextureDimension::k3d,
                                  /* texel type */ kF32,
                                  {{"lod", 1, kU32}},
                                  {"result", 3, kU32},
@@ -1695,7 +1696,7 @@
                          testing::Values(
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::k2dArray,
+                                 core::type::TextureDimension::k2dArray,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 1, kU32},
@@ -1706,7 +1707,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::kCubeArray,
+                                 core::type::TextureDimension::kCubeArray,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 1, kU32},
@@ -1717,7 +1718,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kDepthTexture,
-                                 type::TextureDimension::k2dArray,
+                                 core::type::TextureDimension::k2dArray,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 1, kU32},
@@ -1728,7 +1729,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kDepthTexture,
-                                 type::TextureDimension::kCubeArray,
+                                 core::type::TextureDimension::kCubeArray,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 1, kU32},
@@ -1739,7 +1740,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kStorageTexture,
-                                 type::TextureDimension::k2dArray,
+                                 core::type::TextureDimension::k2dArray,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 1, kU32},
@@ -1762,7 +1763,7 @@
                          testing::Values(
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::k1d,
+                                 core::type::TextureDimension::k1d,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 1, kI32},
@@ -1770,7 +1771,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 1, kI32},
@@ -1778,7 +1779,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::k2dArray,
+                                 core::type::TextureDimension::k2dArray,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 1, kI32},
@@ -1786,7 +1787,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::k3d,
+                                 core::type::TextureDimension::k3d,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 1, kI32},
@@ -1794,7 +1795,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::kCube,
+                                 core::type::TextureDimension::kCube,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 1, kI32},
@@ -1802,7 +1803,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kSampledTexture,
-                                 type::TextureDimension::kCubeArray,
+                                 core::type::TextureDimension::kCubeArray,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 1, kI32},
@@ -1810,7 +1811,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kDepthTexture,
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 1, kI32},
@@ -1818,7 +1819,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kDepthTexture,
-                                 type::TextureDimension::k2dArray,
+                                 core::type::TextureDimension::k2dArray,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 1, kI32},
@@ -1826,7 +1827,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kDepthTexture,
-                                 type::TextureDimension::kCube,
+                                 core::type::TextureDimension::kCube,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 1, kI32},
@@ -1834,7 +1835,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kDepthTexture,
-                                 type::TextureDimension::kCubeArray,
+                                 core::type::TextureDimension::kCubeArray,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 1, kI32},
@@ -1854,7 +1855,7 @@
                          testing::Values(
                              TextureBuiltinTestCase{
                                  kMultisampledTexture,
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 1, kU32},
@@ -1862,7 +1863,7 @@
                              },
                              TextureBuiltinTestCase{
                                  kDepthMultisampledTexture,
-                                 type::TextureDimension::k2d,
+                                 core::type::TextureDimension::k2d,
                                  /* texel type */ kF32,
                                  {},
                                  {"result", 1, kU32},
@@ -1875,7 +1876,8 @@
 ////////////////////////////////////////////////////////////////
 
 TEST_F(SpirvWriterTest, TextureSampleBaseClampToEdge_2d_f32) {
-    auto* texture_ty = ty.Get<type::SampledTexture>(type::TextureDimension::k2d, ty.f32());
+    auto* texture_ty =
+        ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2d, ty.f32());
 
     Vector<ir::FunctionParam*, 4> args;
     args.Push(b.FunctionParam("texture", texture_ty));
@@ -1910,9 +1912,9 @@
 
 TEST_F(SpirvWriterTest, Bgra8Unorm_textureStore) {
     auto format = core::TexelFormat::kBgra8Unorm;
-    auto* texture_ty =
-        ty.Get<type::StorageTexture>(type::TextureDimension::k2d, format, core::Access::kWrite,
-                                     type::StorageTexture::SubtypeFor(format, ty));
+    auto* texture_ty = ty.Get<core::type::StorageTexture>(
+        core::type::TextureDimension::k2d, format, core::Access::kWrite,
+        core::type::StorageTexture::SubtypeFor(format, ty));
 
     auto* texture = b.FunctionParam("texture", texture_ty);
     auto* coords = b.FunctionParam("coords", ty.vec2<u32>());
diff --git a/src/tint/lang/spirv/writer/type_test.cc b/src/tint/lang/spirv/writer/type_test.cc
index 3192988..4c18e10 100644
--- a/src/tint/lang/spirv/writer/type_test.cc
+++ b/src/tint/lang/spirv/writer/type_test.cc
@@ -229,7 +229,7 @@
     ASSERT_TRUE(Generate()) << Error() << output_;
 }
 
-using Dim = type::TextureDimension;
+using Dim = core::type::TextureDimension;
 struct TextureCase {
     std::string result;
     Dim dim;
@@ -239,7 +239,7 @@
 using Type_SampledTexture = SpirvWriterTestWithParam<TextureCase>;
 TEST_P(Type_SampledTexture, Emit) {
     auto params = GetParam();
-    writer_.Type(ty.Get<type::SampledTexture>(params.dim, MakeScalarType(params.format)));
+    writer_.Type(ty.Get<core::type::SampledTexture>(params.dim, MakeScalarType(params.format)));
 
     ASSERT_TRUE(Generate()) << Error() << output_;
     EXPECT_INST(params.result);
@@ -270,7 +270,8 @@
 using Type_MultisampledTexture = SpirvWriterTestWithParam<TextureCase>;
 TEST_P(Type_MultisampledTexture, Emit) {
     auto params = GetParam();
-    writer_.Type(ty.Get<type::MultisampledTexture>(params.dim, MakeScalarType(params.format)));
+    writer_.Type(
+        ty.Get<core::type::MultisampledTexture>(params.dim, MakeScalarType(params.format)));
 
     ASSERT_TRUE(Generate()) << Error() << output_;
     EXPECT_INST(params.result);
@@ -285,7 +286,7 @@
 using Type_DepthTexture = SpirvWriterTestWithParam<TextureCase>;
 TEST_P(Type_DepthTexture, Emit) {
     auto params = GetParam();
-    writer_.Type(ty.Get<type::DepthTexture>(params.dim));
+    writer_.Type(ty.Get<core::type::DepthTexture>(params.dim));
 
     ASSERT_TRUE(Generate()) << Error() << output_;
     EXPECT_INST(params.result);
@@ -299,8 +300,8 @@
                     TextureCase{"%1 = OpTypeImage %float Cube 0 1 0 1 Unknown", Dim::kCubeArray}));
 
 TEST_F(SpirvWriterTest, Type_DepthTexture_DedupWithSampledTexture) {
-    writer_.Type(ty.Get<type::SampledTexture>(Dim::k2d, ty.f32()));
-    writer_.Type(ty.Get<type::DepthTexture>(Dim::k2d));
+    writer_.Type(ty.Get<core::type::SampledTexture>(Dim::k2d, ty.f32()));
+    writer_.Type(ty.Get<core::type::DepthTexture>(Dim::k2d));
 
     ASSERT_TRUE(Generate()) << Error() << output_;
     EXPECT_EQ(DumpTypes(), R"(%2 = OpTypeFloat 32
@@ -311,15 +312,15 @@
 }
 
 TEST_F(SpirvWriterTest, Type_DepthMultiSampledTexture) {
-    writer_.Type(ty.Get<type::DepthMultisampledTexture>(Dim::k2d));
+    writer_.Type(ty.Get<core::type::DepthMultisampledTexture>(Dim::k2d));
 
     ASSERT_TRUE(Generate()) << Error() << output_;
     EXPECT_INST("%1 = OpTypeImage %float 2D 0 0 1 1 Unknown");
 }
 
 TEST_F(SpirvWriterTest, Type_DepthMultisampledTexture_DedupWithMultisampledTexture) {
-    writer_.Type(ty.Get<type::MultisampledTexture>(Dim::k2d, ty.f32()));
-    writer_.Type(ty.Get<type::DepthMultisampledTexture>(Dim::k2d));
+    writer_.Type(ty.Get<core::type::MultisampledTexture>(Dim::k2d, ty.f32()));
+    writer_.Type(ty.Get<core::type::DepthMultisampledTexture>(Dim::k2d));
 
     ASSERT_TRUE(Generate()) << Error() << output_;
     EXPECT_EQ(DumpTypes(), R"(%2 = OpTypeFloat 32
@@ -338,9 +339,9 @@
 using Type_StorageTexture = SpirvWriterTestWithParam<StorageTextureCase>;
 TEST_P(Type_StorageTexture, Emit) {
     auto params = GetParam();
-    writer_.Type(
-        ty.Get<type::StorageTexture>(params.dim, params.format, core::Access::kWrite,
-                                     type::StorageTexture::SubtypeFor(params.format, mod.Types())));
+    writer_.Type(ty.Get<core::type::StorageTexture>(
+        params.dim, params.format, core::Access::kWrite,
+        core::type::StorageTexture::SubtypeFor(params.format, mod.Types())));
 
     ASSERT_TRUE(Generate()) << Error() << output_;
     EXPECT_INST(params.result);
diff --git a/src/tint/lang/spirv/writer/var_test.cc b/src/tint/lang/spirv/writer/var_test.cc
index 5516ace..cc91515 100644
--- a/src/tint/lang/spirv/writer/var_test.cc
+++ b/src/tint/lang/spirv/writer/var_test.cc
@@ -325,9 +325,10 @@
 }
 
 TEST_F(SpirvWriterTest, TextureVar) {
-    auto* v = b.Var("v", ty.ptr(core::AddressSpace::kHandle,
-                                ty.Get<type::SampledTexture>(type::TextureDimension::k2d, ty.f32()),
-                                core::Access::kRead));
+    auto* v = b.Var(
+        "v", ty.ptr(core::AddressSpace::kHandle,
+                    ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2d, ty.f32()),
+                    core::Access::kRead));
     v->SetBindingPoint(0, 0);
     b.RootBlock()->Append(v);
 
@@ -344,9 +345,10 @@
 }
 
 TEST_F(SpirvWriterTest, TextureVar_Load) {
-    auto* v = b.Var("v", ty.ptr(core::AddressSpace::kHandle,
-                                ty.Get<type::SampledTexture>(type::TextureDimension::k2d, ty.f32()),
-                                core::Access::kRead));
+    auto* v = b.Var(
+        "v", ty.ptr(core::AddressSpace::kHandle,
+                    ty.Get<core::type::SampledTexture>(core::type::TextureDimension::k2d, ty.f32()),
+                    core::Access::kRead));
     v->SetBindingPoint(0, 0);
     b.RootBlock()->Append(v);
 
diff --git a/src/tint/lang/wgsl/ast/builder.h b/src/tint/lang/wgsl/ast/builder.h
index def0930..fd9ec3a 100644
--- a/src/tint/lang/wgsl/ast/builder.h
+++ b/src/tint/lang/wgsl/ast/builder.h
@@ -1127,16 +1127,18 @@
 
         /// @param kind the kind of sampler
         /// @returns the sampler
-        ast::Type sampler(type::SamplerKind kind) const { return sampler(builder->source_, kind); }
+        ast::Type sampler(core::type::SamplerKind kind) const {
+            return sampler(builder->source_, kind);
+        }
 
         /// @param source the Source of the node
         /// @param kind the kind of sampler
         /// @returns the sampler
-        ast::Type sampler(const Source& source, type::SamplerKind kind) const {
+        ast::Type sampler(const Source& source, core::type::SamplerKind kind) const {
             switch (kind) {
-                case type::SamplerKind::kSampler:
+                case core::type::SamplerKind::kSampler:
                     return (*this)(source, "sampler");
-                case type::SamplerKind::kComparisonSampler:
+                case core::type::SamplerKind::kComparisonSampler:
                     return (*this)(source, "sampler_comparison");
             }
             TINT_ICE() << "invalid sampler kind " << kind;
@@ -1145,22 +1147,22 @@
 
         /// @param dims the dimensionality of the texture
         /// @returns the depth texture
-        ast::Type depth_texture(type::TextureDimension dims) const {
+        ast::Type depth_texture(core::type::TextureDimension dims) const {
             return depth_texture(builder->source_, dims);
         }
 
         /// @param source the Source of the node
         /// @param dims the dimensionality of the texture
         /// @returns the depth texture
-        ast::Type depth_texture(const Source& source, type::TextureDimension dims) const {
+        ast::Type depth_texture(const Source& source, core::type::TextureDimension dims) const {
             switch (dims) {
-                case type::TextureDimension::k2d:
+                case core::type::TextureDimension::k2d:
                     return (*this)(source, "texture_depth_2d");
-                case type::TextureDimension::k2dArray:
+                case core::type::TextureDimension::k2dArray:
                     return (*this)(source, "texture_depth_2d_array");
-                case type::TextureDimension::kCube:
+                case core::type::TextureDimension::kCube:
                     return (*this)(source, "texture_depth_cube");
-                case type::TextureDimension::kCubeArray:
+                case core::type::TextureDimension::kCubeArray:
                     return (*this)(source, "texture_depth_cube_array");
                 default:
                     break;
@@ -1171,7 +1173,7 @@
 
         /// @param dims the dimensionality of the texture
         /// @returns the multisampled depth texture
-        ast::Type depth_multisampled_texture(type::TextureDimension dims) const {
+        ast::Type depth_multisampled_texture(core::type::TextureDimension dims) const {
             return depth_multisampled_texture(builder->source_, dims);
         }
 
@@ -1179,8 +1181,8 @@
         /// @param dims the dimensionality of the texture
         /// @returns the multisampled depth texture
         ast::Type depth_multisampled_texture(const Source& source,
-                                             type::TextureDimension dims) const {
-            if (dims == type::TextureDimension::k2d) {
+                                             core::type::TextureDimension dims) const {
+            if (dims == core::type::TextureDimension::k2d) {
                 return (*this)(source, "texture_depth_multisampled_2d");
             }
             TINT_ICE() << "invalid depth_multisampled_texture dimensions: " << dims;
@@ -1190,7 +1192,7 @@
         /// @param dims the dimensionality of the texture
         /// @param subtype the texture subtype.
         /// @returns the sampled texture
-        ast::Type sampled_texture(type::TextureDimension dims, ast::Type subtype) const {
+        ast::Type sampled_texture(core::type::TextureDimension dims, ast::Type subtype) const {
             return sampled_texture(builder->source_, dims, subtype);
         }
 
@@ -1199,20 +1201,20 @@
         /// @param subtype the texture subtype.
         /// @returns the sampled texture
         ast::Type sampled_texture(const Source& source,
-                                  type::TextureDimension dims,
+                                  core::type::TextureDimension dims,
                                   ast::Type subtype) const {
             switch (dims) {
-                case type::TextureDimension::k1d:
+                case core::type::TextureDimension::k1d:
                     return (*this)(source, "texture_1d", subtype);
-                case type::TextureDimension::k2d:
+                case core::type::TextureDimension::k2d:
                     return (*this)(source, "texture_2d", subtype);
-                case type::TextureDimension::k3d:
+                case core::type::TextureDimension::k3d:
                     return (*this)(source, "texture_3d", subtype);
-                case type::TextureDimension::k2dArray:
+                case core::type::TextureDimension::k2dArray:
                     return (*this)(source, "texture_2d_array", subtype);
-                case type::TextureDimension::kCube:
+                case core::type::TextureDimension::kCube:
                     return (*this)(source, "texture_cube", subtype);
-                case type::TextureDimension::kCubeArray:
+                case core::type::TextureDimension::kCubeArray:
                     return (*this)(source, "texture_cube_array", subtype);
                 default:
                     break;
@@ -1224,7 +1226,7 @@
         /// @param dims the dimensionality of the texture
         /// @param subtype the texture subtype.
         /// @returns the multisampled texture
-        ast::Type multisampled_texture(type::TextureDimension dims, ast::Type subtype) const {
+        ast::Type multisampled_texture(core::type::TextureDimension dims, ast::Type subtype) const {
             return multisampled_texture(builder->source_, dims, subtype);
         }
 
@@ -1233,9 +1235,9 @@
         /// @param subtype the texture subtype.
         /// @returns the multisampled texture
         ast::Type multisampled_texture(const Source& source,
-                                       type::TextureDimension dims,
+                                       core::type::TextureDimension dims,
                                        ast::Type subtype) const {
-            if (dims == type::TextureDimension::k2d) {
+            if (dims == core::type::TextureDimension::k2d) {
                 return (*this)(source, "texture_multisampled_2d", subtype);
             }
             TINT_ICE() << "invalid multisampled_texture dimensions: " << dims;
@@ -1246,7 +1248,7 @@
         /// @param format the texel format of the texture
         /// @param access the access control of the texture
         /// @returns the storage texture
-        ast::Type storage_texture(type::TextureDimension dims,
+        ast::Type storage_texture(core::type::TextureDimension dims,
                                   core::TexelFormat format,
                                   core::Access access) const {
             return storage_texture(builder->source_, dims, format, access);
@@ -1258,17 +1260,17 @@
         /// @param access the access control of the texture
         /// @returns the storage texture
         ast::Type storage_texture(const Source& source,
-                                  type::TextureDimension dims,
+                                  core::type::TextureDimension dims,
                                   core::TexelFormat format,
                                   core::Access access) const {
             switch (dims) {
-                case type::TextureDimension::k1d:
+                case core::type::TextureDimension::k1d:
                     return (*this)(source, "texture_storage_1d", format, access);
-                case type::TextureDimension::k2d:
+                case core::type::TextureDimension::k2d:
                     return (*this)(source, "texture_storage_2d", format, access);
-                case type::TextureDimension::k2dArray:
+                case core::type::TextureDimension::k2dArray:
                     return (*this)(source, "texture_storage_2d_array", format, access);
-                case type::TextureDimension::k3d:
+                case core::type::TextureDimension::k3d:
                     return (*this)(source, "texture_storage_3d", format, access);
                 default:
                     break;
diff --git a/src/tint/lang/wgsl/ast/builtin_texture_helper_test.cc b/src/tint/lang/wgsl/ast/builtin_texture_helper_test.cc
index 4be2f20..3633616 100644
--- a/src/tint/lang/wgsl/ast/builtin_texture_helper_test.cc
+++ b/src/tint/lang/wgsl/ast/builtin_texture_helper_test.cc
@@ -68,8 +68,8 @@
 TextureOverloadCase::TextureOverloadCase(ValidTextureOverload o,
                                          const char* desc,
                                          TextureKind tk,
-                                         type::SamplerKind sk,
-                                         type::TextureDimension dims,
+                                         core::type::SamplerKind sk,
+                                         core::type::TextureDimension dims,
                                          TextureDataType datatype,
                                          const char* f,
                                          std::function<Args(ProgramBuilder*)> a,
@@ -86,7 +86,7 @@
 TextureOverloadCase::TextureOverloadCase(ValidTextureOverload o,
                                          const char* desc,
                                          TextureKind tk,
-                                         type::TextureDimension dims,
+                                         core::type::TextureDimension dims,
                                          TextureDataType datatype,
                                          const char* f,
                                          std::function<Args(ProgramBuilder*)> a,
@@ -103,7 +103,7 @@
                                          const char* d,
                                          tint::core::Access acc,
                                          tint::core::TexelFormat fmt,
-                                         type::TextureDimension dims,
+                                         core::type::TextureDimension dims,
                                          TextureDataType datatype,
                                          const char* f,
                                          std::function<Args(ProgramBuilder*)> a,
@@ -201,8 +201,8 @@
             ValidTextureOverload::kDimensions1d,
             "textureDimensions(t : texture_1d<f32>) -> u32",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k1d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k1d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -212,8 +212,8 @@
             ValidTextureOverload::kDimensions2d,
             "textureDimensions(t : texture_2d<f32>) -> vec2<u32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -224,8 +224,8 @@
             "textureDimensions(t     : texture_2d<f32>,\n"
             "                  level : i32) -> vec2<u32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName, 1_i); },
@@ -235,8 +235,8 @@
             ValidTextureOverload::kDimensions2dArray,
             "textureDimensions(t : texture_2d_array<f32>) -> vec2<u32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -247,8 +247,8 @@
             "textureDimensions(t     : texture_2d_array<f32>,\n"
             "                  level : i32) -> vec2<u32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName, 1_i); },
@@ -258,8 +258,8 @@
             ValidTextureOverload::kDimensions3d,
             "textureDimensions(t : texture_3d<f32>) -> vec3<u32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k3d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -270,8 +270,8 @@
             "textureDimensions(t     : texture_3d<f32>,\n"
             "                  level : i32) -> vec3<u32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k3d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName, 1_i); },
@@ -281,8 +281,8 @@
             ValidTextureOverload::kDimensionsCube,
             "textureDimensions(t : texture_cube<f32>) -> vec2<u32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCube,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -293,8 +293,8 @@
             "textureDimensions(t     : texture_cube<f32>,\n"
             "                  level : i32) -> vec2<u32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCube,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName, 1_i); },
@@ -304,8 +304,8 @@
             ValidTextureOverload::kDimensionsCubeArray,
             "textureDimensions(t : texture_cube_array<f32>) -> vec2<u32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCubeArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -316,8 +316,8 @@
             "textureDimensions(t     : texture_cube_array<f32>,\n"
             "                  level : i32) -> vec2<u32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCubeArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName, 1_i); },
@@ -327,8 +327,8 @@
             ValidTextureOverload::kDimensionsMultisampled2d,
             "textureDimensions(t : texture_multisampled_2d<f32>)-> vec2<u32>",
             TextureKind::kMultisampled,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -338,8 +338,8 @@
             ValidTextureOverload::kDimensionsDepth2d,
             "textureDimensions(t : texture_depth_2d) -> vec2<u32>",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -350,8 +350,8 @@
             "textureDimensions(t     : texture_depth_2d,\n"
             "                  level : i32) -> vec2<u32>",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName, 1_i); },
@@ -361,8 +361,8 @@
             ValidTextureOverload::kDimensionsDepth2dArray,
             "textureDimensions(t : texture_depth_2d_array) -> vec2<u32>",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -373,8 +373,8 @@
             "textureDimensions(t     : texture_depth_2d_array,\n"
             "                  level : i32) -> vec2<u32>",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName, 1_i); },
@@ -384,8 +384,8 @@
             ValidTextureOverload::kDimensionsDepthCube,
             "textureDimensions(t : texture_depth_cube) -> vec2<u32>",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCube,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -396,8 +396,8 @@
             "textureDimensions(t     : texture_depth_cube,\n"
             "                  level : i32) -> vec2<u32>",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCube,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName, 1_i); },
@@ -407,8 +407,8 @@
             ValidTextureOverload::kDimensionsDepthCubeArray,
             "textureDimensions(t : texture_depth_cube_array) -> vec2<u32>",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCubeArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -419,8 +419,8 @@
             "textureDimensions(t     : texture_depth_cube_array,\n"
             "                  level : i32) -> vec2<u32>",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCubeArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName, 1_i); },
@@ -430,8 +430,8 @@
             ValidTextureOverload::kDimensionsDepthMultisampled2d,
             "textureDimensions(t : texture_depth_multisampled_2d) -> vec2<u32>",
             TextureKind::kDepthMultisampled,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -442,7 +442,7 @@
             "textureDimensions(t : texture_storage_1d<rgba32float>) -> u32",
             tint::core::Access::kWrite,
             tint::core::TexelFormat::kRgba32Float,
-            type::TextureDimension::k1d,
+            core::type::TextureDimension::k1d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -453,7 +453,7 @@
             "textureDimensions(t : texture_storage_2d<rgba32float>) -> vec2<u32>",
             tint::core::Access::kWrite,
             tint::core::TexelFormat::kRgba32Float,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -464,7 +464,7 @@
             "textureDimensions(t : texture_storage_2d_array<rgba32float>) -> vec2<u32>",
             tint::core::Access::kWrite,
             tint::core::TexelFormat::kRgba32Float,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -475,7 +475,7 @@
             "textureDimensions(t : texture_storage_3d<rgba32float>) -> vec3<u32>",
             tint::core::Access::kWrite,
             tint::core::TexelFormat::kRgba32Float,
-            type::TextureDimension::k3d,
+            core::type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -489,8 +489,8 @@
             "              s         : sampler,\n"
             "              coords    : vec2<f32>) -> vec4<T>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -509,8 +509,8 @@
             "              coords    : vec2<f32>,\n"
             "              offset    : vec2<i32>) -> vec4<T>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -530,8 +530,8 @@
             "              coords      : vec2<f32>,\n"
             "              array_index : i32) -> vec4<T>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -552,8 +552,8 @@
             "              array_index : u32,\n"
             "              offset      : vec2<i32>) -> vec4<T>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -573,8 +573,8 @@
             "              s         : sampler,\n"
             "              coords    : vec3<f32>) -> vec4<T>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCube,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -593,8 +593,8 @@
             "              coords      : vec3<f32>,\n"
             "              array_index : u32) -> vec4<T>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCubeArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -612,8 +612,8 @@
             "              s      : sampler,\n"
             "              coords : vec2<f32>) -> vec4<f32>",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -630,8 +630,8 @@
             "              coords : vec2<f32>,\n"
             "              offset : vec2<i32>) -> vec4<f32>",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -649,8 +649,8 @@
             "              coords      : vec2<f32>,\n"
             "              array_index : u32) -> vec4<f32>",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -669,8 +669,8 @@
             "              array_index : i32,\n"
             "              offset      : vec2<i32>) -> vec4<f32>",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -688,8 +688,8 @@
             "              s      : sampler,\n"
             "              coords : vec3<f32>) -> vec4<f32>",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCube,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -706,8 +706,8 @@
             "              coords      : vec3<f32>,\n"
             "              array_index : u32) -> vec4<f32>",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCubeArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -725,8 +725,8 @@
             "                     coords    : vec2<f32>,\n"
             "                     depth_ref : f32) -> vec4<f32>",
             TextureKind::kDepth,
-            type::SamplerKind::kComparisonSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kComparisonSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
@@ -745,8 +745,8 @@
             "                     depth_ref : f32,\n"
             "                     offset    : vec2<i32>) -> vec4<f32>",
             TextureKind::kDepth,
-            type::SamplerKind::kComparisonSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kComparisonSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
@@ -766,8 +766,8 @@
             "                     array_index : i32,\n"
             "                     depth_ref   : f32) -> vec4<f32>",
             TextureKind::kDepth,
-            type::SamplerKind::kComparisonSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kComparisonSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
@@ -788,8 +788,8 @@
             "                     depth_ref   : f32,\n"
             "                     offset      : vec2<i32>) -> vec4<f32>",
             TextureKind::kDepth,
-            type::SamplerKind::kComparisonSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kComparisonSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
@@ -809,8 +809,8 @@
             "                     coords    : vec3<f32>,\n"
             "                     depth_ref : f32) -> vec4<f32>",
             TextureKind::kDepth,
-            type::SamplerKind::kComparisonSampler,
-            type::TextureDimension::kCube,
+            core::type::SamplerKind::kComparisonSampler,
+            core::type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
@@ -829,8 +829,8 @@
             "                     array_index : u32,\n"
             "                     depth_ref   : f32) -> vec4<f32>",
             TextureKind::kDepth,
-            type::SamplerKind::kComparisonSampler,
-            type::TextureDimension::kCubeArray,
+            core::type::SamplerKind::kComparisonSampler,
+            core::type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
@@ -846,8 +846,8 @@
             ValidTextureOverload::kNumLayers2dArray,
             "textureNumLayers(t : texture_2d_array<f32>) -> u32",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureNumLayers",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -857,8 +857,8 @@
             ValidTextureOverload::kNumLayersCubeArray,
             "textureNumLayers(t : texture_cube_array<f32>) -> u32",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCubeArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureNumLayers",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -868,8 +868,8 @@
             ValidTextureOverload::kNumLayersDepth2dArray,
             "textureNumLayers(t : texture_depth_2d_array) -> u32",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureNumLayers",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -879,8 +879,8 @@
             ValidTextureOverload::kNumLayersDepthCubeArray,
             "textureNumLayers(t : texture_depth_cube_array) -> u32",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCubeArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureNumLayers",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -891,7 +891,7 @@
             "textureNumLayers(t : texture_storage_2d_array<rgba32float>) -> u32",
             tint::core::Access::kWrite,
             tint::core::TexelFormat::kRgba32Float,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureNumLayers",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -901,8 +901,8 @@
             ValidTextureOverload::kNumLevels2d,
             "textureNumLevels(t : texture_2d<f32>) -> u32",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureNumLevels",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -912,8 +912,8 @@
             ValidTextureOverload::kNumLevels2dArray,
             "textureNumLevels(t : texture_2d_array<f32>) -> u32",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureNumLevels",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -923,8 +923,8 @@
             ValidTextureOverload::kNumLevels3d,
             "textureNumLevels(t : texture_3d<f32>) -> u32",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k3d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureNumLevels",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -934,8 +934,8 @@
             ValidTextureOverload::kNumLevelsCube,
             "textureNumLevels(t : texture_cube<f32>) -> u32",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCube,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureNumLevels",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -945,8 +945,8 @@
             ValidTextureOverload::kNumLevelsCubeArray,
             "textureNumLevels(t : texture_cube_array<f32>) -> u32",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCubeArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureNumLevels",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -956,8 +956,8 @@
             ValidTextureOverload::kNumLevelsDepth2d,
             "textureNumLevels(t : texture_depth_2d) -> u32",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureNumLevels",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -967,8 +967,8 @@
             ValidTextureOverload::kNumLevelsDepth2dArray,
             "textureNumLevels(t : texture_depth_2d_array) -> u32",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureNumLevels",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -978,8 +978,8 @@
             ValidTextureOverload::kNumLevelsDepthCube,
             "textureNumLevels(t : texture_depth_cube) -> u32",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCube,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureNumLevels",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -989,8 +989,8 @@
             ValidTextureOverload::kNumLevelsDepthCubeArray,
             "textureNumLevels(t : texture_depth_cube_array) -> u32",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCubeArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureNumLevels",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -1000,8 +1000,8 @@
             ValidTextureOverload::kNumSamplesMultisampled2d,
             "textureNumSamples(t : texture_multisampled_2d<f32>) -> u32",
             TextureKind::kMultisampled,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureNumSamples",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -1011,8 +1011,8 @@
             ValidTextureOverload::kNumSamplesDepthMultisampled2d,
             "textureNumSamples(t : texture_depth_multisampled_2d<f32>) -> u32",
             TextureKind::kMultisampled,
-            type::SamplerKind::kComparisonSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kComparisonSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureNumSamples",
             [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
@@ -1024,8 +1024,8 @@
             "              s      : sampler,\n"
             "              coords : f32) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k1d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k1d,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1041,8 +1041,8 @@
             "              s      : sampler,\n"
             "              coords : vec2<f32>) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1059,8 +1059,8 @@
             "              coords : vec2<f32>\n"
             "              offset : vec2<i32>) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1078,8 +1078,8 @@
             "              coords      : vec2<f32>,\n"
             "              array_index : i32) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1098,8 +1098,8 @@
             "              array_index : u32\n"
             "              offset      : vec2<i32>) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1117,8 +1117,8 @@
             "              s      : sampler,\n"
             "              coords : vec3<f32>) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k3d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1135,8 +1135,8 @@
             "              coords : vec3<f32>\n"
             "              offset : vec3<i32>) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k3d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1153,8 +1153,8 @@
             "              s      : sampler,\n"
             "              coords : vec3<f32>) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCube,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1171,8 +1171,8 @@
             "              coords      : vec3<f32>,\n"
             "              array_index : i32) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCubeArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1189,8 +1189,8 @@
             "              s      : sampler,\n"
             "              coords : vec2<f32>) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1207,8 +1207,8 @@
             "              coords : vec2<f32>\n"
             "              offset : vec2<i32>) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1226,8 +1226,8 @@
             "              coords      : vec2<f32>,\n"
             "              array_index : i32) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1246,8 +1246,8 @@
             "              array_index : i32\n"
             "              offset      : vec2<i32>) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1265,8 +1265,8 @@
             "              s      : sampler,\n"
             "              coords : vec3<f32>) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCube,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1283,8 +1283,8 @@
             "              coords      : vec3<f32>,\n"
             "              array_index : u32) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCubeArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1302,8 +1302,8 @@
             "                  coords : vec2<f32>,\n"
             "                  bias   : f32) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
@@ -1322,8 +1322,8 @@
             "                  bias   : f32,\n"
             "                  offset : vec2<i32>) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
@@ -1343,8 +1343,8 @@
             "                  array_index : u32,\n"
             "                  bias        : f32) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
@@ -1365,8 +1365,8 @@
             "                  bias        : f32,\n"
             "                  offset      : vec2<i32>) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
@@ -1386,8 +1386,8 @@
             "                  coords : vec3<f32>,\n"
             "                  bias   : f32) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k3d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
@@ -1406,8 +1406,8 @@
             "                  bias   : f32,\n"
             "                  offset : vec3<i32>) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k3d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
@@ -1426,8 +1426,8 @@
             "                  coords : vec3<f32>,\n"
             "                  bias   : f32) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCube,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
@@ -1446,8 +1446,8 @@
             "                  array_index : i32,\n"
             "                  bias        : f32) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCubeArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
@@ -1466,8 +1466,8 @@
             "                   coords : vec2<f32>,\n"
             "                   level  : f32) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1486,8 +1486,8 @@
             "                   level  : f32,\n"
             "                   offset : vec2<i32>) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1507,8 +1507,8 @@
             "                   array_index : i32,\n"
             "                   level       : f32) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1529,8 +1529,8 @@
             "                   level       : f32,\n"
             "                   offset      : vec2<i32>) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1550,8 +1550,8 @@
             "                   coords : vec3<f32>,\n"
             "                   level  : f32) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k3d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1570,8 +1570,8 @@
             "                   level  : f32,\n"
             "                   offset : vec3<i32>) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k3d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1590,8 +1590,8 @@
             "                   coords : vec3<f32>,\n"
             "                   level  : f32) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCube,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1610,8 +1610,8 @@
             "                   array_index : i32,\n"
             "                   level       : f32) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCubeArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1630,8 +1630,8 @@
             "                   coords : vec2<f32>,\n"
             "                   level  : u32) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1650,8 +1650,8 @@
             "                   level  : i32,\n"
             "                   offset : vec2<i32>) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1671,8 +1671,8 @@
             "                   array_index : u32,\n"
             "                   level       : u32) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1693,8 +1693,8 @@
             "                   level       : u32,\n"
             "                   offset      : vec2<i32>) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1714,8 +1714,8 @@
             "                   coords : vec3<f32>,\n"
             "                   level  : i32) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCube,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1734,8 +1734,8 @@
             "                   array_index : i32,\n"
             "                   level       : i32) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCubeArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1755,8 +1755,8 @@
             "                  ddx    : vec2<f32>,\n"
             "                  ddy    : vec2<f32>) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
@@ -1777,8 +1777,8 @@
             "                  ddy    : vec2<f32>,\n"
             "                  offset : vec2<i32>) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
@@ -1800,8 +1800,8 @@
             "                  ddx         : vec2<f32>,\n"
             "                  ddy         : vec2<f32>) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
@@ -1824,8 +1824,8 @@
             "                  ddy         : vec2<f32>,\n"
             "                  offset      : vec2<i32>) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
@@ -1847,8 +1847,8 @@
             "                  ddx    : vec3<f32>,\n"
             "                  ddy    : vec3<f32>) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k3d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
@@ -1869,8 +1869,8 @@
             "                  ddy    : vec3<f32>,\n"
             "                  offset : vec3<i32>) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::k3d,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
@@ -1891,8 +1891,8 @@
             "                  ddx    : vec3<f32>,\n"
             "                  ddy    : vec3<f32>) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCube,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
@@ -1913,8 +1913,8 @@
             "                  ddx         : vec3<f32>,\n"
             "                  ddy         : vec3<f32>) -> vec4<f32>",
             TextureKind::kRegular,
-            type::SamplerKind::kSampler,
-            type::TextureDimension::kCubeArray,
+            core::type::SamplerKind::kSampler,
+            core::type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
@@ -1934,8 +1934,8 @@
             "                     coords    : vec2<f32>,\n"
             "                     depth_ref : f32) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kComparisonSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kComparisonSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
@@ -1954,8 +1954,8 @@
             "                     depth_ref : f32,\n"
             "                     offset    : vec2<i32>) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kComparisonSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kComparisonSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
@@ -1975,8 +1975,8 @@
             "                     array_index : i32,\n"
             "                     depth_ref   : f32) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kComparisonSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kComparisonSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
@@ -1997,8 +1997,8 @@
             "                     depth_ref   : f32,\n"
             "                     offset      : vec2<i32>) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kComparisonSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kComparisonSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
@@ -2018,8 +2018,8 @@
             "                     coords    : vec3<f32>,\n"
             "                     depth_ref : f32) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kComparisonSampler,
-            type::TextureDimension::kCube,
+            core::type::SamplerKind::kComparisonSampler,
+            core::type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
@@ -2038,8 +2038,8 @@
             "                     array_index : i32,\n"
             "                     depth_ref   : f32) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kComparisonSampler,
-            type::TextureDimension::kCubeArray,
+            core::type::SamplerKind::kComparisonSampler,
+            core::type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
@@ -2058,8 +2058,8 @@
             "                          coords    : vec2<f32>,\n"
             "                          depth_ref : f32) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kComparisonSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kComparisonSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
@@ -2078,8 +2078,8 @@
             "                          depth_ref : f32,\n"
             "                          offset    : vec2<i32>) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kComparisonSampler,
-            type::TextureDimension::k2d,
+            core::type::SamplerKind::kComparisonSampler,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
@@ -2099,8 +2099,8 @@
             "                          array_index : i32,\n"
             "                          depth_ref   : f32) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kComparisonSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kComparisonSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
@@ -2121,8 +2121,8 @@
             "                          depth_ref   : f32,\n"
             "                          offset      : vec2<i32>) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kComparisonSampler,
-            type::TextureDimension::k2dArray,
+            core::type::SamplerKind::kComparisonSampler,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
@@ -2142,8 +2142,8 @@
             "                          coords      : vec3<f32>,\n"
             "                          depth_ref   : f32) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kComparisonSampler,
-            type::TextureDimension::kCube,
+            core::type::SamplerKind::kComparisonSampler,
+            core::type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
@@ -2162,8 +2162,8 @@
             "                          array_index : i32,\n"
             "                          depth_ref   : f32) -> f32",
             TextureKind::kDepth,
-            type::SamplerKind::kComparisonSampler,
-            type::TextureDimension::kCubeArray,
+            core::type::SamplerKind::kComparisonSampler,
+            core::type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
@@ -2181,7 +2181,7 @@
             "            coords : u32,\n"
             "            level  : u32) -> vec4<f32>",
             TextureKind::kRegular,
-            type::TextureDimension::k1d,
+            core::type::TextureDimension::k1d,
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2197,7 +2197,7 @@
             "            coords : i32,\n"
             "            level  : i32) -> vec4<u32>",
             TextureKind::kRegular,
-            type::TextureDimension::k1d,
+            core::type::TextureDimension::k1d,
             TextureDataType::kU32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2213,7 +2213,7 @@
             "            coords : i32,\n"
             "            level  : i32) -> vec4<i32>",
             TextureKind::kRegular,
-            type::TextureDimension::k1d,
+            core::type::TextureDimension::k1d,
             TextureDataType::kI32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2229,7 +2229,7 @@
             "            coords : vec2<u32>,\n"
             "            level  : u32) -> vec4<f32>",
             TextureKind::kRegular,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2245,7 +2245,7 @@
             "            coords : vec2<i32>,\n"
             "            level  : i32) -> vec4<u32>",
             TextureKind::kRegular,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             TextureDataType::kU32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2261,7 +2261,7 @@
             "            coords : vec2<u32>,\n"
             "            level  : u32) -> vec4<i32>",
             TextureKind::kRegular,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             TextureDataType::kI32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2278,7 +2278,7 @@
             "            array_index : i32,\n"
             "            level       : i32) -> vec4<f32>",
             TextureKind::kRegular,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2296,7 +2296,7 @@
             "            array_index : i32,\n"
             "            level       : i32) -> vec4<u32>",
             TextureKind::kRegular,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kU32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2314,7 +2314,7 @@
             "            array_index : u32,\n"
             "            level       : u32) -> vec4<i32>",
             TextureKind::kRegular,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kI32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2331,7 +2331,7 @@
             "            coords : vec3<i32>,\n"
             "            level  : i32) -> vec4<f32>",
             TextureKind::kRegular,
-            type::TextureDimension::k3d,
+            core::type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2347,7 +2347,7 @@
             "            coords : vec3<i32>,\n"
             "            level  : i32) -> vec4<u32>",
             TextureKind::kRegular,
-            type::TextureDimension::k3d,
+            core::type::TextureDimension::k3d,
             TextureDataType::kU32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2363,7 +2363,7 @@
             "            coords : vec3<u32>,\n"
             "            level  : u32) -> vec4<i32>",
             TextureKind::kRegular,
-            type::TextureDimension::k3d,
+            core::type::TextureDimension::k3d,
             TextureDataType::kI32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2379,7 +2379,7 @@
             "            coords       : vec2<i32>,\n"
             "            sample_index : i32) -> vec4<f32>",
             TextureKind::kMultisampled,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2395,7 +2395,7 @@
             "            coords       : vec2<i32>,\n"
             "            sample_index : i32) -> vec4<u32>",
             TextureKind::kMultisampled,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             TextureDataType::kU32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2411,7 +2411,7 @@
             "            coords       : vec2<u32>,\n"
             "            sample_index : u32) -> vec4<i32>",
             TextureKind::kMultisampled,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             TextureDataType::kI32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2427,7 +2427,7 @@
             "            coords : vec2<i32>,\n"
             "            level  : i32) -> f32",
             TextureKind::kDepth,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2444,7 +2444,7 @@
             "            array_index : u32,\n"
             "            level       : u32) -> f32",
             TextureKind::kDepth,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2461,7 +2461,7 @@
             "            coords       : vec2<u32>,\n"
             "            sample_index : u32) -> f32",
             TextureKind::kDepthMultisampled,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2478,7 +2478,7 @@
             "             value  : vec4<T>)",
             tint::core::Access::kWrite,
             tint::core::TexelFormat::kRgba32Float,
-            type::TextureDimension::k1d,
+            core::type::TextureDimension::k1d,
             TextureDataType::kF32,
             "textureStore",
             [](ProgramBuilder* b) {
@@ -2495,7 +2495,7 @@
             "             value  : vec4<T>)",
             tint::core::Access::kWrite,
             tint::core::TexelFormat::kRgba32Float,
-            type::TextureDimension::k2d,
+            core::type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureStore",
             [](ProgramBuilder* b) {
@@ -2513,7 +2513,7 @@
             "             value       : vec4<T>)",
             tint::core::Access::kWrite,
             tint::core::TexelFormat::kRgba32Float,
-            type::TextureDimension::k2dArray,
+            core::type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureStore",
             [](ProgramBuilder* b) {
@@ -2531,7 +2531,7 @@
             "             value  : vec4<T>)",
             tint::core::Access::kWrite,
             tint::core::TexelFormat::kRgba32Float,
-            type::TextureDimension::k3d,
+            core::type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureStore",
             [](ProgramBuilder* b) {
diff --git a/src/tint/lang/wgsl/ast/builtin_texture_helper_test.h b/src/tint/lang/wgsl/ast/builtin_texture_helper_test.h
index f1d1703..c54775f 100644
--- a/src/tint/lang/wgsl/ast/builtin_texture_helper_test.h
+++ b/src/tint/lang/wgsl/ast/builtin_texture_helper_test.h
@@ -192,8 +192,8 @@
     TextureOverloadCase(ValidTextureOverload,
                         const char*,
                         TextureKind,
-                        type::SamplerKind,
-                        type::TextureDimension,
+                        core::type::SamplerKind,
+                        core::type::TextureDimension,
                         TextureDataType,
                         const char*,
                         std::function<Args(ProgramBuilder*)>,
@@ -202,7 +202,7 @@
     TextureOverloadCase(ValidTextureOverload,
                         const char*,
                         TextureKind,
-                        type::TextureDimension,
+                        core::type::TextureDimension,
                         TextureDataType,
                         const char*,
                         std::function<Args(ProgramBuilder*)>,
@@ -212,7 +212,7 @@
                         const char*,
                         tint::core::Access,
                         tint::core::TexelFormat,
-                        type::TextureDimension,
+                        core::type::TextureDimension,
                         TextureDataType,
                         const char*,
                         std::function<Args(ProgramBuilder*)>,
@@ -247,7 +247,7 @@
     const TextureKind texture_kind;
     /// The sampler kind for the sampler parameter
     /// Used only when texture_kind is not kStorage
-    type::SamplerKind const sampler_kind = type::SamplerKind::kSampler;
+    core::type::SamplerKind const sampler_kind = core::type::SamplerKind::kSampler;
     /// The access control for the storage texture
     /// Used only when texture_kind is kStorage
     tint::core::Access const access = tint::core::Access::kReadWrite;
@@ -255,7 +255,7 @@
     /// Used only when texture_kind is kStorage
     tint::core::TexelFormat const texel_format = tint::core::TexelFormat::kUndefined;
     /// The dimensions of the texture parameter
-    type::TextureDimension const texture_dimension;
+    core::type::TextureDimension const texture_dimension;
     /// The data type of the texture parameter
     const TextureDataType texture_data_type;
     /// Name of the function. e.g. `textureSample`, `textureSampleGrad`, etc
diff --git a/src/tint/lang/wgsl/ast/module_clone_test.cc b/src/tint/lang/wgsl/ast/module_clone_test.cc
index 5d9a7ab..9e3c7f9 100644
--- a/src/tint/lang/wgsl/ast/module_clone_test.cc
+++ b/src/tint/lang/wgsl/ast/module_clone_test.cc
@@ -139,7 +139,7 @@
     for (auto* src_node : src.ASTNodes().Objects()) {
         src_nodes.emplace(src_node);
     }
-    std::unordered_set<const type::Type*> src_types;
+    std::unordered_set<const core::type::Type*> src_types;
     for (auto* src_type : src.Types()) {
         src_types.emplace(src_type);
     }
diff --git a/src/tint/lang/wgsl/ast/transform/add_block_attribute.cc b/src/tint/lang/wgsl/ast/transform/add_block_attribute.cc
index 6b7399a..e9ad3ef 100644
--- a/src/tint/lang/wgsl/ast/transform/add_block_attribute.cc
+++ b/src/tint/lang/wgsl/ast/transform/add_block_attribute.cc
@@ -43,7 +43,7 @@
 
     // A map from a type in the source program to a block-decorated wrapper that contains it in the
     // destination program.
-    Hashmap<const type::Type*, const Struct*, 8> wrapper_structs;
+    Hashmap<const core::type::Type*, const Struct*, 8> wrapper_structs;
 
     // Process global 'var' declarations that are buffers.
     bool made_changes = false;
diff --git a/src/tint/lang/wgsl/ast/transform/array_length_from_uniform.cc b/src/tint/lang/wgsl/ast/transform/array_length_from_uniform.cc
index 20be913..edf28d0 100644
--- a/src/tint/lang/wgsl/ast/transform/array_length_from_uniform.cc
+++ b/src/tint/lang/wgsl/ast/transform/array_length_from_uniform.cc
@@ -148,14 +148,14 @@
             //                             array_stride
             const Expression* total_size = total_storage_buffer_size;
             auto* storage_buffer_type = storage_buffer_sem->Type()->UnwrapRef();
-            const type::Array* array_type = nullptr;
-            if (auto* str = storage_buffer_type->As<type::Struct>()) {
+            const core::type::Array* array_type = nullptr;
+            if (auto* str = storage_buffer_type->As<core::type::Struct>()) {
                 // The variable is a struct, so subtract the byte offset of the array
                 // member.
                 auto* array_member_sem = str->Members().Back();
-                array_type = array_member_sem->Type()->As<type::Array>();
+                array_type = array_member_sem->Type()->As<core::type::Array>();
                 total_size = b.Sub(total_storage_buffer_size, u32(array_member_sem->Offset()));
-            } else if (auto* arr = storage_buffer_type->As<type::Array>()) {
+            } else if (auto* arr = storage_buffer_type->As<core::type::Array>()) {
                 array_type = arr;
             } else {
                 TINT_ICE() << "expected form of arrayLength argument to be &array_var or "
diff --git a/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc b/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc
index 63716fa..38605ac 100644
--- a/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc
+++ b/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc
@@ -40,7 +40,8 @@
 namespace tint::ast::transform {
 
 /// BinaryOpSignature is tuple of a binary op, LHS type and RHS type
-using BinaryOpSignature = std::tuple<core::BinaryOp, const type::Type*, const type::Type*>;
+using BinaryOpSignature =
+    std::tuple<core::BinaryOp, const core::type::Type*, const core::type::Type*>;
 
 /// PIMPL state for the transform
 struct BuiltinPolyfill::State {
@@ -117,7 +118,7 @@
                 [&](const Expression* expr) {
                     if (cfg.builtins.bgra8unorm) {
                         if (auto* ty_expr = src->Sem().Get<sem::TypeExpression>(expr)) {
-                            if (auto* tex = ty_expr->Type()->As<type::StorageTexture>()) {
+                            if (auto* tex = ty_expr->Type()->As<core::type::StorageTexture>()) {
                                 if (tex->texel_format() == core::TexelFormat::kBgra8Unorm) {
                                     ctx.Replace(expr, [this, tex] {
                                         return ctx.dst->Expr(ctx.dst->ty.storage_texture(
@@ -156,7 +157,7 @@
     /// Polyfill builtins.
     Hashmap<const sem::Builtin*, Symbol, 8> builtin_polyfills;
     /// Polyfill f32 conversion to i32 or u32 (or vectors of)
-    Hashmap<const type::Type*, Symbol, 2> f32_conv_polyfills;
+    Hashmap<const core::type::Type*, Symbol, 2> f32_conv_polyfills;
     // Tracks whether the chromium_experimental_full_ptr_parameters extension has been enabled.
     bool has_full_ptr_params = false;
     /// True if the transform has made changes (i.e. the program needs cloning)
@@ -169,7 +170,7 @@
     /// Builds the polyfill function for the `acosh` builtin
     /// @param ty the parameter and return type for the function
     /// @return the polyfill function name
-    Symbol acosh(const type::Type* ty) {
+    Symbol acosh(const core::type::Type* ty) {
         auto name = b.Symbols().New("tint_acosh");
         uint32_t width = WidthOf(ty);
 
@@ -207,7 +208,7 @@
     /// Builds the polyfill function for the `asinh` builtin
     /// @param ty the parameter and return type for the function
     /// @return the polyfill function name
-    Symbol asinh(const type::Type* ty) {
+    Symbol asinh(const core::type::Type* ty) {
         auto name = b.Symbols().New("tint_sinh");
 
         // return log(x + sqrt(x*x + 1));
@@ -222,7 +223,7 @@
     /// Builds the polyfill function for the `atanh` builtin
     /// @param ty the parameter and return type for the function
     /// @return the polyfill function name
-    Symbol atanh(const type::Type* ty) {
+    Symbol atanh(const core::type::Type* ty) {
         auto name = b.Symbols().New("tint_atanh");
         uint32_t width = WidthOf(ty);
 
@@ -260,7 +261,7 @@
     /// (scalar or vector)
     /// @param ty the parameter and return type for the function
     /// @return the polyfill function name
-    Symbol clampInteger(const type::Type* ty) {
+    Symbol clampInteger(const core::type::Type* ty) {
         auto name = b.Symbols().New("tint_clamp");
 
         b.Func(name,
@@ -280,7 +281,7 @@
     /// Builds the polyfill function for the `countLeadingZeros` builtin
     /// @param ty the parameter and return type for the function
     /// @return the polyfill function name
-    Symbol countLeadingZeros(const type::Type* ty) {
+    Symbol countLeadingZeros(const core::type::Type* ty) {
         auto name = b.Symbols().New("tint_count_leading_zeros");
         uint32_t width = WidthOf(ty);
 
@@ -338,7 +339,7 @@
     /// Builds the polyfill function for the `countTrailingZeros` builtin
     /// @param ty the parameter and return type for the function
     /// @return the polyfill function name
-    Symbol countTrailingZeros(const type::Type* ty) {
+    Symbol countTrailingZeros(const core::type::Type* ty) {
         auto name = b.Symbols().New("tint_count_trailing_zeros");
         uint32_t width = WidthOf(ty);
 
@@ -397,7 +398,7 @@
     /// Builds the polyfill function for the `extractBits` builtin
     /// @param ty the parameter and return type for the function
     /// @return the polyfill function name
-    Symbol extractBits(const type::Type* ty) {
+    Symbol extractBits(const core::type::Type* ty) {
         auto name = b.Symbols().New("tint_extract_bits");
         uint32_t width = WidthOf(ty);
 
@@ -455,7 +456,7 @@
     /// Builds the polyfill function for the `firstLeadingBit` builtin
     /// @param ty the parameter and return type for the function
     /// @return the polyfill function name
-    Symbol firstLeadingBit(const type::Type* ty) {
+    Symbol firstLeadingBit(const core::type::Type* ty) {
         auto name = b.Symbols().New("tint_first_leading_bit");
         uint32_t width = WidthOf(ty);
 
@@ -527,7 +528,7 @@
     /// Builds the polyfill function for the `firstTrailingBit` builtin
     /// @param ty the parameter and return type for the function
     /// @return the polyfill function name
-    Symbol firstTrailingBit(const type::Type* ty) {
+    Symbol firstTrailingBit(const core::type::Type* ty) {
         auto name = b.Symbols().New("tint_first_trailing_bit");
         uint32_t width = WidthOf(ty);
 
@@ -586,12 +587,12 @@
     /// Builds the polyfill function for the `insertBits` builtin
     /// @param ty the parameter and return type for the function
     /// @return the polyfill function name
-    Symbol insertBits(const type::Type* ty) {
+    Symbol insertBits(const core::type::Type* ty) {
         auto name = b.Symbols().New("tint_insert_bits");
         uint32_t width = WidthOf(ty);
 
         // Currently in WGSL parameters of insertBits must be i32, u32, vecN<i32> or vecN<u32>
-        if (TINT_UNLIKELY(((!ty->DeepestElement()->IsAnyOf<type::I32, type::U32>())))) {
+        if (TINT_UNLIKELY(((!ty->DeepestElement()->IsAnyOf<core::type::I32, core::type::U32>())))) {
             TINT_ICE()
                 << "insertBits polyfill only support i32, u32, and vector of i32 or u32, got "
                 << ty->FriendlyName();
@@ -605,7 +606,7 @@
             if (!ty->is_unsigned_integer_scalar_or_vector()) {
                 expr = b.Call<i32>(expr);
             }
-            if (ty->Is<type::Vector>()) {
+            if (ty->Is<core::type::Vector>()) {
                 expr = b.Call(T(ty), expr);
             }
             return expr;
@@ -694,7 +695,7 @@
     /// Builds the polyfill function for the `reflect` builtin
     /// @param ty the parameter and return type for the function
     /// @return the polyfill function name
-    Symbol reflect(const type::Type* ty) {
+    Symbol reflect(const core::type::Type* ty) {
         auto name = b.Symbols().New("tint_reflect");
 
         // WGSL polyfill function:
@@ -721,7 +722,7 @@
     /// Builds the polyfill function for the `saturate` builtin
     /// @param ty the parameter and return type for the function
     /// @return the polyfill function name
-    Symbol saturate(const type::Type* ty) {
+    Symbol saturate(const core::type::Type* ty) {
         auto name = b.Symbols().New("tint_saturate");
         auto body = tint::Vector{
             b.Return(b.Call("clamp", "v", b.Call(T(ty), 0_a), b.Call(T(ty), 1_a))),
@@ -738,7 +739,7 @@
     /// Builds the polyfill function for the `sign` builtin when the element type is integer
     /// @param ty the parameter and return type for the function
     /// @return the polyfill function name
-    Symbol sign_int(const type::Type* ty) {
+    Symbol sign_int(const core::type::Type* ty) {
         const uint32_t width = WidthOf(ty);
         auto zero = [&] { return ScalarOrVector(width, 0_a); };
 
@@ -773,13 +774,14 @@
                 b.Let("clamped", b.Call("clamp", "coord", "half_texel", b.Sub(1_a, "half_texel")))),
             b.Return(b.Call("textureSampleLevel", "t", "s", "clamped", 0_a)),
         };
-        b.Func(name,
-               tint::Vector{
-                   b.Param("t", b.ty.sampled_texture(type::TextureDimension::k2d, b.ty.f32())),
-                   b.Param("s", b.ty.sampler(type::SamplerKind::kSampler)),
-                   b.Param("coord", b.ty.vec2<f32>()),
-               },
-               b.ty.vec4<f32>(), body);
+        b.Func(
+            name,
+            tint::Vector{
+                b.Param("t", b.ty.sampled_texture(core::type::TextureDimension::k2d, b.ty.f32())),
+                b.Param("s", b.ty.sampler(core::type::SamplerKind::kSampler)),
+                b.Param("coord", b.ty.vec2<f32>()),
+            },
+            b.ty.vec4<f32>(), body);
         return name;
     }
 
@@ -787,7 +789,7 @@
     /// with scalar calls.
     /// @param vec the vector type
     /// @return the polyfill function name
-    Symbol quantizeToF16(const type::Vector* vec) {
+    Symbol quantizeToF16(const core::type::Vector* vec) {
         auto name = b.Symbols().New("tint_quantizeToF16");
         tint::Vector<const Expression*, 4> args;
         for (uint32_t i = 0; i < vec->Width(); i++) {
@@ -807,7 +809,7 @@
     /// Builds the polyfill function for the `workgroupUniformLoad` builtin.
     /// @param type the type being loaded
     /// @return the polyfill function name
-    Symbol workgroupUniformLoad(const type::Type* type) {
+    Symbol workgroupUniformLoad(const core::type::Type* type) {
         if (!has_full_ptr_params) {
             b.Enable(core::Extension::kChromiumExperimentalFullPtrParameters);
             has_full_ptr_params = true;
@@ -832,7 +834,7 @@
     /// @param source the type of the value being converted
     /// @param target the target conversion type
     /// @return the polyfill function name
-    Symbol ConvF32ToIU32(const type::Type* source, const type::Type* target) {
+    Symbol ConvF32ToIU32(const core::type::Type* source, const core::type::Type* target) {
         struct Limits {
             AFloat low_condition;
             AInt low_limit;
@@ -886,7 +888,7 @@
         auto* rhs_ty = src->TypeOf(bin_op->rhs)->UnwrapRef();
         auto* lhs_el_ty = lhs_ty->DeepestElement();
         const Expression* mask = b.Expr(AInt(lhs_el_ty->Size() * 8 - 1));
-        if (rhs_ty->Is<type::Vector>()) {
+        if (rhs_ty->Is<core::type::Vector>()) {
             mask = b.Call(CreateASTTypeFor(ctx, rhs_ty), mask);
         }
         auto* lhs = ctx.Clone(bin_op->lhs);
@@ -1039,11 +1041,11 @@
     }
 
     /// @returns the AST type for the given sem type
-    Type T(const type::Type* ty) { return CreateASTTypeFor(ctx, ty); }
+    Type T(const core::type::Type* ty) { return CreateASTTypeFor(ctx, ty); }
 
     /// @returns 1 if `ty` is not a vector, otherwise the vector width
-    uint32_t WidthOf(const type::Type* ty) const {
-        if (auto* v = ty->As<type::Vector>()) {
+    uint32_t WidthOf(const core::type::Type* ty) const {
+        if (auto* v = ty->As<core::type::Vector>()) {
             return v->Width();
         }
         return 1;
@@ -1156,8 +1158,8 @@
                         // more details.
                         if (cfg.builtins.reflect_vec2_f32) {
                             auto& sig = builtin->Signature();
-                            auto* vec = sig.return_type->As<type::Vector>();
-                            if (vec && vec->Width() == 2 && vec->type()->Is<type::F32>()) {
+                            auto* vec = sig.return_type->As<core::type::Vector>();
+                            if (vec && vec->Width() == 2 && vec->type()->Is<core::type::F32>()) {
                                 return builtin_polyfills.GetOrCreate(
                                     builtin, [&] { return reflect(builtin->ReturnType()); });
                             }
@@ -1185,8 +1187,8 @@
                         if (cfg.builtins.texture_sample_base_clamp_to_edge_2d_f32) {
                             auto& sig = builtin->Signature();
                             auto* tex = sig.Parameter(core::ParameterUsage::kTexture);
-                            if (auto* stex = tex->Type()->As<type::SampledTexture>()) {
-                                if (stex->type()->Is<type::F32>()) {
+                            if (auto* stex = tex->Type()->As<core::type::SampledTexture>()) {
+                                if (stex->type()->Is<core::type::F32>()) {
                                     return builtin_polyfills.GetOrCreate(builtin, [&] {
                                         return textureSampleBaseClampToEdge_2d_f32();
                                     });
@@ -1199,7 +1201,7 @@
                         if (cfg.builtins.bgra8unorm) {
                             auto& sig = builtin->Signature();
                             auto* tex = sig.Parameter(core::ParameterUsage::kTexture);
-                            if (auto* stex = tex->Type()->As<type::StorageTexture>()) {
+                            if (auto* stex = tex->Type()->As<core::type::StorageTexture>()) {
                                 if (stex->texel_format() == core::TexelFormat::kBgra8Unorm) {
                                     size_t value_idx = static_cast<size_t>(
                                         sig.IndexOf(core::ParameterUsage::kValue));
@@ -1224,7 +1226,7 @@
 
                     case core::Function::kQuantizeToF16:
                         if (cfg.builtins.quantize_to_vec_f16) {
-                            if (auto* vec = builtin->ReturnType()->As<type::Vector>()) {
+                            if (auto* vec = builtin->ReturnType()->As<core::type::Vector>()) {
                                 return builtin_polyfills.GetOrCreate(
                                     builtin, [&] { return quantizeToF16(vec); });
                             }
@@ -1246,9 +1248,10 @@
             [&](const sem::ValueConversion* conv) {
                 if (cfg.builtins.conv_f32_to_iu32) {
                     auto* src_ty = conv->Source();
-                    if (tint::Is<type::F32>(src_ty->Elements(src_ty).type)) {
+                    if (tint::Is<core::type::F32>(src_ty->Elements(src_ty).type)) {
                         auto* dst_ty = conv->Target();
-                        if (tint::IsAnyOf<type::I32, type::U32>(dst_ty->Elements(dst_ty).type)) {
+                        if (tint::IsAnyOf<core::type::I32, core::type::U32>(
+                                dst_ty->Elements(dst_ty).type)) {
                             return f32_conv_polyfills.GetOrCreate(dst_ty, [&] {  //
                                 return ConvF32ToIU32(src_ty, dst_ty);
                             });
diff --git a/src/tint/lang/wgsl/ast/transform/calculate_array_length.cc b/src/tint/lang/wgsl/ast/transform/calculate_array_length.cc
index 82fa160..2def1be 100644
--- a/src/tint/lang/wgsl/ast/transform/calculate_array_length.cc
+++ b/src/tint/lang/wgsl/ast/transform/calculate_array_length.cc
@@ -101,8 +101,8 @@
     // get_buffer_size_intrinsic() emits the function decorated with
     // BufferSizeIntrinsic that is transformed by the HLSL writer into a call to
     // [RW]ByteAddressBuffer.GetDimensions().
-    std::unordered_map<const type::Reference*, Symbol> buffer_size_intrinsics;
-    auto get_buffer_size_intrinsic = [&](const type::Reference* buffer_type) {
+    std::unordered_map<const core::type::Reference*, Symbol> buffer_size_intrinsics;
+    auto get_buffer_size_intrinsic = [&](const core::type::Reference* buffer_type) {
         return tint::GetOrCreate(buffer_size_intrinsics, buffer_type, [&] {
             auto name = b.Sym();
             auto type = CreateASTTypeFor(ctx, buffer_type);
@@ -166,7 +166,8 @@
                         break;
                     }
                     auto* storage_buffer_var = storage_buffer_sem->Variable();
-                    auto* storage_buffer_type = storage_buffer_sem->Type()->As<type::Reference>();
+                    auto* storage_buffer_type =
+                        storage_buffer_sem->Type()->As<core::type::Reference>();
 
                     // Generate BufferSizeIntrinsic for this storage type if we haven't already
                     auto buffer_size = get_buffer_size_intrinsic(storage_buffer_type);
@@ -199,16 +200,16 @@
                             auto name = b.Sym();
                             const Expression* total_size = b.Expr(buffer_size_result->variable);
 
-                            const type::Array* array_type = Switch(
+                            const core::type::Array* array_type = Switch(
                                 storage_buffer_type->StoreType(),
-                                [&](const type::Struct* str) {
+                                [&](const core::type::Struct* str) {
                                     // The variable is a struct, so subtract the byte offset of
                                     // the array member.
                                     auto* array_member_sem = str->Members().Back();
                                     total_size = b.Sub(total_size, u32(array_member_sem->Offset()));
-                                    return array_member_sem->Type()->As<type::Array>();
+                                    return array_member_sem->Type()->As<core::type::Array>();
                                 },
-                                [&](const type::Array* arr) { return arr; });
+                                [&](const core::type::Array* arr) { return arr; });
 
                             if (TINT_UNLIKELY(!array_type)) {
                                 TINT_ICE() << "expected form of arrayLength argument to be "
diff --git a/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io.cc b/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io.cc
index 0460997..838e871 100644
--- a/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io.cc
+++ b/src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io.cc
@@ -272,7 +272,7 @@
     /// @param attrs the attributes to apply to the shader input
     /// @returns an expression which evaluates to the value of the shader input
     const Expression* AddInput(std::string name,
-                               const type::Type* type,
+                               const core::type::Type* type,
                                std::optional<uint32_t> location,
                                tint::Vector<const Attribute*, 8> attrs) {
         auto ast_type = CreateASTTypeFor(ctx, type);
@@ -346,7 +346,7 @@
     /// @param attrs the attributes to apply to the shader output
     /// @param value the value of the shader output
     void AddOutput(std::string name,
-                   const type::Type* type,
+                   const core::type::Type* type,
                    std::optional<uint32_t> location,
                    std::optional<uint32_t> index,
                    tint::Vector<const Attribute*, 8> attrs,
@@ -432,7 +432,7 @@
         // list to pass them through to the inner function.
         tint::Vector<const Expression*, 8> inner_struct_values;
         for (auto* member : str->Members()) {
-            if (TINT_UNLIKELY(member->Type()->Is<type::Struct>())) {
+            if (TINT_UNLIKELY(member->Type()->Is<core::type::Struct>())) {
                 TINT_ICE() << "nested IO struct";
                 continue;
             }
@@ -461,12 +461,12 @@
     /// function.
     /// @param inner_ret_type the original function return type
     /// @param original_result the result object produced by the original function
-    void ProcessReturnType(const type::Type* inner_ret_type, Symbol original_result) {
+    void ProcessReturnType(const core::type::Type* inner_ret_type, Symbol original_result) {
         // Do not add interpolation attributes on fragment output
         bool do_interpolate = func_ast->PipelineStage() != PipelineStage::kFragment;
         if (auto* str = inner_ret_type->As<sem::Struct>()) {
             for (auto* member : str->Members()) {
-                if (TINT_UNLIKELY(member->Type()->Is<type::Struct>())) {
+                if (TINT_UNLIKELY(member->Type()->Is<core::type::Struct>())) {
                     TINT_ICE() << "nested IO struct";
                     continue;
                 }
@@ -480,7 +480,7 @@
                           member->Attributes().index, std::move(attributes),
                           b.MemberAccessor(original_result, name));
             }
-        } else if (!inner_ret_type->Is<type::Void>()) {
+        } else if (!inner_ret_type->Is<core::type::Void>()) {
             auto attributes =
                 CloneShaderIOAttributes(func_ast->return_type_attributes, do_interpolate);
 
@@ -507,8 +507,8 @@
         // sample mask.
         auto* builtin = b.Builtin(core::BuiltinValue::kSampleMask);
         builtin_attrs.Add(builtin, core::BuiltinValue::kSampleMask);
-        AddOutput("fixed_sample_mask", b.create<type::U32>(), std::nullopt, std::nullopt, {builtin},
-                  b.Expr(u32(cfg.fixed_sample_mask)));
+        AddOutput("fixed_sample_mask", b.create<core::type::U32>(), std::nullopt, std::nullopt,
+                  {builtin}, b.Expr(u32(cfg.fixed_sample_mask)));
     }
 
     /// Add a point size builtin to the wrapper function output.
@@ -516,8 +516,8 @@
         // Create a new output value and assign it a literal 1.0 value.
         auto* builtin = b.Builtin(core::BuiltinValue::kPointSize);
         builtin_attrs.Add(builtin, core::BuiltinValue::kPointSize);
-        AddOutput("vertex_point_size", b.create<type::F32>(), std::nullopt, std::nullopt, {builtin},
-                  b.Expr(1_f));
+        AddOutput("vertex_point_size", b.create<core::type::F32>(), std::nullopt, std::nullopt,
+                  {builtin}, b.Expr(1_f));
     }
 
     /// Create an expression for gl_Position.[component]
@@ -690,9 +690,9 @@
         }
 
         // Exit early if there is no shader IO to handle.
-        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) {
+        if (func_sem->Parameters().Length() == 0 &&
+            func_sem->ReturnType()->Is<core::type::Void>() && !needs_fixed_sample_mask &&
+            !needs_vertex_point_size && cfg.shader_style != ShaderStyle::kGlsl) {
             return;
         }
 
@@ -700,7 +700,7 @@
         // aggregated into a single structure.
         if (!func_sem->Parameters().IsEmpty()) {
             for (auto* param : func_sem->Parameters()) {
-                if (param->Type()->Is<type::Struct>()) {
+                if (param->Type()->Is<core::type::Struct>()) {
                     ProcessStructParameter(param);
                 } else {
                     ProcessNonStructParameter(param);
@@ -718,7 +718,7 @@
 
         // Process the return type, and start building the wrapper function body.
         std::function<Type()> wrapper_ret_type = [&] { return b.ty.void_(); };
-        if (func_sem->ReturnType()->Is<type::Void>()) {
+        if (func_sem->ReturnType()->Is<core::type::Void>()) {
             // The function call is just a statement with no result.
             wrapper_body.Push(b.CallStmt(call_inner));
         } else {
@@ -866,13 +866,13 @@
     /// @returns the converted value which can be assigned to the GLSL builtin
     const Expression* ToGLSLBuiltin(core::BuiltinValue builtin,
                                     const Expression* value,
-                                    const type::Type*& type) {
+                                    const core::type::Type*& type) {
         switch (builtin) {
             case core::BuiltinValue::kVertexIndex:
             case core::BuiltinValue::kInstanceIndex:
             case core::BuiltinValue::kSampleIndex:
             case core::BuiltinValue::kSampleMask:
-                type = b.create<type::I32>();
+                type = b.create<core::type::I32>();
                 value = b.Bitcast(CreateASTTypeFor(ctx, type), value);
                 break;
             default:
diff --git a/src/tint/lang/wgsl/ast/transform/combine_samplers.cc b/src/tint/lang/wgsl/ast/transform/combine_samplers.cc
index 404f872..5313b7a 100644
--- a/src/tint/lang/wgsl/ast/transform/combine_samplers.cc
+++ b/src/tint/lang/wgsl/ast/transform/combine_samplers.cc
@@ -120,9 +120,9 @@
     /// Creates placeholder global sampler variables.
     /// @param kind the sampler kind to create for
     /// @returns the newly-created global variable
-    const Variable* CreatePlaceholder(type::SamplerKind kind) {
+    const Variable* CreatePlaceholder(core::type::SamplerKind kind) {
         Type type = ctx.dst->ty.sampler(kind);
-        const char* name = kind == type::SamplerKind::kComparisonSampler
+        const char* name = kind == core::type::SamplerKind::kComparisonSampler
                                ? "placeholder_comparison_sampler"
                                : "placeholder_sampler";
         Symbol symbol = ctx.dst->Symbols().New(name);
@@ -136,8 +136,8 @@
     /// @param sampler the texture variable of interest
     /// @returns the newly-created type
     Type CreateCombinedASTTypeFor(const sem::Variable* texture, const sem::Variable* sampler) {
-        const type::Type* texture_type = texture->Type()->UnwrapRef();
-        const type::DepthTexture* depth = texture_type->As<type::DepthTexture>();
+        const core::type::Type* texture_type = texture->Type()->UnwrapRef();
+        const core::type::DepthTexture* depth = texture_type->As<core::type::DepthTexture>();
         if (depth && !sampler) {
             return ctx.dst->ty.sampled_texture(depth->dim(), ctx.dst->ty.f32());
         } else {
@@ -155,8 +155,8 @@
         for (auto* global : ctx.src->AST().GlobalVariables()) {
             auto* global_sem = sem.Get(global)->As<sem::GlobalVariable>();
             auto* type = ctx.src->TypeOf(global->type);
-            if (tint::IsAnyOf<type::Texture, type::Sampler>(type) &&
-                !type->Is<type::StorageTexture>()) {
+            if (tint::IsAnyOf<core::type::Texture, core::type::Sampler>(type) &&
+                !type->Is<core::type::StorageTexture>()) {
                 ctx.Remove(ctx.src->AST().GlobalDeclarations(), global);
             } else if (auto binding_point = global_sem->BindingPoint()) {
                 if (binding_point->group == 0 && binding_point->binding == 0) {
@@ -200,7 +200,7 @@
                 // Filter out separate textures and samplers from the original
                 // function signature.
                 for (auto* param : fn->Parameters()) {
-                    if (!param->Type()->IsAnyOf<type::Texture, type::Sampler>()) {
+                    if (!param->Type()->IsAnyOf<core::type::Texture, core::type::Sampler>()) {
                         params.Push(ctx.Clone(param->Declaration()));
                     }
                 }
@@ -236,7 +236,7 @@
                         call->Arguments()[static_cast<size_t>(texture_index)];
                     // We don't want to combine storage textures with anything, since
                     // they never have associated samplers in GLSL.
-                    if (texture->Type()->UnwrapRef()->Is<type::StorageTexture>()) {
+                    if (texture->Type()->UnwrapRef()->Is<core::type::StorageTexture>()) {
                         return nullptr;
                     }
                     const sem::ValueExpression* sampler =
@@ -249,16 +249,16 @@
                     sem::VariablePair new_pair(texture_var, sampler_var);
                     for (auto* arg : expr->args) {
                         auto* type = ctx.src->TypeOf(arg)->UnwrapRef();
-                        if (type->Is<type::Texture>()) {
+                        if (type->Is<core::type::Texture>()) {
                             const Variable* var =
                                 IsGlobal(new_pair)
                                     ? global_combined_texture_samplers_[new_pair]
                                     : function_combined_texture_samplers_[call->Stmt()->Function()]
                                                                          [new_pair];
                             args.Push(ctx.dst->Expr(var->name->symbol));
-                        } else if (auto* sampler_type = type->As<type::Sampler>()) {
-                            type::SamplerKind kind = sampler_type->kind();
-                            int index = (kind == type::SamplerKind::kSampler) ? 0 : 1;
+                        } else if (auto* sampler_type = type->As<core::type::Sampler>()) {
+                            core::type::SamplerKind kind = sampler_type->kind();
+                            int index = (kind == core::type::SamplerKind::kSampler) ? 0 : 1;
                             const Variable*& p = placeholder_samplers_[index];
                             if (!p) {
                                 p = CreatePlaceholder(kind);
@@ -270,7 +270,7 @@
                     }
                     const Expression* value = ctx.dst->Call(ctx.Clone(expr->target), args);
                     if (builtin->Type() == core::Function::kTextureLoad &&
-                        texture_var->Type()->UnwrapRef()->Is<type::DepthTexture>() &&
+                        texture_var->Type()->UnwrapRef()->Is<core::type::DepthTexture>() &&
                         !call->Stmt()->Declaration()->Is<CallStatement>()) {
                         value = ctx.dst->MemberAccessor(value, "x");
                     }
@@ -316,7 +316,7 @@
                     for (auto* arg : expr->args) {
                         if (!ctx.src->TypeOf(arg)
                                  ->UnwrapRef()
-                                 ->IsAnyOf<type::Texture, type::Sampler>()) {
+                                 ->IsAnyOf<core::type::Texture, core::type::Sampler>()) {
                             args.Push(ctx.Clone(arg));
                         }
                     }
diff --git a/src/tint/lang/wgsl/ast/transform/decompose_memory_access.cc b/src/tint/lang/wgsl/ast/transform/decompose_memory_access.cc
index aea0162..68e4b8a 100644
--- a/src/tint/lang/wgsl/ast/transform/decompose_memory_access.cc
+++ b/src/tint/lang/wgsl/ast/transform/decompose_memory_access.cc
@@ -79,7 +79,7 @@
     const Expression* Build(program::CloneContext& ctx) const override {
         auto* type = ctx.src->Sem().GetVal(expr)->Type()->UnwrapRef();
         auto* res = ctx.Clone(expr);
-        if (!type->Is<type::U32>()) {
+        if (!type->Is<core::type::U32>()) {
             res = ctx.dst->Call<u32>(res);
         }
         return res;
@@ -112,7 +112,7 @@
 
 /// LoadStoreKey is the unordered map key to a load or store intrinsic.
 struct LoadStoreKey {
-    type::Type const* el_ty = nullptr;  // element type
+    core::type::Type const* el_ty = nullptr;  // element type
     Symbol const buffer;                // buffer name
     bool operator==(const LoadStoreKey& rhs) const {
         return el_ty == rhs.el_ty && buffer == rhs.buffer;
@@ -126,7 +126,7 @@
 
 /// AtomicKey is the unordered map key to an atomic intrinsic.
 struct AtomicKey {
-    type::Type const* el_ty = nullptr;  // element type
+    core::type::Type const* el_ty = nullptr;  // element type
     core::Function const op;            // atomic op
     Symbol const buffer;                // buffer name
     bool operator==(const AtomicKey& rhs) const {
@@ -139,75 +139,76 @@
     };
 };
 
-bool IntrinsicDataTypeFor(const type::Type* ty, DecomposeMemoryAccess::Intrinsic::DataType& out) {
-    if (ty->Is<type::I32>()) {
+bool IntrinsicDataTypeFor(const core::type::Type* ty,
+                          DecomposeMemoryAccess::Intrinsic::DataType& out) {
+    if (ty->Is<core::type::I32>()) {
         out = DecomposeMemoryAccess::Intrinsic::DataType::kI32;
         return true;
     }
-    if (ty->Is<type::U32>()) {
+    if (ty->Is<core::type::U32>()) {
         out = DecomposeMemoryAccess::Intrinsic::DataType::kU32;
         return true;
     }
-    if (ty->Is<type::F32>()) {
+    if (ty->Is<core::type::F32>()) {
         out = DecomposeMemoryAccess::Intrinsic::DataType::kF32;
         return true;
     }
-    if (ty->Is<type::F16>()) {
+    if (ty->Is<core::type::F16>()) {
         out = DecomposeMemoryAccess::Intrinsic::DataType::kF16;
         return true;
     }
-    if (auto* vec = ty->As<type::Vector>()) {
+    if (auto* vec = ty->As<core::type::Vector>()) {
         switch (vec->Width()) {
             case 2:
-                if (vec->type()->Is<type::I32>()) {
+                if (vec->type()->Is<core::type::I32>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec2I32;
                     return true;
                 }
-                if (vec->type()->Is<type::U32>()) {
+                if (vec->type()->Is<core::type::U32>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec2U32;
                     return true;
                 }
-                if (vec->type()->Is<type::F32>()) {
+                if (vec->type()->Is<core::type::F32>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec2F32;
                     return true;
                 }
-                if (vec->type()->Is<type::F16>()) {
+                if (vec->type()->Is<core::type::F16>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec2F16;
                     return true;
                 }
                 break;
             case 3:
-                if (vec->type()->Is<type::I32>()) {
+                if (vec->type()->Is<core::type::I32>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec3I32;
                     return true;
                 }
-                if (vec->type()->Is<type::U32>()) {
+                if (vec->type()->Is<core::type::U32>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec3U32;
                     return true;
                 }
-                if (vec->type()->Is<type::F32>()) {
+                if (vec->type()->Is<core::type::F32>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec3F32;
                     return true;
                 }
-                if (vec->type()->Is<type::F16>()) {
+                if (vec->type()->Is<core::type::F16>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec3F16;
                     return true;
                 }
                 break;
             case 4:
-                if (vec->type()->Is<type::I32>()) {
+                if (vec->type()->Is<core::type::I32>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec4I32;
                     return true;
                 }
-                if (vec->type()->Is<type::U32>()) {
+                if (vec->type()->Is<core::type::U32>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec4U32;
                     return true;
                 }
-                if (vec->type()->Is<type::F32>()) {
+                if (vec->type()->Is<core::type::F32>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec4F32;
                     return true;
                 }
-                if (vec->type()->Is<type::F16>()) {
+                if (vec->type()->Is<core::type::F16>()) {
                     out = DecomposeMemoryAccess::Intrinsic::DataType::kVec4F16;
                     return true;
                 }
@@ -222,7 +223,7 @@
 /// @returns a DecomposeMemoryAccess::Intrinsic attribute that can be applied to a stub function to
 /// load the type @p ty from the uniform or storage buffer with name @p buffer.
 DecomposeMemoryAccess::Intrinsic* IntrinsicLoadFor(ast::Builder* builder,
-                                                   const type::Type* ty,
+                                                   const core::type::Type* ty,
                                                    core::AddressSpace address_space,
                                                    const Symbol& buffer) {
     DecomposeMemoryAccess::Intrinsic::DataType type;
@@ -237,7 +238,7 @@
 /// @returns a DecomposeMemoryAccess::Intrinsic attribute that can be applied to a stub function to
 /// store the type @p ty to the storage buffer with name @p buffer.
 DecomposeMemoryAccess::Intrinsic* IntrinsicStoreFor(ast::Builder* builder,
-                                                    const type::Type* ty,
+                                                    const core::type::Type* ty,
                                                     const Symbol& buffer) {
     DecomposeMemoryAccess::Intrinsic::DataType type;
     if (!IntrinsicDataTypeFor(ty, type)) {
@@ -252,7 +253,7 @@
 /// the atomic op and the type @p ty.
 DecomposeMemoryAccess::Intrinsic* IntrinsicAtomicFor(ast::Builder* builder,
                                                      core::Function ity,
-                                                     const type::Type* ty,
+                                                     const core::type::Type* ty,
                                                      const Symbol& buffer) {
     auto op = DecomposeMemoryAccess::Intrinsic::Op::kAtomicLoad;
     switch (ity) {
@@ -308,7 +309,7 @@
 struct BufferAccess {
     sem::GlobalVariable const* var = nullptr;  // Storage or uniform buffer variable
     Offset const* offset = nullptr;            // The byte offset on var
-    type::Type const* type = nullptr;          // The type of the access
+    core::type::Type const* type = nullptr;    // The type of the access
     operator bool() const { return var; }      // Returns true if valid
 };
 
@@ -463,7 +464,7 @@
     /// @param buffer the symbol of the storage or uniform buffer variable, owned by the target
     /// ProgramBuilder.
     /// @return the name of the function that performs the load
-    Symbol LoadFunc(const type::Type* el_ty,
+    Symbol LoadFunc(const core::type::Type* el_ty,
                     core::AddressSpace address_space,
                     const Symbol& buffer) {
         return tint::GetOrCreate(load_funcs, LoadStoreKey{el_ty, buffer}, [&] {
@@ -478,7 +479,7 @@
                            intrinsic,
                            b.Disable(DisabledValidation::kFunctionHasNoBody),
                        });
-            } else if (auto* arr_ty = el_ty->As<type::Array>()) {
+            } else if (auto* arr_ty = el_ty->As<core::type::Array>()) {
                 // fn load_func(buffer : buf_ty, offset : u32) -> array<T, N> {
                 //   var arr : array<T, N>;
                 //   for (var i = 0u; i < array_count; i = i + 1) {
@@ -516,14 +517,14 @@
                        });
             } else {
                 tint::Vector<const Expression*, 8> values;
-                if (auto* mat_ty = el_ty->As<type::Matrix>()) {
+                if (auto* mat_ty = el_ty->As<core::type::Matrix>()) {
                     auto* vec_ty = mat_ty->ColumnType();
                     Symbol load = LoadFunc(vec_ty, address_space, buffer);
                     for (uint32_t i = 0; i < mat_ty->columns(); i++) {
                         auto* offset = b.Add("offset", u32(i * mat_ty->ColumnStride()));
                         values.Push(b.Call(load, offset));
                     }
-                } else if (auto* str = el_ty->As<type::Struct>()) {
+                } else if (auto* str = el_ty->As<core::type::Struct>()) {
                     for (auto* member : str->Members()) {
                         auto* offset = b.Add("offset", u32(member->Offset()));
                         Symbol load = LoadFunc(member->Type()->UnwrapRef(), address_space, buffer);
@@ -545,7 +546,7 @@
     /// @param el_ty the storage buffer element type
     /// @param buffer the symbol of the storage buffer variable, owned by the target ProgramBuilder.
     /// @return the name of the function that performs the store
-    Symbol StoreFunc(const type::Type* el_ty, const Symbol& buffer) {
+    Symbol StoreFunc(const core::type::Type* el_ty, const Symbol& buffer) {
         return tint::GetOrCreate(store_funcs, LoadStoreKey{el_ty, buffer}, [&] {
             tint::Vector params{
                 b.Param("offset", b.ty.u32()),
@@ -563,7 +564,7 @@
             } else {
                 auto body = Switch<tint::Vector<const Statement*, 8>>(
                     el_ty,  //
-                    [&](const type::Array* arr_ty) {
+                    [&](const core::type::Array* arr_ty) {
                         // fn store_func(buffer : buf_ty, offset : u32, value : el_ty) {
                         //   var array = value; // No dynamic indexing on constant arrays
                         //   for (var i = 0u; i < array_count; i = i + 1) {
@@ -595,7 +596,7 @@
 
                         return tint::Vector{b.Decl(array), for_loop};
                     },
-                    [&](const type::Matrix* mat_ty) {
+                    [&](const core::type::Matrix* mat_ty) {
                         auto* vec_ty = mat_ty->ColumnType();
                         Symbol store = StoreFunc(vec_ty, buffer);
                         tint::Vector<const Statement*, 4> stmts;
@@ -607,7 +608,7 @@
                         }
                         return stmts;
                     },
-                    [&](const type::Struct* str) {
+                    [&](const core::type::Struct* str) {
                         tint::Vector<const Statement*, 8> stmts;
                         for (auto* member : str->Members()) {
                             auto* offset = b.Add("offset", u32(member->Offset()));
@@ -633,7 +634,7 @@
     /// @param intrinsic the atomic intrinsic
     /// @param buffer the symbol of the storage buffer variable, owned by the target ProgramBuilder.
     /// @return the name of the function that performs the load
-    Symbol AtomicFunc(const type::Type* el_ty,
+    Symbol AtomicFunc(const core::type::Type* el_ty,
                       const sem::Builtin* intrinsic,
                       const Symbol& buffer) {
         auto op = intrinsic->Type();
@@ -838,7 +839,7 @@
             if (auto* swizzle = accessor_sem->As<sem::Swizzle>()) {
                 if (swizzle->Indices().Length() == 1) {
                     if (auto access = state.TakeAccess(accessor->object)) {
-                        auto* vec_ty = access.type->As<type::Vector>();
+                        auto* vec_ty = access.type->As<core::type::Vector>();
                         auto* offset = state.Mul(vec_ty->type()->Size(), swizzle->Indices()[0u]);
                         state.AddAccess(accessor, {
                                                       access.var,
@@ -849,7 +850,7 @@
                 }
             } else {
                 if (auto access = state.TakeAccess(accessor->object)) {
-                    auto* str_ty = access.type->As<type::Struct>();
+                    auto* str_ty = access.type->As<core::type::Struct>();
                     auto* member = str_ty->FindMember(accessor->member->symbol);
                     auto offset = member->Offset();
                     state.AddAccess(accessor, {
@@ -865,7 +866,7 @@
         if (auto* accessor = node->As<IndexAccessorExpression>()) {
             if (auto access = state.TakeAccess(accessor->object)) {
                 // X[Y]
-                if (auto* arr = access.type->As<type::Array>()) {
+                if (auto* arr = access.type->As<core::type::Array>()) {
                     auto* offset = state.Mul(arr->Stride(), accessor->index);
                     state.AddAccess(accessor, {
                                                   access.var,
@@ -874,7 +875,7 @@
                                               });
                     continue;
                 }
-                if (auto* vec_ty = access.type->As<type::Vector>()) {
+                if (auto* vec_ty = access.type->As<core::type::Vector>()) {
                     auto* offset = state.Mul(vec_ty->type()->Size(), accessor->index);
                     state.AddAccess(accessor, {
                                                   access.var,
@@ -883,7 +884,7 @@
                                               });
                     continue;
                 }
-                if (auto* mat_ty = access.type->As<type::Matrix>()) {
+                if (auto* mat_ty = access.type->As<core::type::Matrix>()) {
                     auto* offset = state.Mul(mat_ty->ColumnStride(), accessor->index);
                     state.AddAccess(accessor, {
                                                   access.var,
@@ -929,7 +930,8 @@
                         // atomic___(X)
                         ctx.Replace(call_expr, [=, &ctx, &state] {
                             auto* offset = access.offset->Build(ctx);
-                            auto* el_ty = access.type->UnwrapRef()->As<type::Atomic>()->Type();
+                            auto* el_ty =
+                                access.type->UnwrapRef()->As<core::type::Atomic>()->Type();
                             auto buffer = ctx.Clone(access.var->Declaration()->name->symbol);
                             Symbol func = state.AtomicFunc(el_ty, builtin, buffer);
 
diff --git a/src/tint/lang/wgsl/ast/transform/decompose_strided_array.cc b/src/tint/lang/wgsl/ast/transform/decompose_strided_array.cc
index c1de1a4..bf0bd0d 100644
--- a/src/tint/lang/wgsl/ast/transform/decompose_strided_array.cc
+++ b/src/tint/lang/wgsl/ast/transform/decompose_strided_array.cc
@@ -35,7 +35,7 @@
 namespace tint::ast::transform {
 namespace {
 
-using DecomposedArrays = std::unordered_map<const type::Array*, Symbol>;
+using DecomposedArrays = std::unordered_map<const core::type::Array*, Symbol>;
 
 bool ShouldRun(const Program* program) {
     for (auto* node : program->ASTNodes().Objects()) {
@@ -69,7 +69,7 @@
 
     // Maps an array type in the source program to the name of the struct wrapper
     // type in the target program.
-    std::unordered_map<const type::Array*, Symbol> decomposed;
+    std::unordered_map<const core::type::Array*, Symbol> decomposed;
 
     // Find and replace all arrays with a @stride attribute with a array that has
     // the @stride removed. If the source array stride does not match the natural
@@ -85,7 +85,7 @@
         if (!type_expr) {
             return nullptr;
         }
-        auto* arr = type_expr->Type()->As<type::Array>();
+        auto* arr = type_expr->Type()->As<core::type::Array>();
         if (!arr) {
             return nullptr;
         }
@@ -126,7 +126,7 @@
     // Example: `arr[i]` -> `arr[i].el`
     ctx.ReplaceAll([&](const IndexAccessorExpression* idx) -> const Expression* {
         if (auto* ty = src->TypeOf(idx->object)) {
-            if (auto* arr = ty->UnwrapRef()->As<type::Array>()) {
+            if (auto* arr = ty->UnwrapRef()->As<core::type::Array>()) {
                 if (!arr->IsStrideImplicit()) {
                     auto* expr = ctx.CloneWithoutTransform(idx);
                     return b.MemberAccessor(expr, kMemberName);
@@ -146,7 +146,7 @@
         if (!expr->args.IsEmpty()) {
             if (auto* call = sem.Get(expr)->UnwrapMaterialize()->As<sem::Call>()) {
                 if (auto* ctor = call->Target()->As<sem::ValueConstructor>()) {
-                    if (auto* arr = ctor->ReturnType()->As<type::Array>()) {
+                    if (auto* arr = ctor->ReturnType()->As<core::type::Array>()) {
                         // Begin by cloning the array initializer type or name
                         // If this is an unaliased array, this may add a new entry to
                         // decomposed.
diff --git a/src/tint/lang/wgsl/ast/transform/decompose_strided_matrix.cc b/src/tint/lang/wgsl/ast/transform/decompose_strided_matrix.cc
index 6e6bffe..cc251e2 100644
--- a/src/tint/lang/wgsl/ast/transform/decompose_strided_matrix.cc
+++ b/src/tint/lang/wgsl/ast/transform/decompose_strided_matrix.cc
@@ -37,7 +37,7 @@
     /// The stride in bytes between columns of the matrix
     uint32_t stride = 0;
     /// The type of the matrix
-    const type::Matrix* matrix = nullptr;
+    const core::type::Matrix* matrix = nullptr;
 
     /// @returns the identifier of an array that holds an vector column for each row of the matrix.
     Type array(ast::Builder* b) const {
@@ -72,7 +72,7 @@
     // Scan the program for all storage and uniform structure matrix members with
     // a custom stride attribute. Replace these matrices with an equivalent array,
     // and populate the `decomposed` map with the members that have been replaced.
-    Hashmap<const type::StructMember*, MatrixInfo, 8> decomposed;
+    Hashmap<const core::type::StructMember*, MatrixInfo, 8> decomposed;
     for (auto* node : src->ASTNodes().Objects()) {
         if (auto* str = node->As<Struct>()) {
             auto* str_ty = src->Sem().Get(str);
@@ -81,7 +81,7 @@
                 continue;
             }
             for (auto* member : str_ty->Members()) {
-                auto* matrix = member->Type()->As<type::Matrix>();
+                auto* matrix = member->Type()->As<core::type::Matrix>();
                 if (!matrix) {
                     continue;
                 }
diff --git a/src/tint/lang/wgsl/ast/transform/demote_to_helper.cc b/src/tint/lang/wgsl/ast/transform/demote_to_helper.cc
index 2796cfb..fa439fa 100644
--- a/src/tint/lang/wgsl/ast/transform/demote_to_helper.cc
+++ b/src/tint/lang/wgsl/ast/transform/demote_to_helper.cc
@@ -106,7 +106,7 @@
     // Mask all writes to host-visible memory using the discarded flag.
     // We also insert a discard statement before all return statements in entry points for shaders
     // that discard.
-    std::unordered_map<const type::Type*, Symbol> atomic_cmpxchg_result_types;
+    std::unordered_map<const core::type::Type*, Symbol> atomic_cmpxchg_result_types;
     for (auto* node : src->ASTNodes().Objects()) {
         Switch(
             node,
@@ -125,7 +125,7 @@
                 }
 
                 // Skip writes to invocation-private address spaces.
-                auto* ref = sem.GetVal(assign->lhs)->Type()->As<type::Reference>();
+                auto* ref = sem.GetVal(assign->lhs)->Type()->As<core::type::Reference>();
                 switch (ref->AddressSpace()) {
                     case core::AddressSpace::kStorage:
                         // Need to mask these.
@@ -186,7 +186,7 @@
                             // original member values over to it.
 
                             // Declare a struct to hold the result values.
-                            auto* result_struct = sem_call->Type()->As<type::Struct>();
+                            auto* result_struct = sem_call->Type()->As<core::type::Struct>();
                             auto* atomic_ty = result_struct->Members()[0]->Type();
                             result_ty =
                                 b.ty(tint::GetOrCreate(atomic_cmpxchg_result_types, atomic_ty, [&] {
diff --git a/src/tint/lang/wgsl/ast/transform/direct_variable_access.cc b/src/tint/lang/wgsl/ast/transform/direct_variable_access.cc
index ef56e04..e222e31 100644
--- a/src/tint/lang/wgsl/ast/transform/direct_variable_access.cc
+++ b/src/tint/lang/wgsl/ast/transform/direct_variable_access.cc
@@ -48,7 +48,7 @@
     /// The pointer-unwrapped type of the *transformed* variable.
     /// This may be different for pointers in 'private' and 'function' address space, as the pointer
     /// parameter type is to the *base object* instead of the input pointer type.
-    tint::type::Type const* type = nullptr;
+    tint::core::type::Type const* type = nullptr;
     /// The originating module-scope variable ('private', 'storage', 'uniform', 'workgroup'),
     /// function-scope variable ('function'), or pointer parameter in the source program.
     tint::sem::Variable const* variable = nullptr;
@@ -444,7 +444,7 @@
                     chain->root.variable = variable;
                     chain->root.type = variable->Type();
                     chain->root.address_space = variable->AddressSpace();
-                    if (auto* ptr = chain->root.type->As<type::Pointer>()) {
+                    if (auto* ptr = chain->root.type->As<core::type::Pointer>()) {
                         chain->root.address_space = ptr->AddressSpace();
                     }
                     access_chains.Add(expr, chain);
@@ -459,13 +459,13 @@
                         }
                     },
                     [&](const Parameter*) {
-                        if (variable->Type()->Is<type::Pointer>()) {
+                        if (variable->Type()->Is<core::type::Pointer>()) {
                             // Start a new access chain for the pointer parameter access
                             create_new_chain();
                         }
                     },
                     [&](const Let*) {
-                        if (variable->Type()->Is<type::Pointer>()) {
+                        if (variable->Type()->Is<core::type::Pointer>()) {
                             // variable is a pointer-let.
                             auto* init = sem.GetVal(variable->Declaration()->initializer);
                             // Note: We do not use take_chain() here, as we need to preserve the
@@ -576,7 +576,7 @@
             if (!idx->UnwrapMaterialize()
                      ->Type()
                      ->UnwrapRef()
-                     ->IsAnyOf<type::U32, type::AbstractInt>()) {
+                     ->IsAnyOf<core::type::U32, core::type::AbstractInt>()) {
                 expr = b.Call<u32>(expr);
             }
         }
@@ -640,7 +640,7 @@
             for (size_t i = 0; i < call->Arguments().Length(); i++) {
                 const auto* arg = call->Arguments()[i];
                 const auto* param = target->Parameters()[i];
-                const auto* param_ty = param->Type()->As<type::Pointer>();
+                const auto* param_ty = param->Type()->As<core::type::Pointer>();
                 if (!param_ty) {
                     continue;  // Parameter type is not a pointer.
                 }
@@ -883,7 +883,7 @@
             for (size_t arg_idx = 0; arg_idx < call->Arguments().Length(); arg_idx++) {
                 auto* arg = call->Arguments()[arg_idx];
                 auto* param = call->Target()->Parameters()[arg_idx];
-                auto* param_ty = param->Type()->As<type::Pointer>();
+                auto* param_ty = param->Type()->As<core::type::Pointer>();
                 if (!param_ty) {
                     // Parameter is not a pointer.
                     // Just clone the unaltered argument.
@@ -1051,7 +1051,7 @@
 
             // BuildAccessExpr() always returns a non-pointer.
             // If the expression we're replacing is a pointer, take the address.
-            if (expr->Type()->Is<type::Pointer>()) {
+            if (expr->Type()->Is<core::type::Pointer>()) {
                 chain_expr = b.AddressOf(chain_expr);
             }
 
@@ -1127,7 +1127,7 @@
 
         const Expression* expr = b.Expr(ctx.Clone(root.variable->Declaration()->name->symbol));
         if (deref) {
-            if (root.variable->Type()->Is<type::Pointer>()) {
+            if (root.variable->Type()->Is<core::type::Pointer>()) {
                 expr = b.Deref(expr);
             }
         }
@@ -1168,7 +1168,7 @@
     /// @returns true if the function @p fn has at least one pointer parameter.
     static bool HasPointerParameter(const sem::Function* fn) {
         for (auto* param : fn->Parameters()) {
-            if (param->Type()->Is<type::Pointer>()) {
+            if (param->Type()->Is<core::type::Pointer>()) {
                 return true;
             }
         }
@@ -1180,7 +1180,7 @@
     /// generated, and must be stripped.
     static bool MustBeCalled(const sem::Function* fn) {
         for (auto* param : fn->Parameters()) {
-            if (auto* ptr = param->Type()->As<type::Pointer>()) {
+            if (auto* ptr = param->Type()->As<core::type::Pointer>()) {
                 switch (ptr->AddressSpace()) {
                     case core::AddressSpace::kUniform:
                     case core::AddressSpace::kStorage:
diff --git a/src/tint/lang/wgsl/ast/transform/expand_compound_assignment.cc b/src/tint/lang/wgsl/ast/transform/expand_compound_assignment.cc
index cd766a6..995f581 100644
--- a/src/tint/lang/wgsl/ast/transform/expand_compound_assignment.cc
+++ b/src/tint/lang/wgsl/ast/transform/expand_compound_assignment.cc
@@ -90,7 +90,7 @@
         // Helper function that returns `true` if the type of `expr` is a vector.
         auto is_vec = [&](const Expression* expr) {
             if (auto* val_expr = ctx.src->Sem().GetVal(expr)) {
-                return val_expr->Type()->UnwrapRef()->Is<type::Vector>();
+                return val_expr->Type()->UnwrapRef()->Is<core::type::Vector>();
             }
             return false;
         };
diff --git a/src/tint/lang/wgsl/ast/transform/first_index_offset.cc b/src/tint/lang/wgsl/ast/transform/first_index_offset.cc
index e85812a..2f242f8 100644
--- a/src/tint/lang/wgsl/ast/transform/first_index_offset.cc
+++ b/src/tint/lang/wgsl/ast/transform/first_index_offset.cc
@@ -81,7 +81,7 @@
 
     // Map of builtin usages
     std::unordered_map<const sem::Variable*, const char*> builtin_vars;
-    std::unordered_map<const type::StructMember*, const char*> builtin_members;
+    std::unordered_map<const core::type::StructMember*, const char*> builtin_members;
 
     bool has_vertex_index = false;
     bool has_instance_index = false;
diff --git a/src/tint/lang/wgsl/ast/transform/localize_struct_array_assignment.cc b/src/tint/lang/wgsl/ast/transform/localize_struct_array_assignment.cc
index b2b2b7d0..e4c1bb4 100644
--- a/src/tint/lang/wgsl/ast/transform/localize_struct_array_assignment.cc
+++ b/src/tint/lang/wgsl/ast/transform/localize_struct_array_assignment.cc
@@ -62,7 +62,7 @@
                     continue;
                 }
                 auto og = GetOriginatingTypeAndAddressSpace(assign_stmt);
-                if (!(og.first->Is<type::Struct>() &&
+                if (!(og.first->Is<core::type::Struct>() &&
                       (og.second == core::AddressSpace::kFunction ||
                        og.second == core::AddressSpace::kPrivate))) {
                     continue;
@@ -170,7 +170,7 @@
                 // Indexing a member access expr?
                 if (auto* ma = ia->object->As<MemberAccessorExpression>()) {
                     // That accesses an array?
-                    if (src->TypeOf(ma)->UnwrapRef()->Is<type::Array>()) {
+                    if (src->TypeOf(ma)->UnwrapRef()->Is<core::type::Array>()) {
                         result = true;
                         return TraverseAction::Stop;
                     }
@@ -185,7 +185,7 @@
     // Returns the type and address space of the originating variable of the lhs
     // of the assignment statement.
     // See https://www.w3.org/TR/WGSL/#originating-variable-section
-    std::pair<const type::Type*, core::AddressSpace> GetOriginatingTypeAndAddressSpace(
+    std::pair<const core::type::Type*, core::AddressSpace> GetOriginatingTypeAndAddressSpace(
         const AssignmentStatement* assign_stmt) {
         auto* root_ident = src->Sem().GetVal(assign_stmt->lhs)->RootIdentifier();
         if (TINT_UNLIKELY(!root_ident)) {
@@ -196,16 +196,16 @@
 
         return Switch(
             root_ident->Type(),  //
-            [&](const type::Reference* ref) {
+            [&](const core::type::Reference* ref) {
                 return std::make_pair(ref->StoreType(), ref->AddressSpace());
             },
-            [&](const type::Pointer* ptr) {
+            [&](const core::type::Pointer* ptr) {
                 return std::make_pair(ptr->StoreType(), ptr->AddressSpace());
             },
             [&](Default) {
                 TINT_ICE() << "Expecting to find variable of type pointer or reference on lhs "
                               "of assignment statement";
-                return std::pair<const type::Type*, core::AddressSpace>{};
+                return std::pair<const core::type::Type*, core::AddressSpace>{};
             });
     }
 };
diff --git a/src/tint/lang/wgsl/ast/transform/module_scope_var_to_entry_point_param.cc b/src/tint/lang/wgsl/ast/transform/module_scope_var_to_entry_point_param.cc
index 79f52893..3a997be 100644
--- a/src/tint/lang/wgsl/ast/transform/module_scope_var_to_entry_point_param.cc
+++ b/src/tint/lang/wgsl/ast/transform/module_scope_var_to_entry_point_param.cc
@@ -53,13 +53,13 @@
 }
 
 // Returns `true` if `type` is or contains a matrix type.
-bool ContainsMatrix(const type::Type* type) {
+bool ContainsMatrix(const core::type::Type* type) {
     type = type->UnwrapRef();
-    if (type->Is<type::Matrix>()) {
+    if (type->Is<core::type::Matrix>()) {
         return true;
-    } else if (auto* ary = type->As<type::Array>()) {
+    } else if (auto* ary = type->As<core::type::Array>()) {
         return ContainsMatrix(ary->ElemType());
-    } else if (auto* str = type->As<type::Struct>()) {
+    } else if (auto* str = type->As<core::type::Struct>()) {
         for (auto* member : str->Members()) {
             if (ContainsMatrix(member->Type())) {
                 return true;
@@ -83,7 +83,7 @@
     /// and add it to the global declarations now, so that they precede new global
     /// declarations that need to reference them.
     /// @param ty the type to clone
-    void CloneStructTypes(const type::Type* ty) {
+    void CloneStructTypes(const core::type::Type* ty) {
         if (auto* str = ty->As<sem::Struct>()) {
             if (!cloned_structs_.emplace(str).second) {
                 // The struct has already been cloned.
@@ -100,7 +100,7 @@
             auto* ast_str = str->Declaration();
             ctx.dst->AST().AddTypeDecl(ctx.Clone(ast_str));
             ctx.Remove(ctx.src->AST().GlobalDeclarations(), ast_str);
-        } else if (auto* arr = ty->As<type::Array>()) {
+        } else if (auto* arr = ty->As<core::type::Array>()) {
             CloneStructTypes(arr->ElemType());
         }
     }
@@ -150,8 +150,8 @@
                 attributes.Push(ctx.dst->Disable(DisabledValidation::kIgnoreAddressSpace));
 
                 auto param_type = store_type();
-                if (auto* arr = ty->As<type::Array>();
-                    arr && arr->Count()->Is<type::RuntimeArrayCount>()) {
+                if (auto* arr = ty->As<core::type::Array>();
+                    arr && arr->Count()->Is<core::type::RuntimeArrayCount>()) {
                     // Wrap runtime-sized arrays in structures, so that we can declare pointers to
                     // them. Ideally we'd just emit the array itself as a pointer, but this is not
                     // representable in Tint's AST.
diff --git a/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.cc b/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.cc
index a454d7c..5ebe504 100644
--- a/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.cc
+++ b/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.cc
@@ -36,7 +36,7 @@
 using namespace tint::number_suffixes;     // NOLINT
 
 bool ShouldRun(const Program* program) {
-    auto ext = program->Types().Find<type::ExternalTexture>();
+    auto ext = program->Types().Find<core::type::ExternalTexture>();
     return ext != nullptr;
 }
 
@@ -99,7 +99,7 @@
         // one uniform buffer for the ExternalTextureParams struct).
         for (auto* global : ctx.src->AST().GlobalVariables()) {
             auto* sem_var = sem.Get<sem::GlobalVariable>(global);
-            if (!sem_var->Type()->UnwrapRef()->Is<type::ExternalTexture>()) {
+            if (!sem_var->Type()->UnwrapRef()->Is<core::type::ExternalTexture>()) {
                 continue;
             }
 
@@ -138,7 +138,8 @@
             auto& syms = new_binding_symbols[sem_var];
             syms.plane_0 = ctx.Clone(global->name->symbol);
             syms.plane_1 = b.Symbols().New("ext_tex_plane_1");
-            b.GlobalVar(syms.plane_1, b.ty.sampled_texture(type::TextureDimension::k2d, b.ty.f32()),
+            b.GlobalVar(syms.plane_1,
+                        b.ty.sampled_texture(core::type::TextureDimension::k2d, b.ty.f32()),
                         b.Group(AInt(bps.plane_1.group)), b.Binding(AInt(bps.plane_1.binding)));
             syms.params = b.Symbols().New("ext_tex_params");
             b.GlobalVar(syms.params, b.ty("ExternalTextureParams"), core::AddressSpace::kUniform,
@@ -148,9 +149,9 @@
             auto cloned_attributes = ctx.Clone(global->attributes);
             const Expression* cloned_initializer = ctx.Clone(global->initializer);
 
-            auto* replacement =
-                b.Var(syms.plane_0, b.ty.sampled_texture(type::TextureDimension::k2d, b.ty.f32()),
-                      cloned_initializer, cloned_attributes);
+            auto* replacement = b.Var(
+                syms.plane_0, b.ty.sampled_texture(core::type::TextureDimension::k2d, b.ty.f32()),
+                cloned_initializer, cloned_attributes);
             ctx.Replace(global, replacement);
         }
 
@@ -158,7 +159,7 @@
         for (auto* fn : ctx.src->AST().Functions()) {
             for (const Variable* param : fn->params) {
                 if (auto* sem_var = sem.Get(param)) {
-                    if (!sem_var->Type()->UnwrapRef()->Is<type::ExternalTexture>()) {
+                    if (!sem_var->Type()->UnwrapRef()->Is<core::type::ExternalTexture>()) {
                         continue;
                     }
                     // If we find a texture_external, we must ensure the ExternalTextureParams
@@ -175,7 +176,7 @@
                     syms.plane_1 = b.Symbols().New("ext_tex_plane_1");
                     syms.params = b.Symbols().New("ext_tex_params");
                     auto tex2d_f32 = [&] {
-                        return b.ty.sampled_texture(type::TextureDimension::k2d, b.ty.f32());
+                        return b.ty.sampled_texture(core::type::TextureDimension::k2d, b.ty.f32());
                     };
                     ctx.Replace(param, b.Param(syms.plane_0, tex2d_f32()));
                     ctx.InsertAfter(fn->params, param, b.Param(syms.plane_1, tex2d_f32()));
@@ -192,7 +193,7 @@
             auto* builtin = call->Target()->As<sem::Builtin>();
 
             if (builtin && !builtin->Parameters().IsEmpty() &&
-                builtin->Parameters()[0]->Type()->Is<type::ExternalTexture>() &&
+                builtin->Parameters()[0]->Type()->Is<core::type::ExternalTexture>() &&
                 builtin->Type() != core::Function::kTextureDimensions) {
                 if (auto* var_user =
                         sem.GetVal(expr->args[0])->UnwrapLoad()->As<sem::VariableUser>()) {
@@ -422,10 +423,10 @@
             b.Func(texture_sample_external_sym,
                    tint::Vector{
                        b.Param("plane0",
-                               b.ty.sampled_texture(type::TextureDimension::k2d, b.ty.f32())),
+                               b.ty.sampled_texture(core::type::TextureDimension::k2d, b.ty.f32())),
                        b.Param("plane1",
-                               b.ty.sampled_texture(type::TextureDimension::k2d, b.ty.f32())),
-                       b.Param("smp", b.ty.sampler(type::SamplerKind::kSampler)),
+                               b.ty.sampled_texture(core::type::TextureDimension::k2d, b.ty.f32())),
+                       b.Param("smp", b.ty.sampler(core::type::SamplerKind::kSampler)),
                        b.Param("coord", b.ty.vec2(b.ty.f32())),
                        b.Param("params", b.ty(params_struct_sym)),
                    },
@@ -470,9 +471,9 @@
             b.Func(name,
                    tint::Vector{
                        b.Param("plane0",
-                               b.ty.sampled_texture(type::TextureDimension::k2d, b.ty.f32())),
+                               b.ty.sampled_texture(core::type::TextureDimension::k2d, b.ty.f32())),
                        b.Param("plane1",
-                               b.ty.sampled_texture(type::TextureDimension::k2d, b.ty.f32())),
+                               b.ty.sampled_texture(core::type::TextureDimension::k2d, b.ty.f32())),
                        b.Param("coord", CreateASTTypeFor(ctx, coord_ty)),
                        b.Param("params", b.ty(params_struct_sym)),
                    },
diff --git a/src/tint/lang/wgsl/ast/transform/packed_vec3.cc b/src/tint/lang/wgsl/ast/transform/packed_vec3.cc
index 48d73ad..3d38924 100644
--- a/src/tint/lang/wgsl/ast/transform/packed_vec3.cc
+++ b/src/tint/lang/wgsl/ast/transform/packed_vec3.cc
@@ -53,21 +53,21 @@
     static constexpr const char* kStructMemberName = "elements";
 
     /// The names of the structures used to wrap packed vec3 types.
-    Hashmap<const type::Type*, Symbol, 4> packed_vec3_wrapper_struct_names;
+    Hashmap<const core::type::Type*, Symbol, 4> packed_vec3_wrapper_struct_names;
 
     /// A cache of host-shareable structures that have been rewritten.
-    Hashmap<const type::Type*, Symbol, 4> rewritten_structs;
+    Hashmap<const core::type::Type*, Symbol, 4> rewritten_structs;
 
     /// A map from type to the name of a helper function used to pack that type.
-    Hashmap<const type::Type*, Symbol, 4> pack_helpers;
+    Hashmap<const core::type::Type*, Symbol, 4> pack_helpers;
 
     /// A map from type to the name of a helper function used to unpack that type.
-    Hashmap<const type::Type*, Symbol, 4> unpack_helpers;
+    Hashmap<const core::type::Type*, Symbol, 4> unpack_helpers;
 
     /// @param ty the type to test
     /// @returns true if `ty` is a vec3, false otherwise
-    bool IsVec3(const type::Type* ty) {
-        if (auto* vec = ty->As<type::Vector>()) {
+    bool IsVec3(const core::type::Type* ty) {
+        if (auto* vec = ty->As<core::type::Vector>()) {
             if (vec->Width() == 3) {
                 return true;
             }
@@ -77,13 +77,13 @@
 
     /// @param ty the type to test
     /// @returns true if `ty` is or contains a vec3, false otherwise
-    bool ContainsVec3(const type::Type* ty) {
+    bool ContainsVec3(const core::type::Type* ty) {
         return Switch(
             ty,  //
-            [&](const type::Vector* vec) { return IsVec3(vec); },
-            [&](const type::Matrix* mat) { return ContainsVec3(mat->ColumnType()); },
-            [&](const type::Array* arr) { return ContainsVec3(arr->ElemType()); },
-            [&](const type::Struct* str) {
+            [&](const core::type::Vector* vec) { return IsVec3(vec); },
+            [&](const core::type::Matrix* mat) { return ContainsVec3(mat->ColumnType()); },
+            [&](const core::type::Array* arr) { return ContainsVec3(arr->ElemType()); },
+            [&](const core::type::Struct* str) {
                 for (auto* member : str->Members()) {
                     if (ContainsVec3(member->Type())) {
                         return true;
@@ -96,8 +96,8 @@
     /// Create a `__packed_vec3` type with the same element type as `ty`.
     /// @param ty a three-element vector type
     /// @returns the new AST type
-    Type MakePackedVec3(const type::Type* ty) {
-        auto* vec = ty->As<type::Vector>();
+    Type MakePackedVec3(const core::type::Type* ty) {
+        auto* vec = ty->As<core::type::Vector>();
         TINT_ASSERT(vec != nullptr && vec->Width() == 3);
         return b.ty(core::Builtin::kPackedVec3, CreateASTTypeFor(ctx, vec->type()));
     }
@@ -111,10 +111,10 @@
     /// @param ty the type to rewrite
     /// @param array_element `true` if this is being called for the element of an array
     /// @returns the new AST type, or nullptr if rewriting was not necessary
-    Type RewriteType(const type::Type* ty, bool array_element = false) {
+    Type RewriteType(const core::type::Type* ty, bool array_element = false) {
         return Switch(
             ty,
-            [&](const type::Vector* vec) -> Type {
+            [&](const core::type::Vector* vec) -> Type {
                 if (IsVec3(vec)) {
                     if (array_element) {
                         // Create a struct with a single `__packed_vec3` member.
@@ -136,7 +136,7 @@
                 }
                 return {};
             },
-            [&](const type::Matrix* mat) -> Type {
+            [&](const core::type::Matrix* mat) -> Type {
                 // Rewrite the matrix as an array of columns that use the aligned wrapper struct.
                 auto new_col_type = RewriteType(mat->ColumnType(), /* array_element */ true);
                 if (new_col_type) {
@@ -144,23 +144,23 @@
                 }
                 return {};
             },
-            [&](const type::Array* arr) -> Type {
+            [&](const core::type::Array* arr) -> Type {
                 // Rewrite the array with the modified element type.
                 auto new_type = RewriteType(arr->ElemType(), /* array_element */ true);
                 if (new_type) {
                     tint::Vector<const Attribute*, 1> attrs;
-                    if (arr->Count()->Is<type::RuntimeArrayCount>()) {
+                    if (arr->Count()->Is<core::type::RuntimeArrayCount>()) {
                         return b.ty.array(new_type, std::move(attrs));
                     } else if (auto count = arr->ConstantCount()) {
                         return b.ty.array(new_type, u32(count.value()), std::move(attrs));
                     } else {
-                        TINT_ICE() << type::Array::kErrExpectedConstantCount;
+                        TINT_ICE() << core::type::Array::kErrExpectedConstantCount;
                         return {};
                     }
                 }
                 return {};
             },
-            [&](const type::Struct* str) -> Type {
+            [&](const core::type::Struct* str) -> Type {
                 if (ContainsVec3(str)) {
                     auto name = rewritten_structs.GetOrCreate(str, [&] {
                         tint::Vector<const StructMember*, 4> members;
@@ -219,8 +219,8 @@
     /// @returns the name of the helper function
     Symbol MakePackUnpackHelper(
         const char* name_prefix,
-        const type::Type* ty,
-        const std::function<const Expression*(const Expression*, const type::Type*)>&
+        const core::type::Type* ty,
+        const std::function<const Expression*(const Expression*, const core::type::Type*)>&
             pack_or_unpack_element,
         const std::function<Type()>& in_type,
         const std::function<Type()>& out_type) {
@@ -232,7 +232,8 @@
         //   for (var i = 0u; i < num_elements; i = i + 1) {
         //     result[i] = pack_or_unpack_element(in[i]);
         //   }
-        auto copy_array_elements = [&](uint32_t num_elements, const type::Type* element_type) {
+        auto copy_array_elements = [&](uint32_t num_elements,
+                                       const core::type::Type* element_type) {
             // Generate an expression for packing or unpacking an element of the array.
             auto* element = pack_or_unpack_element(b.IndexAccessor("in", "i"), element_type);
             statements.Push(b.For(                   //
@@ -247,14 +248,14 @@
         // Copy the elements of the value over to the result.
         Switch(
             ty,
-            [&](const type::Array* arr) {
+            [&](const core::type::Array* arr) {
                 TINT_ASSERT(arr->ConstantCount());
                 copy_array_elements(arr->ConstantCount().value(), arr->ElemType());
             },
-            [&](const type::Matrix* mat) {
+            [&](const core::type::Matrix* mat) {
                 copy_array_elements(mat->columns(), mat->ColumnType());
             },
-            [&](const type::Struct* str) {
+            [&](const core::type::Struct* str) {
                 // Copy the struct members over one at a time, packing/unpacking as necessary.
                 for (auto* member : str->Members()) {
                     const Expression* element =
@@ -281,13 +282,13 @@
     /// @param expr the composite value expression to unpack
     /// @param ty the unpacked type
     /// @returns an expression that holds the unpacked value
-    const Expression* UnpackComposite(const Expression* expr, const type::Type* ty) {
+    const Expression* UnpackComposite(const Expression* expr, const core::type::Type* ty) {
         auto helper = unpack_helpers.GetOrCreate(ty, [&] {
             return MakePackUnpackHelper(
                 "tint_unpack_vec3_in_composite", ty,
                 [&](const Expression* element,
-                    const type::Type* element_type) -> const Expression* {
-                    if (element_type->Is<type::Vector>()) {
+                    const core::type::Type* element_type) -> const Expression* {
+                    if (element_type->Is<core::type::Vector>()) {
                         // Unpack a `__packed_vec3` by casting it to a regular vec3.
                         // If it is an array element, extract the vector from the wrapper struct.
                         if (element->Is<IndexAccessorExpression>()) {
@@ -309,13 +310,13 @@
     /// @param expr the composite value expression to pack
     /// @param ty the unpacked type
     /// @returns an expression that holds the packed value
-    const Expression* PackComposite(const Expression* expr, const type::Type* ty) {
+    const Expression* PackComposite(const Expression* expr, const core::type::Type* ty) {
         auto helper = pack_helpers.GetOrCreate(ty, [&] {
             return MakePackUnpackHelper(
                 "tint_pack_vec3_in_composite", ty,
                 [&](const Expression* element,
-                    const type::Type* element_type) -> const Expression* {
-                    if (element_type->Is<type::Vector>()) {
+                    const core::type::Type* element_type) -> const Expression* {
+                    if (element_type->Is<core::type::Vector>()) {
                         // Pack a vector element by casting it to a packed_vec3.
                         // If it is an array element, construct a wrapper struct.
                         auto* packed = b.Call(MakePackedVec3(element_type), element);
@@ -375,7 +376,7 @@
                 sem.Get(node),
                 [&](const sem::TypeExpression* type) {
                     // Rewrite pointers to types that contain vec3s.
-                    auto* ptr = type->Type()->As<type::Pointer>();
+                    auto* ptr = type->Type()->As<core::type::Pointer>();
                     if (ptr && core::IsHostShareable(ptr->AddressSpace())) {
                         auto new_store_type = RewriteType(ptr->StoreType());
                         if (new_store_type) {
@@ -406,7 +407,7 @@
                         auto* rhs = sem.GetVal(assign->rhs);
                         if (!ContainsVec3(rhs->Type()) ||
                             !core::IsHostShareable(
-                                lhs->Type()->As<type::Reference>()->AddressSpace())) {
+                                lhs->Type()->As<core::type::Reference>()->AddressSpace())) {
                             // Skip assignments to address spaces that are not host-shareable, or
                             // that do not contain vec3 types.
                             return;
@@ -441,7 +442,7 @@
                     // If the expression produces a reference to a vec3 in a host-shareable address
                     // space from an array element, extract the packed vector from the wrapper
                     // struct.
-                    if (auto* ref = accessor->Type()->As<type::Reference>()) {
+                    if (auto* ref = accessor->Type()->As<core::type::Reference>()) {
                         if (IsVec3(ref->StoreType()) &&
                             core::IsHostShareable(ref->AddressSpace())) {
                             ctx.Replace(node, b.MemberAccessor(ctx.Clone(accessor->Declaration()),
diff --git a/src/tint/lang/wgsl/ast/transform/packed_vec3_test.cc b/src/tint/lang/wgsl/ast/transform/packed_vec3_test.cc
index 09e13bd..c0adb8f 100644
--- a/src/tint/lang/wgsl/ast/transform/packed_vec3_test.cc
+++ b/src/tint/lang/wgsl/ast/transform/packed_vec3_test.cc
@@ -4329,7 +4329,7 @@
         // The first member should have an alignment of 16 bytes, a size of 12 bytes, and the second
         // member should have an offset of 12 bytes.
         auto* sem_str = got.program.Sem().Get(vars[0]);
-        auto* str_ty = sem_str->Type()->UnwrapRef()->As<type::Struct>();
+        auto* str_ty = sem_str->Type()->UnwrapRef()->As<core::type::Struct>();
         ASSERT_NE(str_ty, nullptr);
         ASSERT_EQ(str_ty->Members().Length(), 2u);
         EXPECT_EQ(str_ty->Members()[0]->Align(), 16u);
@@ -4341,7 +4341,7 @@
         // Check the layout of the array type of "arr".
         // The element stride should be 16 bytes.
         auto* sem_arr = got.program.Sem().Get(vars[1]);
-        auto* arr_ty = sem_arr->Type()->UnwrapRef()->As<type::Array>();
+        auto* arr_ty = sem_arr->Type()->UnwrapRef()->As<core::type::Array>();
         ASSERT_NE(arr_ty, nullptr);
         EXPECT_EQ(arr_ty->Stride(), 16u);
     }
diff --git a/src/tint/lang/wgsl/ast/transform/pad_structs.cc b/src/tint/lang/wgsl/ast/transform/pad_structs.cc
index e8400c6..49c3eaf 100644
--- a/src/tint/lang/wgsl/ast/transform/pad_structs.cc
+++ b/src/tint/lang/wgsl/ast/transform/pad_structs.cc
@@ -86,11 +86,11 @@
             new_members.Push(b.Member(name, type));
 
             uint32_t size = ty->Size();
-            if (ty->Is<type::Struct>() && str->UsedAs(core::AddressSpace::kUniform)) {
+            if (ty->Is<core::type::Struct>() && str->UsedAs(core::AddressSpace::kUniform)) {
                 // std140 structs should be padded out to 16 bytes.
                 size = tint::RoundUp(16u, size);
-            } else if (auto* array_ty = ty->As<type::Array>()) {
-                if (array_ty->Count()->Is<type::RuntimeArrayCount>()) {
+            } else if (auto* array_ty = ty->As<core::type::Array>()) {
+                if (array_ty->Count()->Is<core::type::RuntimeArrayCount>()) {
                     has_runtime_sized_array = true;
                 }
             }
diff --git a/src/tint/lang/wgsl/ast/transform/preserve_padding.cc b/src/tint/lang/wgsl/ast/transform/preserve_padding.cc
index 64c48e5..5dba8d0 100644
--- a/src/tint/lang/wgsl/ast/transform/preserve_padding.cc
+++ b/src/tint/lang/wgsl/ast/transform/preserve_padding.cc
@@ -57,7 +57,8 @@
                         // Ignore phony assignment.
                         return;
                     }
-                    if (ty->As<type::Reference>()->AddressSpace() != core::AddressSpace::kStorage) {
+                    if (ty->As<core::type::Reference>()->AddressSpace() !=
+                        core::AddressSpace::kStorage) {
                         // We only care about assignments that write to variables in the storage
                         // address space, as nothing else is host-visible.
                         return;
@@ -98,7 +99,7 @@
     /// @param lhs the lhs expression (in the destination program)
     /// @param rhs the rhs expression (in the destination program)
     /// @returns the statement that performs the assignment
-    const Statement* MakeAssignment(const type::Type* ty,
+    const Statement* MakeAssignment(const core::type::Type* ty,
                                     const Expression* lhs,
                                     const Expression* rhs) {
         if (!HasPadding(ty)) {
@@ -135,7 +136,7 @@
 
         return Switch(
             ty,  //
-            [&](const type::Array* arr) {
+            [&](const core::type::Array* arr) {
                 // Call a helper function that uses a loop to assigns each element separately.
                 return call_helper([&] {
                     tint::Vector<const Statement*, 8> body;
@@ -149,7 +150,7 @@
                     return body;
                 });
             },
-            [&](const type::Matrix* mat) {
+            [&](const core::type::Matrix* mat) {
                 // Call a helper function that assigns each column separately.
                 return call_helper([&] {
                     tint::Vector<const Statement*, 4> body;
@@ -161,7 +162,7 @@
                     return body;
                 });
             },
-            [&](const type::Struct* str) {
+            [&](const core::type::Struct* str) {
                 // Call a helper function that assigns each member separately.
                 return call_helper([&] {
                     tint::Vector<const Statement*, 8> body;
@@ -183,24 +184,24 @@
     /// Checks if a type contains padding bytes.
     /// @param ty the type to check
     /// @returns true if `ty` (or any of its contained types) have padding bytes
-    bool HasPadding(const type::Type* ty) {
+    bool HasPadding(const core::type::Type* ty) {
         return Switch(
             ty,  //
-            [&](const type::Array* arr) {
+            [&](const core::type::Array* arr) {
                 auto* elem_ty = arr->ElemType();
                 if (elem_ty->Size() % elem_ty->Align() > 0) {
                     return true;
                 }
                 return HasPadding(elem_ty);
             },
-            [&](const type::Matrix* mat) {
+            [&](const core::type::Matrix* mat) {
                 auto* col_ty = mat->ColumnType();
                 if (mat->ColumnStride() > col_ty->Size()) {
                     return true;
                 }
                 return HasPadding(col_ty);
             },
-            [&](const type::Struct* str) {
+            [&](const core::type::Struct* str) {
                 uint32_t current_offset = 0;
                 for (auto* member : str->Members()) {
                     if (member->Offset() > current_offset) {
@@ -236,7 +237,7 @@
     /// Flag to track whether we have already enabled the full pointer parameters extension.
     bool ext_enabled = false;
     /// Map of semantic types to their assignment helper functions.
-    Hashmap<const type::Type*, Symbol, 8> helpers;
+    Hashmap<const core::type::Type*, Symbol, 8> helpers;
 };
 
 Transform::ApplyResult PreservePadding::Apply(const Program* program,
diff --git a/src/tint/lang/wgsl/ast/transform/promote_initializers_to_let.cc b/src/tint/lang/wgsl/ast/transform/promote_initializers_to_let.cc
index 4b2a439..9533281 100644
--- a/src/tint/lang/wgsl/ast/transform/promote_initializers_to_let.cc
+++ b/src/tint/lang/wgsl/ast/transform/promote_initializers_to_let.cc
@@ -44,7 +44,7 @@
     // Returns true if the expression should be hoisted to a new let statement before the
     // expression's statement.
     auto should_hoist = [&](const sem::ValueExpression* expr) {
-        if (!expr->Type()->IsAnyOf<type::Array, type::Struct>()) {
+        if (!expr->Type()->IsAnyOf<core::type::Array, core::type::Struct>()) {
             // We only care about array and struct initializers
             return false;
         }
diff --git a/src/tint/lang/wgsl/ast/transform/promote_side_effects_to_decl.cc b/src/tint/lang/wgsl/ast/transform/promote_side_effects_to_decl.cc
index 8d36a86..61dcccc 100644
--- a/src/tint/lang/wgsl/ast/transform/promote_side_effects_to_decl.cc
+++ b/src/tint/lang/wgsl/ast/transform/promote_side_effects_to_decl.cc
@@ -290,7 +290,9 @@
                         }
                         // Don't hoist textures / samplers as they can't be placed into a let, nor
                         // can they have side effects.
-                        if (var_user->Variable()->Type()->IsAnyOf<type::Texture, type::Sampler>()) {
+                        if (var_user->Variable()
+                                ->Type()
+                                ->IsAnyOf<core::type::Texture, core::type::Sampler>()) {
                             return false;
                         }
                         return true;
diff --git a/src/tint/lang/wgsl/ast/transform/remove_phonies.cc b/src/tint/lang/wgsl/ast/transform/remove_phonies.cc
index 0c653f6..e50b3b6 100644
--- a/src/tint/lang/wgsl/ast/transform/remove_phonies.cc
+++ b/src/tint/lang/wgsl/ast/transform/remove_phonies.cc
@@ -35,7 +35,7 @@
 namespace tint::ast::transform {
 namespace {
 
-using SinkSignature = std::vector<const type::Type*>;
+using SinkSignature = std::vector<const core::type::Type*>;
 
 }  // namespace
 
diff --git a/src/tint/lang/wgsl/ast/transform/renamer.cc b/src/tint/lang/wgsl/ast/transform/renamer.cc
index 1d9558b..af66929 100644
--- a/src/tint/lang/wgsl/ast/transform/renamer.cc
+++ b/src/tint/lang/wgsl/ast/transform/renamer.cc
@@ -1283,7 +1283,7 @@
                 if (sem->Is<sem::Swizzle>()) {
                     preserved_identifiers.Add(accessor->member);
                 } else if (auto* str_expr = src->Sem().GetVal(accessor->object)) {
-                    if (auto* ty = str_expr->Type()->UnwrapRef()->As<type::Struct>()) {
+                    if (auto* ty = str_expr->Type()->UnwrapRef()->As<core::type::Struct>()) {
                         if (!ty->Is<sem::Struct>()) {  // Builtin structure
                             preserved_identifiers.Add(accessor->member);
                         }
diff --git a/src/tint/lang/wgsl/ast/transform/robustness.cc b/src/tint/lang/wgsl/ast/transform/robustness.cc
index 2f7b5a5..dcd0157 100644
--- a/src/tint/lang/wgsl/ast/transform/robustness.cc
+++ b/src/tint/lang/wgsl/ast/transform/robustness.cc
@@ -92,7 +92,7 @@
                     // Inspect.
                     if (auto* user = sem.Get<sem::VariableUser>(e)) {
                         auto* v = user->Variable();
-                        if (v->Type()->Is<type::Pointer>()) {
+                        if (v->Type()->Is<core::type::Pointer>()) {
                             // Propagate predicate from pointer
                             if (auto pred = predicates.Get(v->Declaration()->initializer)) {
                                 predicates.Add(e, *pred);
@@ -181,7 +181,7 @@
                 if (auto pred = predicates.Get(expr)) {
                     // Expression is predicated
                     auto* sem_expr = sem.GetVal(expr);
-                    if (!sem_expr->Type()->IsAnyOf<type::Reference, type::Pointer>()) {
+                    if (!sem_expr->Type()->IsAnyOf<core::type::Reference, core::type::Pointer>()) {
                         auto pred_load = b.Symbols().New("predicated_expr");
                         auto ty = CreateASTTypeFor(ctx, sem_expr->Type());
                         hoist.InsertBefore(sem_expr->Stmt(), b.Decl(b.Var(pred_load, ty)));
@@ -224,7 +224,7 @@
         auto* obj_type = expr->Object()->Type();
         return Switch(
             obj_type->UnwrapRef(),  //
-            [&](const type::Vector* vec) -> const Expression* {
+            [&](const core::type::Vector* vec) -> const Expression* {
                 if (expr->Index()->ConstantValue() || expr->Index()->Is<sem::Swizzle>()) {
                     // Index and size is constant.
                     // Validation will have rejected any OOB accesses.
@@ -232,7 +232,7 @@
                 }
                 return b.Expr(u32(vec->Width() - 1u));
             },
-            [&](const type::Matrix* mat) -> const Expression* {
+            [&](const core::type::Matrix* mat) -> const Expression* {
                 if (expr->Index()->ConstantValue()) {
                     // Index and size is constant.
                     // Validation will have rejected any OOB accesses.
@@ -240,8 +240,8 @@
                 }
                 return b.Expr(u32(mat->columns() - 1u));
             },
-            [&](const type::Array* arr) -> const Expression* {
-                if (arr->Count()->Is<type::RuntimeArrayCount>()) {
+            [&](const core::type::Array* arr) -> const Expression* {
+                if (arr->Count()->Is<core::type::RuntimeArrayCount>()) {
                     // Size is unknown until runtime.
                     // Must clamp, even if the index is constant.
 
@@ -259,7 +259,7 @@
                 // Note: Don't be tempted to use the array override variable as an expression here,
                 // the name might be shadowed!
                 b.Diagnostics().add_error(diag::System::Transform,
-                                          type::Array::kErrExpectedConstantCount);
+                                          core::type::Array::kErrExpectedConstantCount);
                 return nullptr;
             },
             [&](Default) -> const Expression* {
@@ -275,7 +275,7 @@
         for (auto* fn : src->AST().Functions()) {
             for (auto* param : fn->params) {
                 auto* sem_param = sem.Get(param);
-                if (auto* ptr = sem_param->Type()->As<type::Pointer>()) {
+                if (auto* ptr = sem_param->Type()->As<core::type::Pointer>()) {
                     if (ActionFor(ptr->AddressSpace()) == Action::kPredicate) {
                         auto name = b.Symbols().New(param->name->symbol.Name() + "_predicate");
                         ctx.InsertAfter(fn->params, param, b.Param(name, b.ty.bool_()));
@@ -296,7 +296,7 @@
         auto* expr = call->Declaration();
         for (size_t i = 0; i < fn->Parameters().Length(); i++) {
             auto* param = fn->Parameters()[i];
-            if (auto* ptr = param->Type()->As<type::Pointer>()) {
+            if (auto* ptr = param->Type()->As<core::type::Pointer>()) {
                 if (ActionFor(ptr->AddressSpace()) == Action::kPredicate) {
                     auto* arg = expr->args[i];
                     if (auto predicate = predicates.Get(arg)) {
@@ -615,7 +615,7 @@
     Action ActionFor(const sem::ValueExpression* expr) {
         return Switch(
             expr->Type(),  //
-            [&](const type::Reference* t) { return ActionFor(t->AddressSpace()); },
+            [&](const core::type::Reference* t) { return ActionFor(t->AddressSpace()); },
             [&](Default) { return cfg.value_action; });
     }
 
@@ -645,8 +645,8 @@
     }
 
     /// @returns the vector width of @p ty, or 1 if @p ty is not a vector
-    static uint32_t WidthOf(const type::Type* ty) {
-        if (auto* vec = ty->As<type::Vector>()) {
+    static uint32_t WidthOf(const core::type::Type* ty) {
+        if (auto* vec = ty->As<core::type::Vector>()) {
             return vec->Width();
         }
         return 1u;
@@ -699,8 +699,8 @@
 
     /// @returns true if expr is an IndexAccessorExpression whose object is a runtime-sized array.
     bool IsIndexAccessingRuntimeSizedArray(const sem::IndexAccessorExpression* expr) {
-        auto* array_type = expr->Object()->Type()->UnwrapRef()->As<type::Array>();
-        return array_type != nullptr && array_type->Count()->Is<type::RuntimeArrayCount>();
+        auto* array_type = expr->Object()->Type()->UnwrapRef()->As<core::type::Array>();
+        return array_type != nullptr && array_type->Count()->Is<core::type::RuntimeArrayCount>();
     }
 
     /// @returns a clone of expr->Declaration() if it is an unsigned integer scalar, or
diff --git a/src/tint/lang/wgsl/ast/transform/simplify_pointers.cc b/src/tint/lang/wgsl/ast/transform/simplify_pointers.cc
index 42fe6a6..98de628 100644
--- a/src/tint/lang/wgsl/ast/transform/simplify_pointers.cc
+++ b/src/tint/lang/wgsl/ast/transform/simplify_pointers.cc
@@ -118,7 +118,7 @@
                 auto* var = user->Variable();
                 if (var->Is<sem::LocalVariable>() &&  //
                     var->Declaration()->Is<Let>() &&  //
-                    var->Type()->Is<type::Pointer>()) {
+                    var->Type()->Is<core::type::Pointer>()) {
                     op.expr = var->Declaration()->initializer;
                     continue;
                 }
@@ -135,7 +135,7 @@
 
         bool needs_transform = false;
         for (auto* ty : ctx.src->Types()) {
-            if (ty->Is<type::Pointer>()) {
+            if (ty->Is<core::type::Pointer>()) {
                 // Program contains pointers which need removing.
                 needs_transform = true;
                 break;
@@ -154,7 +154,7 @@
                     }
 
                     auto* var = ctx.src->Sem().Get(let->variable);
-                    if (!var->Type()->Is<type::Pointer>()) {
+                    if (!var->Type()->Is<core::type::Pointer>()) {
                         return;  // Not a pointer type. Ignore.
                     }
 
diff --git a/src/tint/lang/wgsl/ast/transform/single_entry_point.cc b/src/tint/lang/wgsl/ast/transform/single_entry_point.cc
index 5684e25..9976562 100644
--- a/src/tint/lang/wgsl/ast/transform/single_entry_point.cc
+++ b/src/tint/lang/wgsl/ast/transform/single_entry_point.cc
@@ -73,7 +73,7 @@
             decl,  //
             [&](const TypeDecl* ty) {
                 // Strip aliases that reference unused override declarations.
-                if (auto* arr = sem.Get(ty)->As<type::Array>()) {
+                if (auto* arr = sem.Get(ty)->As<core::type::Array>()) {
                     auto* refs = sem.TransitivelyReferencedOverrides(arr);
                     if (refs) {
                         for (auto* o : *refs) {
diff --git a/src/tint/lang/wgsl/ast/transform/spirv_atomic.cc b/src/tint/lang/wgsl/ast/transform/spirv_atomic.cc
index dc9dc11..fdbbba2 100644
--- a/src/tint/lang/wgsl/ast/transform/spirv_atomic.cc
+++ b/src/tint/lang/wgsl/ast/transform/spirv_atomic.cc
@@ -55,7 +55,7 @@
     ProgramBuilder b;
     /// The clone context
     program::CloneContext ctx = {&b, src, /* auto_clone_symbols */ true};
-    std::unordered_map<const type::Struct*, ForkedStruct> forked_structs;
+    std::unordered_map<const core::type::Struct*, ForkedStruct> forked_structs;
     std::unordered_set<const sem::Variable*> atomic_variables;
     UniqueVector<const sem::ValueExpression*, 8> atomic_expressions;
 
@@ -157,7 +157,7 @@
     }
 
   private:
-    ForkedStruct& Fork(const type::Struct* str) {
+    ForkedStruct& Fork(const core::type::Struct* str) {
         auto& forked = forked_structs[str];
         if (!forked.name.IsValid()) {
             forked.name = b.Symbols().New(str->Name().Name() + "_atomic");
@@ -196,14 +196,14 @@
         }
     }
 
-    Type AtomicTypeFor(const type::Type* ty) {
+    Type AtomicTypeFor(const core::type::Type* ty) {
         return Switch(
             ty,  //
-            [&](const type::I32*) { return b.ty.atomic(CreateASTTypeFor(ctx, ty)); },
-            [&](const type::U32*) { return b.ty.atomic(CreateASTTypeFor(ctx, ty)); },
-            [&](const type::Struct* str) { return b.ty(Fork(str).name); },
-            [&](const type::Array* arr) {
-                if (arr->Count()->Is<type::RuntimeArrayCount>()) {
+            [&](const core::type::I32*) { return b.ty.atomic(CreateASTTypeFor(ctx, ty)); },
+            [&](const core::type::U32*) { return b.ty.atomic(CreateASTTypeFor(ctx, ty)); },
+            [&](const core::type::Struct* str) { return b.ty(Fork(str).name); },
+            [&](const core::type::Array* arr) {
+                if (arr->Count()->Is<core::type::RuntimeArrayCount>()) {
                     return b.ty.array(AtomicTypeFor(arr->ElemType()));
                 }
                 auto count = arr->ConstantCount();
@@ -216,11 +216,11 @@
                 }
                 return b.ty.array(AtomicTypeFor(arr->ElemType()), u32(count.value()));
             },
-            [&](const type::Pointer* ptr) {
+            [&](const core::type::Pointer* ptr) {
                 return b.ty.ptr(ptr->AddressSpace(), AtomicTypeFor(ptr->StoreType()),
                                 ptr->Access());
             },
-            [&](const type::Reference* ref) { return AtomicTypeFor(ref->StoreType()); },
+            [&](const core::type::Reference* ref) { return AtomicTypeFor(ref->StoreType()); },
             [&](Default) {
                 TINT_ICE() << "unhandled type: " << ty->FriendlyName();
                 return Type{};
@@ -230,7 +230,7 @@
     void ReplaceLoadsAndStores() {
         // Returns true if 'e' is a reference to an atomic variable or struct member
         auto is_ref_to_atomic_var = [&](const sem::ValueExpression* e) {
-            if (tint::Is<type::Reference>(e->Type()) && e->RootIdentifier() &&
+            if (tint::Is<core::type::Reference>(e->Type()) && e->RootIdentifier() &&
                 (atomic_variables.count(e->RootIdentifier()) != 0)) {
                 // If it's a struct member, make sure it's one we marked as atomic
                 if (auto* ma = e->As<sem::StructMemberAccess>()) {
diff --git a/src/tint/lang/wgsl/ast/transform/std140.cc b/src/tint/lang/wgsl/ast/transform/std140.cc
index fafaea0..6b2b6a2 100644
--- a/src/tint/lang/wgsl/ast/transform/std140.cc
+++ b/src/tint/lang/wgsl/ast/transform/std140.cc
@@ -132,11 +132,11 @@
     /// @returns true if this transform should be run for the given program
     bool ShouldRun() const {
         // Returns true if the type needs to be forked for std140 usage.
-        auto needs_fork = [&](const type::Type* ty) {
-            while (auto* arr = ty->As<type::Array>()) {
+        auto needs_fork = [&](const core::type::Type* ty) {
+            while (auto* arr = ty->As<core::type::Array>()) {
                 ty = arr->ElemType();
             }
-            if (auto* mat = ty->As<type::Matrix>()) {
+            if (auto* mat = ty->As<core::type::Matrix>()) {
                 if (MatrixNeedsDecomposing(mat)) {
                     return true;
                 }
@@ -146,7 +146,7 @@
 
         // Scan structures for members that need forking
         for (auto* ty : src->Types()) {
-            if (auto* str = ty->As<type::Struct>()) {
+            if (auto* str = ty->As<core::type::Struct>()) {
                 if (str->UsedAs(core::AddressSpace::kUniform)) {
                     for (auto* member : str->Members()) {
                         if (needs_fork(member->Type())) {
@@ -222,17 +222,18 @@
     Hashmap<LoadFnKey, Symbol, 8, LoadFnKey::Hasher> load_fns;
 
     /// Map of std140-forked type to converter function name
-    Hashmap<const type::Type*, Symbol, 8> conv_fns;
+    Hashmap<const core::type::Type*, Symbol, 8> conv_fns;
 
     // Uniform variables that have been modified to use a std140 type
     Hashset<const sem::Variable*, 8> std140_uniforms;
 
     // Map of original structure to 'std140' forked structure
-    Hashmap<const type::Struct*, Symbol, 8> std140_structs;
+    Hashmap<const core::type::Struct*, Symbol, 8> std140_structs;
 
     // Map of structure member in src of a matrix type, to list of decomposed column
     // members in ctx.dst.
-    Hashmap<const type::StructMember*, tint::Vector<const StructMember*, 4>, 8> std140_mat_members;
+    Hashmap<const core::type::StructMember*, tint::Vector<const StructMember*, 4>, 8>
+        std140_mat_members;
 
     /// Describes a matrix that has been forked to a std140-structure holding the decomposed column
     /// vectors of the matrix.
@@ -244,7 +245,7 @@
     };
 
     // Map of matrix type in src, to decomposed column structure in ctx.dst.
-    Hashmap<const type::Matrix*, Std140Matrix, 8> std140_mats;
+    Hashmap<const core::type::Matrix*, Std140Matrix, 8> std140_mats;
 
     /// AccessChain describes a chain of access expressions to uniform buffer variable.
     struct AccessChain {
@@ -256,7 +257,7 @@
         tint::Vector<const sem::ValueExpression*, 8> dynamic_indices;
         /// The type of the std140-decomposed matrix being accessed.
         /// May be nullptr if the chain does not pass through a std140-decomposed matrix.
-        const type::Matrix* std140_mat_ty = nullptr;
+        const core::type::Matrix* std140_mat_ty = nullptr;
         /// The index in #indices of the access that resolves to the std140-decomposed matrix.
         /// May hold no value if the chain does not pass through a std140-decomposed matrix.
         std::optional<size_t> std140_mat_idx;
@@ -269,7 +270,7 @@
 
     /// @returns true if the given matrix needs decomposing to column vectors for std140 layout.
     /// Std140 layout require matrix stride to be 16, otherwise decomposing is needed.
-    static bool MatrixNeedsDecomposing(const type::Matrix* mat) {
+    static bool MatrixNeedsDecomposing(const core::type::Matrix* mat) {
         return mat->ColumnStride() != 16;
     }
 
@@ -287,7 +288,7 @@
                 bool fork_std140 = false;
                 tint::Vector<const StructMember*, 8> members;
                 for (auto* member : str->Members()) {
-                    if (auto* mat = member->Type()->As<type::Matrix>()) {
+                    if (auto* mat = member->Type()->As<core::type::Matrix>()) {
                         // Is this member a matrix that needs decomposition for std140-layout?
                         if (MatrixNeedsDecomposing(mat)) {
                             // Structure member of matrix type needs decomposition.
@@ -399,16 +400,16 @@
     ///          If the semantic type is not split for std140-layout, then nullptr is returned.
     /// @note will construct new std140 structures to hold decomposed matrices, populating
     ///       #std140_mats.
-    Type Std140Type(const type::Type* ty) {
+    Type Std140Type(const core::type::Type* ty) {
         return Switch(
             ty,  //
-            [&](const type::Struct* str) {
+            [&](const core::type::Struct* str) {
                 if (auto std140 = std140_structs.Find(str)) {
                     return b.ty(*std140);
                 }
                 return Type{};
             },
-            [&](const type::Matrix* mat) {
+            [&](const core::type::Matrix* mat) {
                 if (MatrixNeedsDecomposing(mat)) {
                     auto std140_mat = std140_mats.GetOrCreate(mat, [&] {
                         auto name = b.Symbols().New("mat" + std::to_string(mat->columns()) + "x" +
@@ -427,7 +428,7 @@
                 }
                 return Type{};
             },
-            [&](const type::Array* arr) {
+            [&](const core::type::Array* arr) {
                 if (auto std140 = Std140Type(arr->ElemType())) {
                     tint::Vector<const Attribute*, 1> attrs;
                     if (!arr->IsStrideImplicit()) {
@@ -454,7 +455,7 @@
     /// @param size the size in bytes of the matrix.
     /// @returns a vector of decomposed matrix column vectors as structure members (in ctx.dst).
     tint::Vector<const StructMember*, 4> DecomposedMatrixStructMembers(
-        const type::Matrix* mat,
+        const core::type::Matrix* mat,
         const std::string& name_prefix,
         uint32_t align,
         uint32_t size) {
@@ -517,7 +518,7 @@
                         access.indices.Push(UniformVariable{});
                         return Action::kStop;
                     }
-                    if (TINT_LIKELY(user->Variable()->Type()->Is<type::Pointer>())) {
+                    if (TINT_LIKELY(user->Variable()->Type()->Is<core::type::Pointer>())) {
                         // Found a pointer. As the root identifier is a uniform buffer variable,
                         // this must be a pointer-let. Continue traversing from the let
                         // initializer.
@@ -533,7 +534,7 @@
                     if (std140_mat_members.Contains(a->Member())) {
                         // Record this on the access.
                         access.std140_mat_idx = access.indices.Length();
-                        access.std140_mat_ty = expr->Type()->UnwrapRef()->As<type::Matrix>();
+                        access.std140_mat_ty = expr->Type()->UnwrapRef()->As<core::type::Matrix>();
                     }
                     // Structure member accesses are always statically indexed
                     access.indices.Push(u32(a->Member()->Index()));
@@ -551,7 +552,7 @@
                     expr = a->Object();
 
                     // Is the object a std140 decomposed matrix?
-                    if (auto* mat = expr->Type()->UnwrapRef()->As<type::Matrix>()) {
+                    if (auto* mat = expr->Type()->UnwrapRef()->As<core::type::Matrix>()) {
                         if (std140_mats.Contains(mat)) {
                             // Record this on the access.
                             access.std140_mat_idx = access.indices.Length();
@@ -623,11 +624,11 @@
 
     /// @returns a name suffix for a std140 -> non-std140 conversion function based on the type
     ///          being converted.
-    const std::string ConvertSuffix(const type::Type* ty) {
+    const std::string ConvertSuffix(const core::type::Type* ty) {
         return Switch(
             ty,  //
-            [&](const type::Struct* str) { return str->Name().Name(); },
-            [&](const type::Array* arr) {
+            [&](const core::type::Struct* str) { return str->Name().Name(); },
+            [&](const core::type::Array* arr) {
                 auto count = arr->ConstantCount();
                 if (TINT_UNLIKELY(!count)) {
                     // Non-constant counts should not be possible:
@@ -639,12 +640,12 @@
                 }
                 return "arr" + std::to_string(count.value()) + "_" + ConvertSuffix(arr->ElemType());
             },
-            [&](const type::Matrix* mat) {
+            [&](const core::type::Matrix* mat) {
                 return "mat" + std::to_string(mat->columns()) + "x" + std::to_string(mat->rows()) +
                        "_" + ConvertSuffix(mat->type());
             },
-            [&](const type::F32*) { return "f32"; },  //
-            [&](const type::F16*) { return "f16"; },
+            [&](const core::type::F32*) { return "f32"; },  //
+            [&](const core::type::F16*) { return "f16"; },
             [&](Default) {
                 TINT_ICE() << "unhandled type for conversion name: " << ty->FriendlyName();
                 return "";
@@ -656,7 +657,7 @@
     /// @param chain the access chain from a uniform buffer to the value to load.
     const Expression* LoadWithConvert(const AccessChain& chain) {
         const Expression* expr = nullptr;
-        const type::Type* ty = nullptr;
+        const core::type::Type* ty = nullptr;
         auto dynamic_index = [&](size_t idx) {
             return ctx.Clone(chain.dynamic_indices[idx]->Declaration());
         };
@@ -672,7 +673,7 @@
     /// std140-forked type to the type @p ty. If @p expr is not a std140-forked type, then Convert()
     /// will simply return @p expr.
     /// @returns the converted value expression.
-    const Expression* Convert(const type::Type* ty, const Expression* expr) {
+    const Expression* Convert(const core::type::Type* ty, const Expression* expr) {
         // Get an existing, or create a new function for converting the std140 type to ty.
         auto fn = conv_fns.GetOrCreate(ty, [&] {
             auto std140_ty = Std140Type(ty);
@@ -688,7 +689,7 @@
 
             Switch(
                 ty,  //
-                [&](const type::Struct* str) {
+                [&](const core::type::Struct* str) {
                     // Convert each of the structure members using either a converter function
                     // call, or by reassembling a std140 matrix from column vector members.
                     tint::Vector<const Expression*, 8> args;
@@ -709,7 +710,7 @@
                     }
                     stmts.Push(b.Return(b.Call(CreateASTTypeFor(ctx, ty), std::move(args))));
                 },  //
-                [&](const type::Matrix* mat) {
+                [&](const core::type::Matrix* mat) {
                     // Reassemble a std140 matrix from the structure of column vector members.
                     auto std140_mat = std140_mats.Get(mat);
                     if (TINT_LIKELY(std140_mat)) {
@@ -725,7 +726,7 @@
                             << "failed to find std140 matrix info for: " << ty->FriendlyName();
                     }
                 },  //
-                [&](const type::Array* arr) {
+                [&](const core::type::Array* arr) {
                     // Converting an array. Create a function var for the converted array, and
                     // loop over the input elements, converting each and assigning the result to
                     // the local array.
@@ -810,7 +811,7 @@
         };
 
         const Expression* expr = nullptr;
-        const type::Type* ty = nullptr;
+        const core::type::Type* ty = nullptr;
 
         // Build the expression up to, but not including the matrix member
         auto std140_mat_idx = *chain.std140_mat_idx;
@@ -824,13 +825,13 @@
         // As this is accessing only part of the matrix, we just need to pick the right column
         // vector member.
         auto column_idx = std::get<u32>(chain.indices[std140_mat_idx + 1]);
-        if (auto* str = tint::As<type::Struct>(ty)) {
+        if (auto* str = tint::As<core::type::Struct>(ty)) {
             // Structure member matrix. The columns are decomposed into the structure.
             auto mat_member_idx = std::get<u32>(chain.indices[std140_mat_idx]);
             auto* mat_member = str->Members()[mat_member_idx];
             auto mat_columns = *std140_mat_members.Get(mat_member);
             expr = b.MemberAccessor(expr, mat_columns[column_idx]->name->symbol);
-            ty = mat_member->Type()->As<type::Matrix>()->ColumnType();
+            ty = mat_member->Type()->As<core::type::Matrix>()->ColumnType();
         } else {
             // Non-structure-member matrix. The columns are decomposed into a new, bespoke std140
             // structure.
@@ -838,8 +839,8 @@
                 BuildAccessExpr(expr, ty, chain, std140_mat_idx, dynamic_index);
             expr = new_expr;
             ty = new_ty;
-            auto* mat = ty->As<type::Matrix>();
-            auto std140_mat = std140_mats.Get(ty->As<type::Matrix>());
+            auto* mat = ty->As<core::type::Matrix>();
+            auto std140_mat = std140_mats.Get(ty->As<core::type::Matrix>());
             expr = b.MemberAccessor(expr, std140_mat->columns[column_idx]);
             ty = mat->ColumnType();
         }
@@ -886,13 +887,13 @@
         tint::Vector<const CaseStatement*, 4> cases;
 
         // The function return type.
-        const type::Type* ret_ty = nullptr;
+        const core::type::Type* ret_ty = nullptr;
 
         // Build switch() cases for each column of the matrix
         auto num_columns = chain.std140_mat_ty->columns();
         for (uint32_t column_idx = 0; column_idx < num_columns; column_idx++) {
             const Expression* expr = nullptr;
-            const type::Type* ty = nullptr;
+            const core::type::Type* ty = nullptr;
 
             // Build the expression up to, but not including the matrix
             for (size_t i = 0; i < std140_mat_idx; i++) {
@@ -905,7 +906,7 @@
                 }
             }
 
-            if (auto* str = tint::As<type::Struct>(ty)) {
+            if (auto* str = tint::As<core::type::Struct>(ty)) {
                 // Structure member matrix. The columns are decomposed into the structure.
                 auto mat_member_idx = std::get<u32>(chain.indices[std140_mat_idx]);
                 auto* mat_member = str->Members()[mat_member_idx];
@@ -915,7 +916,7 @@
                 }
                 auto mat_columns = *std140_mat_members.Get(mat_member);
                 expr = b.MemberAccessor(expr, mat_columns[column_idx]->name->symbol);
-                ty = mat_member->Type()->As<type::Matrix>()->ColumnType();
+                ty = mat_member->Type()->As<core::type::Matrix>()->ColumnType();
             } else {
                 // Non-structure-member matrix. The columns are decomposed into a new, bespoke
                 // std140 structure.
@@ -926,8 +927,8 @@
                 if (column_idx == 0) {
                     name += "_" + mat_name + "_p" + std::to_string(column_param_idx);
                 }
-                auto* mat = ty->As<type::Matrix>();
-                auto std140_mat = std140_mats.Get(ty->As<type::Matrix>());
+                auto* mat = ty->As<core::type::Matrix>();
+                auto std140_mat = std140_mats.Get(ty->As<core::type::Matrix>());
                 expr = b.MemberAccessor(expr, std140_mat->columns[column_idx]);
                 ty = mat->ColumnType();
             }
@@ -984,7 +985,7 @@
         };
 
         const Expression* expr = nullptr;
-        const type::Type* ty = nullptr;
+        const core::type::Type* ty = nullptr;
         std::string name = "load";
 
         // Build the expression up to, but not including the matrix member
@@ -1004,7 +1005,7 @@
         stmts.Push(b.Decl(let));
 
         tint::Vector<const MemberAccessorExpression*, 4> columns;
-        if (auto* str = tint::As<type::Struct>(ty)) {
+        if (auto* str = tint::As<core::type::Struct>(ty)) {
             // Structure member matrix. The columns are decomposed into the structure.
             auto mat_member_idx = std::get<u32>(chain.indices[std140_mat_idx]);
             auto* mat_member = str->Members()[mat_member_idx];
@@ -1020,8 +1021,8 @@
             auto [new_expr, new_ty, mat_name] =
                 BuildAccessExpr(expr, ty, chain, std140_mat_idx, dynamic_index);
             expr = new_expr;
-            auto* mat = ty->As<type::Matrix>();
-            auto std140_mat = std140_mats.Get(ty->As<type::Matrix>());
+            auto* mat = ty->As<core::type::Matrix>();
+            auto std140_mat = std140_mats.Get(ty->As<core::type::Matrix>());
             columns = tint::Transform(std140_mat->columns, [&](auto column_name) {
                 return b.MemberAccessor(b.Deref(let), column_name);
             });
@@ -1047,7 +1048,7 @@
         /// The new, post-access expression
         const Expression* expr;
         /// The type of #expr
-        const type::Type* type;
+        const core::type::Type* type;
         /// A name segment which can be used to build sensible names for helper functions
         std::string name;
     };
@@ -1060,7 +1061,7 @@
     /// @returns a ExprTypeName which holds the new expression, new type and a name segment which
     ///          can be used for creating helper function names.
     ExprTypeName BuildAccessExpr(const Expression* lhs,
-                                 const type::Type* ty,
+                                 const core::type::Type* ty,
                                  const AccessChain& chain,
                                  size_t index,
                                  std::function<const Expression*(size_t)> dynamic_index) {
@@ -1079,17 +1080,17 @@
             auto name = "p" + std::to_string(dyn_idx->slot);
             return Switch(
                 ty,  //
-                [&](const type::Array* arr) -> ExprTypeName {
+                [&](const core::type::Array* arr) -> ExprTypeName {
                     auto* idx = dynamic_index(dyn_idx->slot);
                     auto* expr = b.IndexAccessor(lhs, idx);
                     return {expr, arr->ElemType(), name};
                 },  //
-                [&](const type::Matrix* mat) -> ExprTypeName {
+                [&](const core::type::Matrix* mat) -> ExprTypeName {
                     auto* idx = dynamic_index(dyn_idx->slot);
                     auto* expr = b.IndexAccessor(lhs, idx);
                     return {expr, mat->ColumnType(), name};
                 },  //
-                [&](const type::Vector* vec) -> ExprTypeName {
+                [&](const core::type::Vector* vec) -> ExprTypeName {
                     auto* idx = dynamic_index(dyn_idx->slot);
                     auto* expr = b.IndexAccessor(lhs, idx);
                     return {expr, vec->type(), name};
@@ -1103,13 +1104,13 @@
             /// The access is a vector swizzle.
             return Switch(
                 ty,  //
-                [&](const type::Vector* vec) -> ExprTypeName {
+                [&](const core::type::Vector* vec) -> ExprTypeName {
                     static const char xyzw[] = {'x', 'y', 'z', 'w'};
                     std::string rhs;
                     for (auto el : *swizzle) {
                         rhs += xyzw[el];
                     }
-                    auto swizzle_ty = src->Types().Find<type::Vector>(
+                    auto swizzle_ty = src->Types().Find<core::type::Vector>(
                         vec->type(), static_cast<uint32_t>(swizzle->Length()));
                     auto* expr = b.MemberAccessor(lhs, rhs);
                     return {expr, swizzle_ty, rhs};
@@ -1123,22 +1124,22 @@
         auto idx = std::get<u32>(access);
         return Switch(
             ty,  //
-            [&](const type::Struct* str) -> ExprTypeName {
+            [&](const core::type::Struct* str) -> ExprTypeName {
                 auto* member = str->Members()[idx];
                 auto member_name = member->Name().Name();
                 auto* expr = b.MemberAccessor(lhs, member_name);
                 ty = member->Type();
                 return {expr, ty, member_name};
             },  //
-            [&](const type::Array* arr) -> ExprTypeName {
+            [&](const core::type::Array* arr) -> ExprTypeName {
                 auto* expr = b.IndexAccessor(lhs, idx);
                 return {expr, arr->ElemType(), std::to_string(idx)};
             },  //
-            [&](const type::Matrix* mat) -> ExprTypeName {
+            [&](const core::type::Matrix* mat) -> ExprTypeName {
                 auto* expr = b.IndexAccessor(lhs, idx);
                 return {expr, mat->ColumnType(), std::to_string(idx)};
             },  //
-            [&](const type::Vector* vec) -> ExprTypeName {
+            [&](const core::type::Vector* vec) -> ExprTypeName {
                 auto* expr = b.IndexAccessor(lhs, idx);
                 return {expr, vec->type(), std::to_string(idx)};
             },  //
diff --git a/src/tint/lang/wgsl/ast/transform/substitute_override.cc b/src/tint/lang/wgsl/ast/transform/substitute_override.cc
index 817b1bf..07cd479 100644
--- a/src/tint/lang/wgsl/ast/transform/substitute_override.cc
+++ b/src/tint/lang/wgsl/ast/transform/substitute_override.cc
@@ -85,11 +85,11 @@
         auto value = iter->second;
         auto* ctor = Switch(
             sem->Type(),
-            [&](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)); });
+            [&](const core::type::Bool*) { return b.Expr(!std::equal_to<double>()(value, 0.0)); },
+            [&](const core::type::I32*) { return b.Expr(i32(value)); },
+            [&](const core::type::U32*) { return b.Expr(u32(value)); },
+            [&](const core::type::F32*) { return b.Expr(f32(value)); },
+            [&](const core::type::F16*) { return b.Expr(f16(value)); });
 
         if (!ctor) {
             b.Diagnostics().add_error(diag::System::Transform,
diff --git a/src/tint/lang/wgsl/ast/transform/texture_1d_to_2d.cc b/src/tint/lang/wgsl/ast/transform/texture_1d_to_2d.cc
index e038ba1..f0cc8c8 100644
--- a/src/tint/lang/wgsl/ast/transform/texture_1d_to_2d.cc
+++ b/src/tint/lang/wgsl/ast/transform/texture_1d_to_2d.cc
@@ -40,8 +40,8 @@
                 const auto& signature = builtin->Signature();
                 auto texture = signature.Parameter(core::ParameterUsage::kTexture);
                 if (texture) {
-                    auto* tex = texture->Type()->As<type::Texture>();
-                    if (tex->dim() == type::TextureDimension::k1d) {
+                    auto* tex = texture->Type()->As<core::type::Texture>();
+                    if (tex->dim() == core::type::TextureDimension::k1d) {
                         return true;
                     }
                 }
@@ -51,11 +51,11 @@
     for (auto* var : program->AST().GlobalVariables()) {
         if (Switch(
                 program->Sem().Get(var)->Type()->UnwrapRef(),
-                [&](const type::SampledTexture* tex) {
-                    return tex->dim() == type::TextureDimension::k1d;
+                [&](const core::type::SampledTexture* tex) {
+                    return tex->dim() == core::type::TextureDimension::k1d;
                 },
-                [&](const type::StorageTexture* storage_tex) {
-                    return storage_tex->dim() == type::TextureDimension::k1d;
+                [&](const core::type::StorageTexture* storage_tex) {
+                    return storage_tex->dim() == core::type::TextureDimension::k1d;
                 })) {
             return true;
         }
@@ -98,18 +98,18 @@
         ctx.ReplaceAll([&](const Variable* v) -> const Variable* {
             const Variable* r = Switch(
                 sem.Get(v)->Type()->UnwrapRef(),
-                [&](const type::SampledTexture* tex) -> const Variable* {
-                    if (tex->dim() == type::TextureDimension::k1d) {
-                        auto type = ctx.dst->ty.sampled_texture(type::TextureDimension::k2d,
+                [&](const core::type::SampledTexture* tex) -> const Variable* {
+                    if (tex->dim() == core::type::TextureDimension::k1d) {
+                        auto type = ctx.dst->ty.sampled_texture(core::type::TextureDimension::k2d,
                                                                 CreateASTTypeFor(ctx, tex->type()));
                         return create_var(v, type);
                     } else {
                         return nullptr;
                     }
                 },
-                [&](const type::StorageTexture* storage_tex) -> const Variable* {
-                    if (storage_tex->dim() == type::TextureDimension::k1d) {
-                        auto type = ctx.dst->ty.storage_texture(type::TextureDimension::k2d,
+                [&](const core::type::StorageTexture* storage_tex) -> const Variable* {
+                    if (storage_tex->dim() == core::type::TextureDimension::k1d) {
+                        auto type = ctx.dst->ty.storage_texture(core::type::TextureDimension::k2d,
                                                                 storage_tex->texel_format(),
                                                                 storage_tex->access());
                         return create_var(v, type);
@@ -135,8 +135,8 @@
             if (!texture) {
                 return nullptr;
             }
-            auto* tex = texture->Type()->As<type::Texture>();
-            if (tex->dim() != type::TextureDimension::k1d) {
+            auto* tex = texture->Type()->As<core::type::Texture>();
+            if (tex->dim() != core::type::TextureDimension::k1d) {
                 return nullptr;
             }
 
diff --git a/src/tint/lang/wgsl/ast/transform/transform.cc b/src/tint/lang/wgsl/ast/transform/transform.cc
index 8c78229..fc3006f 100644
--- a/src/tint/lang/wgsl/ast/transform/transform.cc
+++ b/src/tint/lang/wgsl/ast/transform/transform.cc
@@ -64,30 +64,30 @@
     TINT_ICE() << "unable to remove statement from parent of type " << sem->TypeInfo().name;
 }
 
-Type Transform::CreateASTTypeFor(program::CloneContext& ctx, const type::Type* ty) {
-    if (ty->Is<type::Void>()) {
+Type Transform::CreateASTTypeFor(program::CloneContext& ctx, const core::type::Type* ty) {
+    if (ty->Is<core::type::Void>()) {
         return Type{};
     }
-    if (ty->Is<type::I32>()) {
+    if (ty->Is<core::type::I32>()) {
         return ctx.dst->ty.i32();
     }
-    if (ty->Is<type::U32>()) {
+    if (ty->Is<core::type::U32>()) {
         return ctx.dst->ty.u32();
     }
-    if (ty->Is<type::F16>()) {
+    if (ty->Is<core::type::F16>()) {
         return ctx.dst->ty.f16();
     }
-    if (ty->Is<type::F32>()) {
+    if (ty->Is<core::type::F32>()) {
         return ctx.dst->ty.f32();
     }
-    if (ty->Is<type::Bool>()) {
+    if (ty->Is<core::type::Bool>()) {
         return ctx.dst->ty.bool_();
     }
-    if (auto* m = ty->As<type::Matrix>()) {
+    if (auto* m = ty->As<core::type::Matrix>()) {
         auto el = CreateASTTypeFor(ctx, m->type());
         return ctx.dst->ty.mat(el, m->columns(), m->rows());
     }
-    if (auto* v = ty->As<type::Vector>()) {
+    if (auto* v = ty->As<core::type::Vector>()) {
         auto el = CreateASTTypeFor(ctx, v->type());
         if (v->Packed()) {
             TINT_ASSERT(v->Width() == 3u);
@@ -96,13 +96,13 @@
             return ctx.dst->ty.vec(el, v->Width());
         }
     }
-    if (auto* a = ty->As<type::Array>()) {
+    if (auto* a = ty->As<core::type::Array>()) {
         auto el = CreateASTTypeFor(ctx, a->ElemType());
         tint::Vector<const Attribute*, 1> attrs;
         if (!a->IsStrideImplicit()) {
             attrs.Push(ctx.dst->create<StrideAttribute>(a->Stride()));
         }
-        if (a->Count()->Is<type::RuntimeArrayCount>()) {
+        if (a->Count()->Is<core::type::RuntimeArrayCount>()) {
             return ctx.dst->ty.array(el, std::move(attrs));
         }
         if (auto* override = a->Count()->As<sem::NamedOverrideArrayCount>()) {
@@ -128,43 +128,43 @@
         }
         auto count = a->ConstantCount();
         if (TINT_UNLIKELY(!count)) {
-            TINT_ICE() << type::Array::kErrExpectedConstantCount;
+            TINT_ICE() << core::type::Array::kErrExpectedConstantCount;
             return ctx.dst->ty.array(el, u32(1), std::move(attrs));
         }
         return ctx.dst->ty.array(el, u32(count.value()), std::move(attrs));
     }
-    if (auto* s = ty->As<type::Struct>()) {
+    if (auto* s = ty->As<core::type::Struct>()) {
         return ctx.dst->ty(ctx.Clone(s->Name()));
     }
-    if (auto* s = ty->As<type::Reference>()) {
+    if (auto* s = ty->As<core::type::Reference>()) {
         return CreateASTTypeFor(ctx, s->StoreType());
     }
-    if (auto* a = ty->As<type::Atomic>()) {
+    if (auto* a = ty->As<core::type::Atomic>()) {
         return ctx.dst->ty.atomic(CreateASTTypeFor(ctx, a->Type()));
     }
-    if (auto* t = ty->As<type::DepthTexture>()) {
+    if (auto* t = ty->As<core::type::DepthTexture>()) {
         return ctx.dst->ty.depth_texture(t->dim());
     }
-    if (auto* t = ty->As<type::DepthMultisampledTexture>()) {
+    if (auto* t = ty->As<core::type::DepthMultisampledTexture>()) {
         return ctx.dst->ty.depth_multisampled_texture(t->dim());
     }
-    if (ty->Is<type::ExternalTexture>()) {
+    if (ty->Is<core::type::ExternalTexture>()) {
         return ctx.dst->ty.external_texture();
     }
-    if (auto* t = ty->As<type::MultisampledTexture>()) {
+    if (auto* t = ty->As<core::type::MultisampledTexture>()) {
         return ctx.dst->ty.multisampled_texture(t->dim(), CreateASTTypeFor(ctx, t->type()));
     }
-    if (auto* t = ty->As<type::SampledTexture>()) {
+    if (auto* t = ty->As<core::type::SampledTexture>()) {
         return ctx.dst->ty.sampled_texture(t->dim(), CreateASTTypeFor(ctx, t->type()));
     }
-    if (auto* t = ty->As<type::StorageTexture>()) {
+    if (auto* t = ty->As<core::type::StorageTexture>()) {
         return ctx.dst->ty.storage_texture(t->dim(), t->texel_format(), t->access());
     }
-    if (auto* s = ty->As<type::Sampler>()) {
+    if (auto* s = ty->As<core::type::Sampler>()) {
         return ctx.dst->ty.sampler(s->kind());
     }
-    if (auto* p = ty->As<type::Pointer>()) {
-        // Note: type::Pointer always has an inferred access, but WGSL only allows an explicit
+    if (auto* p = ty->As<core::type::Pointer>()) {
+        // Note: core::type::Pointer always has an inferred access, but WGSL only allows an explicit
         // access in the 'storage' address space.
         auto address_space = p->AddressSpace();
         auto access =
diff --git a/src/tint/lang/wgsl/ast/transform/transform.h b/src/tint/lang/wgsl/ast/transform/transform.h
index b5a461a..8e7400c 100644
--- a/src/tint/lang/wgsl/ast/transform/transform.h
+++ b/src/tint/lang/wgsl/ast/transform/transform.h
@@ -88,7 +88,7 @@
     /// @param ctx the clone context
     /// @param ty the semantic type to reconstruct
     /// @returns an Type that when resolved, will produce the semantic type `ty`.
-    static Type CreateASTTypeFor(program::CloneContext& ctx, const type::Type* ty);
+    static Type CreateASTTypeFor(program::CloneContext& ctx, const core::type::Type* ty);
 
   protected:
     /// Removes the statement `stmt` from the transformed program.
diff --git a/src/tint/lang/wgsl/ast/transform/transform_test.cc b/src/tint/lang/wgsl/ast/transform/transform_test.cc
index f708ec9..0c6de47 100644
--- a/src/tint/lang/wgsl/ast/transform/transform_test.cc
+++ b/src/tint/lang/wgsl/ast/transform/transform_test.cc
@@ -33,7 +33,7 @@
         return SkipTransform;
     }
 
-    Type create(std::function<type::Type*(ProgramBuilder&)> create_sem_type) {
+    Type create(std::function<core::type::Type*(ProgramBuilder&)> create_sem_type) {
         ProgramBuilder sem_type_builder;
         auto* sem_type = create_sem_type(sem_type_builder);
         Program program = resolver::Resolve(sem_type_builder);
@@ -47,33 +47,35 @@
 TEST_F(CreateASTTypeForTest, Basic) {
     auto check = [&](Type ty, const char* expect) { CheckIdentifier(ty->identifier, expect); };
 
-    check(create([](ProgramBuilder& b) { return b.create<type::I32>(); }), "i32");
-    check(create([](ProgramBuilder& b) { return b.create<type::U32>(); }), "u32");
-    check(create([](ProgramBuilder& b) { return b.create<type::F32>(); }), "f32");
-    check(create([](ProgramBuilder& b) { return b.create<type::Bool>(); }), "bool");
-    EXPECT_EQ(create([](ProgramBuilder& b) { return b.create<type::Void>(); }), nullptr);
+    check(create([](ProgramBuilder& b) { return b.create<core::type::I32>(); }), "i32");
+    check(create([](ProgramBuilder& b) { return b.create<core::type::U32>(); }), "u32");
+    check(create([](ProgramBuilder& b) { return b.create<core::type::F32>(); }), "f32");
+    check(create([](ProgramBuilder& b) { return b.create<core::type::Bool>(); }), "bool");
+    EXPECT_EQ(create([](ProgramBuilder& b) { return b.create<core::type::Void>(); }), nullptr);
 }
 
 TEST_F(CreateASTTypeForTest, Matrix) {
     auto mat = create([](ProgramBuilder& b) {
-        auto* column_type = b.create<type::Vector>(b.create<type::F32>(), 2u);
-        return b.create<type::Matrix>(column_type, 3u);
+        auto* column_type = b.create<core::type::Vector>(b.create<core::type::F32>(), 2u);
+        return b.create<core::type::Matrix>(column_type, 3u);
     });
 
     CheckIdentifier(mat, Template("mat3x2", "f32"));
 }
 
 TEST_F(CreateASTTypeForTest, Vector) {
-    auto vec =
-        create([](ProgramBuilder& b) { return b.create<type::Vector>(b.create<type::F32>(), 2u); });
+    auto vec = create([](ProgramBuilder& b) {
+        return b.create<core::type::Vector>(b.create<core::type::F32>(), 2u);
+    });
 
     CheckIdentifier(vec, Template("vec2", "f32"));
 }
 
 TEST_F(CreateASTTypeForTest, ArrayImplicitStride) {
     auto arr = create([](ProgramBuilder& b) {
-        return b.create<type::Array>(b.create<type::F32>(), b.create<type::ConstantArrayCount>(2u),
-                                     4u, 4u, 32u, 32u);
+        return b.create<core::type::Array>(b.create<core::type::F32>(),
+                                           b.create<core::type::ConstantArrayCount>(2u), 4u, 4u,
+                                           32u, 32u);
     });
 
     CheckIdentifier(arr, Template("array", "f32", 2_u));
@@ -84,8 +86,9 @@
 
 TEST_F(CreateASTTypeForTest, ArrayNonImplicitStride) {
     auto arr = create([](ProgramBuilder& b) {
-        return b.create<type::Array>(b.create<type::F32>(), b.create<type::ConstantArrayCount>(2u),
-                                     4u, 4u, 64u, 32u);
+        return b.create<core::type::Array>(b.create<core::type::F32>(),
+                                           b.create<core::type::ConstantArrayCount>(2u), 4u, 4u,
+                                           64u, 32u);
     });
     CheckIdentifier(arr, Template("array", "f32", 2_u));
     auto* tmpl_attr = arr->identifier->As<TemplatedIdentifier>();
@@ -128,8 +131,8 @@
 
 TEST_F(CreateASTTypeForTest, PrivatePointer) {
     auto ptr = create([](ProgramBuilder& b) {
-        return b.create<type::Pointer>(core::AddressSpace::kPrivate, b.create<type::I32>(),
-                                       core::Access::kReadWrite);
+        return b.create<core::type::Pointer>(core::AddressSpace::kPrivate,
+                                             b.create<core::type::I32>(), core::Access::kReadWrite);
     });
 
     CheckIdentifier(ptr, Template("ptr", "private", "i32"));
@@ -137,8 +140,8 @@
 
 TEST_F(CreateASTTypeForTest, StorageReadWritePointer) {
     auto ptr = create([](ProgramBuilder& b) {
-        return b.create<type::Pointer>(core::AddressSpace::kStorage, b.create<type::I32>(),
-                                       core::Access::kReadWrite);
+        return b.create<core::type::Pointer>(core::AddressSpace::kStorage,
+                                             b.create<core::type::I32>(), core::Access::kReadWrite);
     });
 
     CheckIdentifier(ptr, Template("ptr", "storage", "i32", "read_write"));
diff --git a/src/tint/lang/wgsl/ast/transform/var_for_dynamic_index.cc b/src/tint/lang/wgsl/ast/transform/var_for_dynamic_index.cc
index cbbd881..70df29f 100644
--- a/src/tint/lang/wgsl/ast/transform/var_for_dynamic_index.cc
+++ b/src/tint/lang/wgsl/ast/transform/var_for_dynamic_index.cc
@@ -51,7 +51,7 @@
         }
 
         auto* indexed = sem.GetVal(object_expr);
-        if (!indexed->Type()->IsAnyOf<type::Array, type::Matrix>()) {
+        if (!indexed->Type()->IsAnyOf<core::type::Array, core::type::Matrix>()) {
             // We only care about array and matrices.
             return true;
         }
diff --git a/src/tint/lang/wgsl/ast/transform/vectorize_matrix_conversions.cc b/src/tint/lang/wgsl/ast/transform/vectorize_matrix_conversions.cc
index df9a7a4..83e30ed 100644
--- a/src/tint/lang/wgsl/ast/transform/vectorize_matrix_conversions.cc
+++ b/src/tint/lang/wgsl/ast/transform/vectorize_matrix_conversions.cc
@@ -39,7 +39,7 @@
         if (auto* sem = program->Sem().GetVal(node)) {
             if (auto* call = sem->UnwrapMaterialize()->As<sem::Call>()) {
                 if (call->Target()->Is<sem::ValueConversion>() &&
-                    call->Type()->Is<type::Matrix>()) {
+                    call->Type()->Is<core::type::Matrix>()) {
                     auto& args = call->Arguments();
                     if (args.Length() == 1 && args[0]->Type()->UnwrapRef()->is_float_matrix()) {
                         return true;
@@ -68,7 +68,7 @@
     program::CloneContext ctx{&b, src, /* auto_clone_symbols */ true};
 
     using HelperFunctionKey =
-        tint::UnorderedKeyWrapper<std::tuple<const type::Matrix*, const type::Matrix*>>;
+        tint::UnorderedKeyWrapper<std::tuple<const core::type::Matrix*, const core::type::Matrix*>>;
 
     std::unordered_map<HelperFunctionKey, Symbol> matrix_convs;
 
@@ -78,7 +78,7 @@
         if (!ty_conv) {
             return nullptr;
         }
-        auto* dst_type = call->Type()->As<type::Matrix>();
+        auto* dst_type = call->Type()->As<core::type::Matrix>();
         if (!dst_type) {
             return nullptr;
         }
@@ -90,7 +90,7 @@
 
         auto& matrix = args[0];
 
-        auto* src_type = matrix->Type()->UnwrapRef()->As<type::Matrix>();
+        auto* src_type = matrix->Type()->UnwrapRef()->As<core::type::Matrix>();
         if (!src_type) {
             return nullptr;
         }
diff --git a/src/tint/lang/wgsl/ast/transform/vectorize_scalar_matrix_initializers.cc b/src/tint/lang/wgsl/ast/transform/vectorize_scalar_matrix_initializers.cc
index 52d628d..d670b91 100644
--- a/src/tint/lang/wgsl/ast/transform/vectorize_scalar_matrix_initializers.cc
+++ b/src/tint/lang/wgsl/ast/transform/vectorize_scalar_matrix_initializers.cc
@@ -34,9 +34,10 @@
 bool ShouldRun(const Program* program) {
     for (auto* node : program->ASTNodes().Objects()) {
         if (auto* call = program->Sem().Get<sem::Call>(node)) {
-            if (call->Target()->Is<sem::ValueConstructor>() && call->Type()->Is<type::Matrix>()) {
+            if (call->Target()->Is<sem::ValueConstructor>() &&
+                call->Type()->Is<core::type::Matrix>()) {
                 auto& args = call->Arguments();
-                if (!args.IsEmpty() && args[0]->Type()->UnwrapRef()->Is<type::Scalar>()) {
+                if (!args.IsEmpty() && args[0]->Type()->UnwrapRef()->Is<core::type::Scalar>()) {
                     return true;
                 }
             }
@@ -61,7 +62,7 @@
     ProgramBuilder b;
     program::CloneContext ctx{&b, src, /* auto_clone_symbols */ true};
 
-    std::unordered_map<const type::Matrix*, Symbol> scalar_inits;
+    std::unordered_map<const core::type::Matrix*, Symbol> scalar_inits;
 
     ctx.ReplaceAll([&](const CallExpression* expr) -> const CallExpression* {
         auto* call = src->Sem().Get(expr)->UnwrapMaterialize()->As<sem::Call>();
@@ -69,7 +70,7 @@
         if (!ty_init) {
             return nullptr;
         }
-        auto* mat_type = call->Type()->As<type::Matrix>();
+        auto* mat_type = call->Type()->As<core::type::Matrix>();
         if (!mat_type) {
             return nullptr;
         }
@@ -86,7 +87,7 @@
         if (args[0]
                 ->Type()
                 ->UnwrapRef()
-                ->IsAnyOf<type::Matrix, type::Vector, type::AbstractNumeric>()) {
+                ->IsAnyOf<core::type::Matrix, core::type::Vector, core::type::AbstractNumeric>()) {
             return nullptr;
         }
 
diff --git a/src/tint/lang/wgsl/ast/transform/vertex_pulling.cc b/src/tint/lang/wgsl/ast/transform/vertex_pulling.cc
index ac2fcb3..09faca7 100644
--- a/src/tint/lang/wgsl/ast/transform/vertex_pulling.cc
+++ b/src/tint/lang/wgsl/ast/transform/vertex_pulling.cc
@@ -157,22 +157,22 @@
     }
 }
 
-AttributeWGSLType WGSLTypeOf(const type::Type* ty) {
+AttributeWGSLType WGSLTypeOf(const core::type::Type* ty) {
     return Switch(
         ty,
-        [](const type::I32*) -> AttributeWGSLType {
+        [](const core::type::I32*) -> AttributeWGSLType {
             return {BaseWGSLType::kI32, 1};
         },
-        [](const type::U32*) -> AttributeWGSLType {
+        [](const core::type::U32*) -> AttributeWGSLType {
             return {BaseWGSLType::kU32, 1};
         },
-        [](const type::F32*) -> AttributeWGSLType {
+        [](const core::type::F32*) -> AttributeWGSLType {
             return {BaseWGSLType::kF32, 1};
         },
-        [](const type::F16*) -> AttributeWGSLType {
+        [](const core::type::F16*) -> AttributeWGSLType {
             return {BaseWGSLType::kF16, 1};
         },
-        [](const type::Vector* vec) -> AttributeWGSLType {
+        [](const core::type::Vector* vec) -> AttributeWGSLType {
             return {WGSLTypeOf(vec->type()).base_type, vec->Width()};
         },
         [](Default) -> AttributeWGSLType {
@@ -280,7 +280,7 @@
         /// A builder that builds the expression that resolves to the (transformed) input location
         std::function<const Expression*()> expr;
         /// The store type of the location variable
-        const type::Type* type;
+        const core::type::Type* type;
     };
 
     /// The source program
diff --git a/src/tint/lang/wgsl/ast/transform/zero_init_workgroup_memory.cc b/src/tint/lang/wgsl/ast/transform/zero_init_workgroup_memory.cc
index 3000954..a7d3c87 100644
--- a/src/tint/lang/wgsl/ast/transform/zero_init_workgroup_memory.cc
+++ b/src/tint/lang/wgsl/ast/transform/zero_init_workgroup_memory.cc
@@ -168,7 +168,7 @@
                 }
             }
 
-            if (auto* str = sem.Get(param)->Type()->As<type::Struct>()) {
+            if (auto* str = sem.Get(param)->Type()->As<core::type::Struct>()) {
                 for (auto* member : str->Members()) {
                     if (member->Attributes().builtin == core::BuiltinValue::kLocalInvocationIndex) {
                         local_index = [=] {
@@ -289,7 +289,7 @@
     /// @param ty the expression type
     /// @param get_expr a function that builds the AST nodes for the expression.
     /// @returns true on success, false on failure
-    [[nodiscard]] bool BuildZeroingStatements(const type::Type* ty,
+    [[nodiscard]] bool BuildZeroingStatements(const core::type::Type* ty,
                                               const BuildZeroingExpr& get_expr) {
         if (CanTriviallyZero(ty)) {
             auto var = get_expr(1u);
@@ -302,7 +302,7 @@
             return true;
         }
 
-        if (auto* atomic = ty->As<type::Atomic>()) {
+        if (auto* atomic = ty->As<core::type::Atomic>()) {
             auto* zero_init = b.Call(CreateASTTypeFor(ctx, atomic->Type()));
             auto expr = get_expr(1u);
             if (!expr) {
@@ -314,7 +314,7 @@
             return true;
         }
 
-        if (auto* str = ty->As<type::Struct>()) {
+        if (auto* str = ty->As<core::type::Struct>()) {
             for (auto* member : str->Members()) {
                 auto name = ctx.Clone(member->Name());
                 auto get_member = [&](uint32_t num_values) {
@@ -332,7 +332,7 @@
             return true;
         }
 
-        if (auto* arr = ty->As<type::Array>()) {
+        if (auto* arr = ty->As<core::type::Array>()) {
             auto get_el = [&](uint32_t num_values) {
                 // num_values is the number of values to zero for the element type.
                 // The number of iterations required to zero the array and its elements is:
@@ -342,7 +342,7 @@
                 auto count = arr->ConstantCount();
                 if (!count) {
                     ctx.dst->Diagnostics().add_error(diag::System::Transform,
-                                                     type::Array::kErrExpectedConstantCount);
+                                                     core::type::Array::kErrExpectedConstantCount);
                     return Expression{};  // error
                 }
                 auto modulo = num_values * count.value();
@@ -409,7 +409,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<type::I32>()) {
+                if (ctx.src->TypeOf(expr)->UnwrapRef()->Is<core::type::I32>()) {
                     e = b.Call<u32>(e);
                 }
                 return size ? b.Mul(size(), e) : e;
@@ -435,18 +435,18 @@
     /// then the type needs to be initialized by decomposing the initialization into multiple
     /// sub-initializations.
     /// @param ty the type to inspect
-    bool CanTriviallyZero(const type::Type* ty) {
-        if (ty->Is<type::Atomic>()) {
+    bool CanTriviallyZero(const core::type::Type* ty) {
+        if (ty->Is<core::type::Atomic>()) {
             return false;
         }
-        if (auto* str = ty->As<type::Struct>()) {
+        if (auto* str = ty->As<core::type::Struct>()) {
             for (auto* member : str->Members()) {
                 if (!CanTriviallyZero(member->Type())) {
                     return false;
                 }
             }
         }
-        if (ty->Is<type::Array>()) {
+        if (ty->Is<core::type::Array>()) {
             return false;
         }
         // True for all other storable types
diff --git a/src/tint/lang/wgsl/helpers/append_vector.cc b/src/tint/lang/wgsl/helpers/append_vector.cc
index 1069281..a5c547d 100644
--- a/src/tint/lang/wgsl/helpers/append_vector.cc
+++ b/src/tint/lang/wgsl/helpers/append_vector.cc
@@ -37,7 +37,7 @@
 VectorConstructorInfo AsVectorConstructor(const sem::ValueExpression* expr) {
     if (auto* call = expr->As<sem::Call>()) {
         if (auto* ctor = call->Target()->As<sem::ValueConstructor>()) {
-            if (ctor->ReturnType()->Is<type::Vector>()) {
+            if (ctor->ReturnType()->Is<core::type::Vector>()) {
                 return {call, ctor};
             }
         }
@@ -46,16 +46,16 @@
 }
 
 const sem::ValueExpression* Zero(ProgramBuilder& b,
-                                 const type::Type* ty,
+                                 const core::type::Type* ty,
                                  const sem::Statement* stmt) {
     const ast::Expression* expr = nullptr;
-    if (ty->Is<type::I32>()) {
+    if (ty->Is<core::type::I32>()) {
         expr = b.Expr(0_i);
-    } else if (ty->Is<type::U32>()) {
+    } else if (ty->Is<core::type::U32>()) {
         expr = b.Expr(0_u);
-    } else if (ty->Is<type::F32>()) {
+    } else if (ty->Is<core::type::F32>()) {
         expr = b.Expr(0_f);
-    } else if (ty->Is<type::Bool>()) {
+    } else if (ty->Is<core::type::Bool>()) {
         expr = b.Expr(false);
     } else {
         TINT_UNREACHABLE() << "unsupported vector element type: " << ty->TypeInfo().name;
@@ -74,11 +74,11 @@
                               const ast::Expression* vector_ast,
                               const ast::Expression* scalar_ast) {
     uint32_t packed_size;
-    const type::Type* packed_el_sem_ty;
+    const core::type::Type* packed_el_sem_ty;
     auto* vector_sem = b->Sem().GetVal(vector_ast);
     auto* scalar_sem = b->Sem().GetVal(scalar_ast);
     auto* vector_ty = vector_sem->Type()->UnwrapRef();
-    if (auto* vec = vector_ty->As<type::Vector>()) {
+    if (auto* vec = vector_ty->As<core::type::Vector>()) {
         packed_size = vec->Width() + 1;
         packed_el_sem_ty = vec->type();
     } else {
@@ -88,10 +88,10 @@
 
     auto packed_el_ast_ty = Switch(
         packed_el_sem_ty,  //
-        [&](const type::I32*) { return b->ty.i32(); },
-        [&](const type::U32*) { return b->ty.u32(); },
-        [&](const type::F32*) { return b->ty.f32(); },
-        [&](const type::Bool*) { return b->ty.bool_(); },
+        [&](const core::type::I32*) { return b->ty.i32(); },
+        [&](const core::type::U32*) { return b->ty.u32(); },
+        [&](const core::type::F32*) { return b->ty.f32(); },
+        [&](const core::type::Bool*) { return b->ty.bool_(); },
         [&](Default) {
             TINT_UNREACHABLE() << "unsupported vector element type: "
                                << packed_el_sem_ty->TypeInfo().name;
@@ -101,7 +101,7 @@
     auto* statement = vector_sem->Stmt();
 
     auto packed_ast_ty = b->ty.vec(packed_el_ast_ty, packed_size);
-    auto* packed_sem_ty = b->create<type::Vector>(packed_el_sem_ty, packed_size);
+    auto* packed_sem_ty = b->create<core::type::Vector>(packed_el_sem_ty, packed_size);
 
     // If the coordinates are already passed in a vector constructor, with only
     // scalar components supplied, extract the elements into the new vector
diff --git a/src/tint/lang/wgsl/helpers/append_vector_test.cc b/src/tint/lang/wgsl/helpers/append_vector_test.cc
index f340159..a876d85f 100644
--- a/src/tint/lang/wgsl/helpers/append_vector_test.cc
+++ b/src/tint/lang/wgsl/helpers/append_vector_test.cc
@@ -58,15 +58,15 @@
 
     auto* ctor = call->Target()->As<sem::ValueConstructor>();
     ASSERT_NE(ctor, nullptr);
-    ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>());
-    EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>());
+    ASSERT_TRUE(ctor->ReturnType()->Is<core::type::Vector>());
+    EXPECT_EQ(ctor->ReturnType()->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(ctor->ReturnType()->As<core::type::Vector>()->type()->Is<core::type::I32>());
     EXPECT_EQ(ctor->ReturnType(), call->Type());
 
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    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()[0]->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::I32>());
 }
 
 // AppendVector(vec2<i32>(1, 2), 3u) -> vec3<i32>(1, 2, i32(3u))
@@ -104,15 +104,15 @@
 
     auto* ctor = call->Target()->As<sem::ValueConstructor>();
     ASSERT_NE(ctor, nullptr);
-    ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>());
-    EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>());
+    ASSERT_TRUE(ctor->ReturnType()->Is<core::type::Vector>());
+    EXPECT_EQ(ctor->ReturnType()->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(ctor->ReturnType()->As<core::type::Vector>()->type()->Is<core::type::I32>());
     EXPECT_EQ(ctor->ReturnType(), call->Type());
 
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    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()[0]->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::I32>());
 }
 
 // AppendVector(vec2<i32>(vec2<u32>(1u, 2u)), 3u) ->
@@ -156,14 +156,14 @@
     auto* ctor = call->Target()->As<sem::ValueConstructor>();
     ASSERT_NE(ctor, nullptr);
 
-    ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>());
-    EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>());
+    ASSERT_TRUE(ctor->ReturnType()->Is<core::type::Vector>());
+    EXPECT_EQ(ctor->ReturnType()->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(ctor->ReturnType()->As<core::type::Vector>()->type()->Is<core::type::I32>());
     EXPECT_EQ(ctor->ReturnType(), call->Type());
 
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::I32>());
 }
 
 // AppendVector(vec2<i32>(1, 2), 3.0f) -> vec3<i32>(1, 2, i32(3.0f))
@@ -200,15 +200,15 @@
 
     auto* ctor = call->Target()->As<sem::ValueConstructor>();
     ASSERT_NE(ctor, nullptr);
-    ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>());
-    EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>());
+    ASSERT_TRUE(ctor->ReturnType()->Is<core::type::Vector>());
+    EXPECT_EQ(ctor->ReturnType()->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(ctor->ReturnType()->As<core::type::Vector>()->type()->Is<core::type::I32>());
     EXPECT_EQ(ctor->ReturnType(), call->Type());
 
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    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()[0]->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::I32>());
 }
 
 // AppendVector(vec3<i32>(1, 2, 3), 4) -> vec4<i32>(1, 2, 3, 4)
@@ -244,16 +244,16 @@
 
     auto* ctor = call->Target()->As<sem::ValueConstructor>();
     ASSERT_NE(ctor, nullptr);
-    ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>());
-    EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 4u);
-    EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>());
+    ASSERT_TRUE(ctor->ReturnType()->Is<core::type::Vector>());
+    EXPECT_EQ(ctor->ReturnType()->As<core::type::Vector>()->Width(), 4u);
+    EXPECT_TRUE(ctor->ReturnType()->As<core::type::Vector>()->type()->Is<core::type::I32>());
     EXPECT_EQ(ctor->ReturnType(), call->Type());
 
     ASSERT_EQ(ctor->Parameters().Length(), 4u);
-    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>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[3]->Type()->Is<core::type::I32>());
 }
 
 // AppendVector(vec_12, 3) -> vec3<i32>(vec_12, 3)
@@ -283,14 +283,14 @@
 
     auto* ctor = call->Target()->As<sem::ValueConstructor>();
     ASSERT_NE(ctor, nullptr);
-    ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>());
-    EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>());
+    ASSERT_TRUE(ctor->ReturnType()->Is<core::type::Vector>());
+    EXPECT_EQ(ctor->ReturnType()->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(ctor->ReturnType()->As<core::type::Vector>()->type()->Is<core::type::I32>());
     EXPECT_EQ(ctor->ReturnType(), call->Type());
 
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::I32>());
 }
 
 // AppendVector(1, 2, scalar_3) -> vec3<i32>(1, 2, scalar_3)
@@ -324,15 +324,15 @@
 
     auto* ctor = call->Target()->As<sem::ValueConstructor>();
     ASSERT_NE(ctor, nullptr);
-    ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>());
-    EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>());
+    ASSERT_TRUE(ctor->ReturnType()->Is<core::type::Vector>());
+    EXPECT_EQ(ctor->ReturnType()->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(ctor->ReturnType()->As<core::type::Vector>()->type()->Is<core::type::I32>());
     EXPECT_EQ(ctor->ReturnType(), call->Type());
 
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    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()[0]->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::I32>());
 }
 
 // AppendVector(vec_12, scalar_3) -> vec3<i32>(vec_12, scalar_3)
@@ -363,14 +363,14 @@
 
     auto* ctor = call->Target()->As<sem::ValueConstructor>();
     ASSERT_NE(ctor, nullptr);
-    ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>());
-    EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>());
+    ASSERT_TRUE(ctor->ReturnType()->Is<core::type::Vector>());
+    EXPECT_EQ(ctor->ReturnType()->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(ctor->ReturnType()->As<core::type::Vector>()->type()->Is<core::type::I32>());
     EXPECT_EQ(ctor->ReturnType(), call->Type());
 
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::I32>());
 }
 
 // AppendVector(vec_12, scalar_3) -> vec3<i32>(vec_12, i32(scalar_3))
@@ -405,14 +405,14 @@
 
     auto* ctor = call->Target()->As<sem::ValueConstructor>();
     ASSERT_NE(ctor, nullptr);
-    ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>());
-    EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>());
+    ASSERT_TRUE(ctor->ReturnType()->Is<core::type::Vector>());
+    EXPECT_EQ(ctor->ReturnType()->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(ctor->ReturnType()->As<core::type::Vector>()->type()->Is<core::type::I32>());
     EXPECT_EQ(ctor->ReturnType(), call->Type());
 
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::I32>());
 }
 
 // AppendVector(vec_12, scalar_3) -> vec3<bool>(vec_12, scalar_3)
@@ -443,14 +443,14 @@
 
     auto* ctor = call->Target()->As<sem::ValueConstructor>();
     ASSERT_NE(ctor, nullptr);
-    ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>());
-    EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::Bool>());
+    ASSERT_TRUE(ctor->ReturnType()->Is<core::type::Vector>());
+    EXPECT_EQ(ctor->ReturnType()->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(ctor->ReturnType()->As<core::type::Vector>()->type()->Is<core::type::Bool>());
     EXPECT_EQ(ctor->ReturnType(), call->Type());
 
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::Bool>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::Bool>());
 }
 
 // AppendVector(vec3<i32>(), 4) -> vec3<bool>(0, 0, 0, 4)
@@ -485,16 +485,16 @@
 
     auto* ctor = call->Target()->As<sem::ValueConstructor>();
     ASSERT_NE(ctor, nullptr);
-    ASSERT_TRUE(ctor->ReturnType()->Is<type::Vector>());
-    EXPECT_EQ(ctor->ReturnType()->As<type::Vector>()->Width(), 4u);
-    EXPECT_TRUE(ctor->ReturnType()->As<type::Vector>()->type()->Is<type::I32>());
+    ASSERT_TRUE(ctor->ReturnType()->Is<core::type::Vector>());
+    EXPECT_EQ(ctor->ReturnType()->As<core::type::Vector>()->Width(), 4u);
+    EXPECT_TRUE(ctor->ReturnType()->As<core::type::Vector>()->type()->Is<core::type::I32>());
     EXPECT_EQ(ctor->ReturnType(), call->Type());
 
     ASSERT_EQ(ctor->Parameters().Length(), 4u);
-    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>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[3]->Type()->Is<core::type::I32>());
 }
 
 }  // namespace
diff --git a/src/tint/lang/wgsl/helpers/flatten_bindings_test.cc b/src/tint/lang/wgsl/helpers/flatten_bindings_test.cc
index ac798f4..7d4b38e 100644
--- a/src/tint/lang/wgsl/helpers/flatten_bindings_test.cc
+++ b/src/tint/lang/wgsl/helpers/flatten_bindings_test.cc
@@ -92,23 +92,24 @@
                 b.Group(2_a), b.Binding(2_a));
 
     const size_t num_samplers = 2;
-    b.GlobalVar("sampler1", b.ty.sampler(type::SamplerKind::kSampler), b.Group(3_a),
+    b.GlobalVar("sampler1", b.ty.sampler(core::type::SamplerKind::kSampler), b.Group(3_a),
                 b.Binding(3_a));
-    b.GlobalVar("sampler2", b.ty.sampler(type::SamplerKind::kComparisonSampler), b.Group(4_a),
+    b.GlobalVar("sampler2", b.ty.sampler(core::type::SamplerKind::kComparisonSampler), b.Group(4_a),
                 b.Binding(4_a));
 
     const size_t num_textures = 6;
-    b.GlobalVar("texture1", b.ty.sampled_texture(type::TextureDimension::k2d, b.ty.f32()),
+    b.GlobalVar("texture1", b.ty.sampled_texture(core::type::TextureDimension::k2d, b.ty.f32()),
                 b.Group(5_a), b.Binding(5_a));
-    b.GlobalVar("texture2", b.ty.multisampled_texture(type::TextureDimension::k2d, b.ty.f32()),
+    b.GlobalVar("texture2",
+                b.ty.multisampled_texture(core::type::TextureDimension::k2d, b.ty.f32()),
                 b.Group(6_a), b.Binding(6_a));
     b.GlobalVar("texture3",
-                b.ty.storage_texture(type::TextureDimension::k2d, core::TexelFormat::kR32Float,
-                                     core::Access::kWrite),
+                b.ty.storage_texture(core::type::TextureDimension::k2d,
+                                     core::TexelFormat::kR32Float, core::Access::kWrite),
                 b.Group(7_a), b.Binding(7_a));
-    b.GlobalVar("texture4", b.ty.depth_texture(type::TextureDimension::k2d), b.Group(8_a),
+    b.GlobalVar("texture4", b.ty.depth_texture(core::type::TextureDimension::k2d), b.Group(8_a),
                 b.Binding(8_a));
-    b.GlobalVar("texture5", b.ty.depth_multisampled_texture(type::TextureDimension::k2d),
+    b.GlobalVar("texture5", b.ty.depth_multisampled_texture(core::type::TextureDimension::k2d),
                 b.Group(9_a), b.Binding(9_a));
     b.GlobalVar("texture6", b.ty.external_texture(), b.Group(10_a), b.Binding(10_a));
 
diff --git a/src/tint/lang/wgsl/inspector/inspector.cc b/src/tint/lang/wgsl/inspector/inspector.cc
index 3163a3d..8ef8162 100644
--- a/src/tint/lang/wgsl/inspector/inspector.cc
+++ b/src/tint/lang/wgsl/inspector/inspector.cc
@@ -75,23 +75,23 @@
 }
 
 std::tuple<ComponentType, CompositionType> CalculateComponentAndComposition(
-    const type::Type* type) {
+    const core::type::Type* type) {
     // entry point in/out variables must of numeric scalar or vector types.
     TINT_ASSERT(type->is_numeric_scalar_or_vector());
 
     ComponentType componentType = Switch(
         type->DeepestElement(),  //
-        [&](const type::F32*) { return ComponentType::kF32; },
-        [&](const type::F16*) { return ComponentType::kF16; },
-        [&](const type::I32*) { return ComponentType::kI32; },
-        [&](const type::U32*) { return ComponentType::kU32; },
+        [&](const core::type::F32*) { return ComponentType::kF32; },
+        [&](const core::type::F16*) { return ComponentType::kF16; },
+        [&](const core::type::I32*) { return ComponentType::kI32; },
+        [&](const core::type::U32*) { return ComponentType::kU32; },
         [&](Default) {
             TINT_UNREACHABLE() << "unhandled component type";
             return ComponentType::kUnknown;
         });
 
     CompositionType compositionType;
-    if (auto* vec = type->As<type::Vector>()) {
+    if (auto* vec = type->As<core::type::Vector>()) {
         switch (vec->Width()) {
             case 2: {
                 compositionType = CompositionType::kVec2;
@@ -177,7 +177,7 @@
             core::BuiltinValue::kNumWorkgroups, param->Type(), param->Declaration()->attributes);
     }
 
-    if (!sem->ReturnType()->Is<type::Void>()) {
+    if (!sem->ReturnType()->Is<core::type::Void>()) {
         AddEntryPointInOutVariables("<retval>", sem->ReturnType(), func->return_type_attributes,
                                     sem->ReturnLocation(), entry_point.output_variables);
 
@@ -198,11 +198,11 @@
             override.name = name;
             override.id = global->OverrideId();
             auto* type = var->Type();
-            TINT_ASSERT(type->Is<type::Scalar>());
+            TINT_ASSERT(type->Is<core::type::Scalar>());
             if (type->is_bool_scalar_or_vector()) {
                 override.type = Override::Type::kBool;
             } else if (type->is_float_scalar()) {
-                if (type->Is<type::F16>()) {
+                if (type->Is<core::type::F16>()) {
                     override.type = Override::Type::kFloat16;
                 } else {
                     override.type = Override::Type::kFloat32;
@@ -269,14 +269,14 @@
             if (auto* value = global->Initializer()->ConstantValue()) {
                 result[override_id] = Switch(
                     value->Type(),  //
-                    [&](const type::I32*) { return Scalar(value->ValueAs<i32>()); },
-                    [&](const type::U32*) { return Scalar(value->ValueAs<u32>()); },
-                    [&](const type::F32*) { return Scalar(value->ValueAs<f32>()); },
-                    [&](const type::F16*) {
+                    [&](const core::type::I32*) { return Scalar(value->ValueAs<i32>()); },
+                    [&](const core::type::U32*) { return Scalar(value->ValueAs<u32>()); },
+                    [&](const core::type::F32*) { return Scalar(value->ValueAs<f32>()); },
+                    [&](const core::type::F16*) {
                         // Default value of f16 override is also stored as float scalar.
                         return Scalar(static_cast<float>(value->ValueAs<f16>()));
                     },
-                    [&](const type::Bool*) { return Scalar(value->ValueAs<bool>()); });
+                    [&](const core::type::Bool*) { return Scalar(value->ValueAs<bool>()); });
                 continue;
             }
         }
@@ -472,7 +472,7 @@
         entry.bind_group = binding_info.group;
         entry.binding = binding_info.binding;
 
-        auto* tex = var->Type()->UnwrapRef()->As<type::Texture>();
+        auto* tex = var->Type()->UnwrapRef()->As<core::type::Texture>();
         entry.dim = TypeTextureDimensionToResourceBindingTextureDimension(tex->dim());
 
         result.push_back(entry);
@@ -483,20 +483,21 @@
 
 std::vector<ResourceBinding> Inspector::GetDepthTextureResourceBindings(
     const std::string& entry_point) {
-    return GetTextureResourceBindings(entry_point, &tint::TypeInfo::Of<type::DepthTexture>(),
+    return GetTextureResourceBindings(entry_point, &tint::TypeInfo::Of<core::type::DepthTexture>(),
                                       ResourceBinding::ResourceType::kDepthTexture);
 }
 
 std::vector<ResourceBinding> Inspector::GetDepthMultisampledTextureResourceBindings(
     const std::string& entry_point) {
     return GetTextureResourceBindings(entry_point,
-                                      &tint::TypeInfo::Of<type::DepthMultisampledTexture>(),
+                                      &tint::TypeInfo::Of<core::type::DepthMultisampledTexture>(),
                                       ResourceBinding::ResourceType::kDepthMultisampledTexture);
 }
 
 std::vector<ResourceBinding> Inspector::GetExternalTextureResourceBindings(
     const std::string& entry_point) {
-    return GetTextureResourceBindings(entry_point, &tint::TypeInfo::Of<type::ExternalTexture>(),
+    return GetTextureResourceBindings(entry_point,
+                                      &tint::TypeInfo::Of<core::type::ExternalTexture>(),
                                       ResourceBinding::ResourceType::kExternalTexture);
 }
 
@@ -602,7 +603,7 @@
 }
 
 void Inspector::AddEntryPointInOutVariables(std::string name,
-                                            const type::Type* type,
+                                            const core::type::Type* type,
                                             VectorRef<const ast::Attribute*> attributes,
                                             std::optional<uint32_t> location,
                                             std::vector<StageVariable>& variables) const {
@@ -641,7 +642,7 @@
 }
 
 bool Inspector::ContainsBuiltin(core::BuiltinValue builtin,
-                                const type::Type* type,
+                                const core::type::Type* type,
                                 VectorRef<const ast::Attribute*> attributes) const {
     auto* unwrapped_type = type->UnwrapRef();
 
@@ -725,14 +726,14 @@
         entry.bind_group = binding_info.group;
         entry.binding = binding_info.binding;
 
-        auto* texture_type = var->Type()->UnwrapRef()->As<type::Texture>();
+        auto* texture_type = var->Type()->UnwrapRef()->As<core::type::Texture>();
         entry.dim = TypeTextureDimensionToResourceBindingTextureDimension(texture_type->dim());
 
-        const type::Type* base_type = nullptr;
+        const core::type::Type* base_type = nullptr;
         if (multisampled_only) {
-            base_type = texture_type->As<type::MultisampledTexture>()->type();
+            base_type = texture_type->As<core::type::MultisampledTexture>()->type();
         } else {
-            base_type = texture_type->As<type::SampledTexture>()->type();
+            base_type = texture_type->As<core::type::SampledTexture>()->type();
         }
         entry.sampled_kind = BaseTypeToSampledKind(base_type);
 
@@ -751,11 +752,12 @@
 
     auto* func_sem = program_->Sem().Get(func);
     std::vector<ResourceBinding> result;
-    for (auto& ref : func_sem->TransitivelyReferencedVariablesOfType<type::StorageTexture>()) {
+    for (auto& ref :
+         func_sem->TransitivelyReferencedVariablesOfType<core::type::StorageTexture>()) {
         auto* var = ref.first;
         auto binding_info = ref.second;
 
-        auto* texture_type = var->Type()->UnwrapRef()->As<type::StorageTexture>();
+        auto* texture_type = var->Type()->UnwrapRef()->As<core::type::StorageTexture>();
 
         ResourceBinding entry;
         entry.resource_type = ResourceBinding::ResourceType::kWriteOnlyStorageTexture;
@@ -845,7 +847,7 @@
 }
 
 std::tuple<InterpolationType, InterpolationSampling> Inspector::CalculateInterpolationData(
-    const type::Type* type,
+    const core::type::Type* type,
     VectorRef<const ast::Attribute*> attributes) const {
     auto* interpolation_attribute = ast::GetAttribute<ast::InterpolateAttribute>(attributes);
     if (type->is_integer_scalar_or_vector()) {
diff --git a/src/tint/lang/wgsl/inspector/inspector.h b/src/tint/lang/wgsl/inspector/inspector.h
index 2e0e1b2..ec88c04 100644
--- a/src/tint/lang/wgsl/inspector/inspector.h
+++ b/src/tint/lang/wgsl/inspector/inspector.h
@@ -174,7 +174,7 @@
     /// @param location the location value if provided
     /// @param variables the list to add the variables to
     void AddEntryPointInOutVariables(std::string name,
-                                     const type::Type* type,
+                                     const core::type::Type* type,
                                      VectorRef<const ast::Attribute*> attributes,
                                      std::optional<uint32_t> location,
                                      std::vector<StageVariable>& variables) const;
@@ -183,7 +183,7 @@
     /// If `type` is a struct, recurse into members to check for the attribute.
     /// Otherwise, check `attributes` for the attribute.
     bool ContainsBuiltin(core::BuiltinValue builtin,
-                         const type::Type* type,
+                         const core::type::Type* type,
                          VectorRef<const ast::Attribute*> attributes) const;
 
     /// Gathers all the texture resource bindings of the given type for the given
@@ -226,7 +226,7 @@
     /// @param attributes attributes associated with the parameter or structure member
     /// @returns the interpolation type and sampling modes for the value
     std::tuple<InterpolationType, InterpolationSampling> CalculateInterpolationData(
-        const type::Type* type,
+        const core::type::Type* type,
         VectorRef<const ast::Attribute*> attributes) const;
 
     /// For a N-uple of expressions, resolve to the appropriate global resources
diff --git a/src/tint/lang/wgsl/inspector/inspector_builder_test.cc b/src/tint/lang/wgsl/inspector/inspector_builder_test.cc
index 2d6a6c3..5119b40 100644
--- a/src/tint/lang/wgsl/inspector/inspector_builder_test.cc
+++ b/src/tint/lang/wgsl/inspector/inspector_builder_test.cc
@@ -170,14 +170,14 @@
 }
 
 void InspectorBuilder::AddSampler(const std::string& name, uint32_t group, uint32_t binding) {
-    GlobalVar(name, ty.sampler(type::SamplerKind::kSampler), Binding(AInt(binding)),
+    GlobalVar(name, ty.sampler(core::type::SamplerKind::kSampler), Binding(AInt(binding)),
               Group(AInt(group)));
 }
 
 void InspectorBuilder::AddComparisonSampler(const std::string& name,
                                             uint32_t group,
                                             uint32_t binding) {
-    GlobalVar(name, ty.sampler(type::SamplerKind::kComparisonSampler), Binding(AInt(binding)),
+    GlobalVar(name, ty.sampler(core::type::SamplerKind::kComparisonSampler), Binding(AInt(binding)),
               Group(AInt(group)));
 }
 
@@ -260,16 +260,16 @@
     }
 }
 
-ast::Type InspectorBuilder::GetCoordsType(type::TextureDimension dim, ast::Type scalar) {
+ast::Type InspectorBuilder::GetCoordsType(core::type::TextureDimension dim, ast::Type scalar) {
     switch (dim) {
-        case type::TextureDimension::k1d:
+        case core::type::TextureDimension::k1d:
             return scalar;
-        case type::TextureDimension::k2d:
-        case type::TextureDimension::k2dArray:
+        case core::type::TextureDimension::k2d:
+        case core::type::TextureDimension::k2dArray:
             return ty.vec2(scalar);
-        case type::TextureDimension::k3d:
-        case type::TextureDimension::kCube:
-        case type::TextureDimension::kCubeArray:
+        case core::type::TextureDimension::k3d:
+        case core::type::TextureDimension::kCube:
+        case core::type::TextureDimension::kCubeArray:
             return ty.vec3(scalar);
         default:
             [=] {
@@ -281,7 +281,7 @@
     return ast::Type{};
 }
 
-ast::Type InspectorBuilder::MakeStorageTextureTypes(type::TextureDimension dim,
+ast::Type InspectorBuilder::MakeStorageTextureTypes(core::type::TextureDimension dim,
                                                     core::TexelFormat format) {
     return ty.storage_texture(dim, format, core::Access::kWrite);
 }
diff --git a/src/tint/lang/wgsl/inspector/inspector_builder_test.h b/src/tint/lang/wgsl/inspector/inspector_builder_test.h
index 1e2ec3a..84162b2 100644
--- a/src/tint/lang/wgsl/inspector/inspector_builder_test.h
+++ b/src/tint/lang/wgsl/inspector/inspector_builder_test.h
@@ -280,13 +280,13 @@
     /// @param dim dimensionality of the texture being sampled
     /// @param scalar the scalar type
     /// @returns a pointer to a type appropriate for the coord param
-    ast::Type GetCoordsType(type::TextureDimension dim, ast::Type scalar);
+    ast::Type GetCoordsType(core::type::TextureDimension dim, ast::Type scalar);
 
     /// Generates appropriate types for a Read-Only StorageTexture
     /// @param dim the texture dimension of the storage texture
     /// @param format the texel format of the storage texture
     /// @returns the storage texture type
-    ast::Type MakeStorageTextureTypes(type::TextureDimension dim, core::TexelFormat format);
+    ast::Type MakeStorageTextureTypes(core::type::TextureDimension dim, core::TexelFormat format);
 
     /// Adds a storage texture variable to the program
     /// @param name the name of the variable
diff --git a/src/tint/lang/wgsl/inspector/inspector_test.cc b/src/tint/lang/wgsl/inspector/inspector_test.cc
index 02a9421..3bf9cd3 100644
--- a/src/tint/lang/wgsl/inspector/inspector_test.cc
+++ b/src/tint/lang/wgsl/inspector/inspector_test.cc
@@ -77,7 +77,7 @@
 class InspectorGetSampledArrayTextureResourceBindingsTest : public InspectorBuilder,
                                                             public testing::Test {};
 struct GetSampledTextureTestParams {
-    type::TextureDimension type_dim;
+    core::type::TextureDimension type_dim;
     inspector::ResourceBinding::TextureDimension inspector_dim;
     inspector::ResourceBinding::SampledKind sampled_kind;
 };
@@ -101,7 +101,7 @@
 class InspectorGetStorageTextureResourceBindingsTest : public InspectorBuilder,
                                                        public testing::Test {};
 struct GetDepthTextureTestParams {
-    type::TextureDimension type_dim;
+    core::type::TextureDimension type_dim;
     inspector::ResourceBinding::TextureDimension inspector_dim;
 };
 class InspectorGetDepthTextureResourceBindingsTestWithParam
@@ -111,7 +111,7 @@
 class InspectorGetDepthMultisampledTextureResourceBindingsTest : public InspectorBuilder,
                                                                  public testing::Test {};
 
-typedef std::tuple<type::TextureDimension, ResourceBinding::TextureDimension> DimensionParams;
+typedef std::tuple<core::type::TextureDimension, ResourceBinding::TextureDimension> DimensionParams;
 typedef std::tuple<core::TexelFormat, ResourceBinding::TexelFormat, ResourceBinding::SampledKind>
     TexelFormatParams;
 typedef std::tuple<DimensionParams, TexelFormatParams> GetStorageTextureTestParams;
@@ -1830,14 +1830,14 @@
                                                 MemberInfo{0, ty.i32()},
                                             });
 
-    auto s_texture_type = ty.sampled_texture(type::TextureDimension::k1d, ty.f32());
+    auto s_texture_type = ty.sampled_texture(core::type::TextureDimension::k1d, ty.f32());
     AddResource("s_texture", s_texture_type, 2, 0);
     AddSampler("s_var", 3, 0);
     AddGlobalVariable("s_coords", ty.f32());
     MakeSamplerReferenceBodyFunction("s_func", "s_texture", "s_var", "s_coords", ty.f32(),
                                      tint::Empty);
 
-    auto cs_depth_texture_type = ty.depth_texture(type::TextureDimension::k2d);
+    auto cs_depth_texture_type = ty.depth_texture(core::type::TextureDimension::k2d);
     AddResource("cs_texture", cs_depth_texture_type, 3, 1);
     AddComparisonSampler("cs_var", 3, 2);
     AddGlobalVariable("cs_coords", ty.vec2<f32>());
@@ -1845,7 +1845,7 @@
     MakeComparisonSamplerReferenceBodyFunction("cs_func", "cs_texture", "cs_var", "cs_coords",
                                                "cs_depth", ty.f32(), tint::Empty);
 
-    auto depth_ms_texture_type = ty.depth_multisampled_texture(type::TextureDimension::k2d);
+    auto depth_ms_texture_type = ty.depth_multisampled_texture(core::type::TextureDimension::k2d);
     AddResource("depth_ms_texture", depth_ms_texture_type, 3, 3);
     Func("depth_ms_func", tint::Empty, ty.void_(),
          Vector{
@@ -1853,7 +1853,7 @@
          });
 
     auto st_type =
-        MakeStorageTextureTypes(type::TextureDimension::k2d, core::TexelFormat::kR32Uint);
+        MakeStorageTextureTypes(core::type::TextureDimension::k2d, core::TexelFormat::kR32Uint);
     AddStorageTexture("st_var", st_type, 4, 0);
     MakeStorageTextureBodyFunction("st_func", "st_var", ty.vec2<u32>(), tint::Empty);
 
@@ -2631,7 +2631,7 @@
 }
 
 TEST_F(InspectorGetSamplerResourceBindingsTest, Simple) {
-    auto sampled_texture_type = ty.sampled_texture(type::TextureDimension::k1d, ty.f32());
+    auto sampled_texture_type = ty.sampled_texture(core::type::TextureDimension::k1d, ty.f32());
     AddResource("foo_texture", sampled_texture_type, 0, 0);
     AddSampler("foo_sampler", 0, 1);
     AddGlobalVariable("foo_coords", ty.f32());
@@ -2666,7 +2666,7 @@
 }
 
 TEST_F(InspectorGetSamplerResourceBindingsTest, InFunction) {
-    auto sampled_texture_type = ty.sampled_texture(type::TextureDimension::k1d, ty.f32());
+    auto sampled_texture_type = ty.sampled_texture(core::type::TextureDimension::k1d, ty.f32());
     AddResource("foo_texture", sampled_texture_type, 0, 0);
     AddSampler("foo_sampler", 0, 1);
     AddGlobalVariable("foo_coords", ty.f32());
@@ -2691,7 +2691,7 @@
 }
 
 TEST_F(InspectorGetSamplerResourceBindingsTest, UnknownEntryPoint) {
-    auto sampled_texture_type = ty.sampled_texture(type::TextureDimension::k1d, ty.f32());
+    auto sampled_texture_type = ty.sampled_texture(core::type::TextureDimension::k1d, ty.f32());
     AddResource("foo_texture", sampled_texture_type, 0, 0);
     AddSampler("foo_sampler", 0, 1);
     AddGlobalVariable("foo_coords", ty.f32());
@@ -2708,7 +2708,7 @@
 }
 
 TEST_F(InspectorGetSamplerResourceBindingsTest, SkipsComparisonSamplers) {
-    auto depth_texture_type = ty.depth_texture(type::TextureDimension::k2d);
+    auto depth_texture_type = ty.depth_texture(core::type::TextureDimension::k2d);
     AddResource("foo_texture", depth_texture_type, 0, 0);
     AddComparisonSampler("foo_sampler", 0, 1);
     AddGlobalVariable("foo_coords", ty.vec2<f32>());
@@ -2729,7 +2729,7 @@
 }
 
 TEST_F(InspectorGetComparisonSamplerResourceBindingsTest, Simple) {
-    auto depth_texture_type = ty.depth_texture(type::TextureDimension::k2d);
+    auto depth_texture_type = ty.depth_texture(core::type::TextureDimension::k2d);
     AddResource("foo_texture", depth_texture_type, 0, 0);
     AddComparisonSampler("foo_sampler", 0, 1);
     AddGlobalVariable("foo_coords", ty.vec2<f32>());
@@ -2766,7 +2766,7 @@
 }
 
 TEST_F(InspectorGetComparisonSamplerResourceBindingsTest, InFunction) {
-    auto depth_texture_type = ty.depth_texture(type::TextureDimension::k2d);
+    auto depth_texture_type = ty.depth_texture(core::type::TextureDimension::k2d);
     AddResource("foo_texture", depth_texture_type, 0, 0);
     AddComparisonSampler("foo_sampler", 0, 1);
     AddGlobalVariable("foo_coords", ty.vec2<f32>());
@@ -2792,7 +2792,7 @@
 }
 
 TEST_F(InspectorGetComparisonSamplerResourceBindingsTest, UnknownEntryPoint) {
-    auto depth_texture_type = ty.depth_texture(type::TextureDimension::k2d);
+    auto depth_texture_type = ty.depth_texture(core::type::TextureDimension::k2d);
     AddResource("foo_texture", depth_texture_type, 0, 0);
     AddComparisonSampler("foo_sampler", 0, 1);
     AddGlobalVariable("foo_coords", ty.vec2<f32>());
@@ -2811,7 +2811,7 @@
 }
 
 TEST_F(InspectorGetComparisonSamplerResourceBindingsTest, SkipsSamplers) {
-    auto sampled_texture_type = ty.sampled_texture(type::TextureDimension::k1d, ty.f32());
+    auto sampled_texture_type = ty.sampled_texture(core::type::TextureDimension::k1d, ty.f32());
     AddResource("foo_texture", sampled_texture_type, 0, 0);
     AddSampler("foo_sampler", 0, 1);
     AddGlobalVariable("foo_coords", ty.f32());
@@ -2878,16 +2878,16 @@
 INSTANTIATE_TEST_SUITE_P(
     InspectorGetSampledTextureResourceBindingsTest,
     InspectorGetSampledTextureResourceBindingsTestWithParam,
-    testing::Values(GetSampledTextureTestParams{type::TextureDimension::k1d,
+    testing::Values(GetSampledTextureTestParams{core::type::TextureDimension::k1d,
                                                 inspector::ResourceBinding::TextureDimension::k1d,
                                                 inspector::ResourceBinding::SampledKind::kFloat},
-                    GetSampledTextureTestParams{type::TextureDimension::k2d,
+                    GetSampledTextureTestParams{core::type::TextureDimension::k2d,
                                                 inspector::ResourceBinding::TextureDimension::k2d,
                                                 inspector::ResourceBinding::SampledKind::kFloat},
-                    GetSampledTextureTestParams{type::TextureDimension::k3d,
+                    GetSampledTextureTestParams{core::type::TextureDimension::k3d,
                                                 inspector::ResourceBinding::TextureDimension::k3d,
                                                 inspector::ResourceBinding::SampledKind::kFloat},
-                    GetSampledTextureTestParams{type::TextureDimension::kCube,
+                    GetSampledTextureTestParams{core::type::TextureDimension::kCube,
                                                 inspector::ResourceBinding::TextureDimension::kCube,
                                                 inspector::ResourceBinding::SampledKind::kFloat}));
 
@@ -2923,10 +2923,10 @@
     InspectorGetSampledArrayTextureResourceBindingsTest,
     InspectorGetSampledArrayTextureResourceBindingsTestWithParam,
     testing::Values(
-        GetSampledTextureTestParams{type::TextureDimension::k2dArray,
+        GetSampledTextureTestParams{core::type::TextureDimension::k2dArray,
                                     inspector::ResourceBinding::TextureDimension::k2dArray,
                                     inspector::ResourceBinding::SampledKind::kFloat},
-        GetSampledTextureTestParams{type::TextureDimension::kCubeArray,
+        GetSampledTextureTestParams{core::type::TextureDimension::kCubeArray,
                                     inspector::ResourceBinding::TextureDimension::kCubeArray,
                                     inspector::ResourceBinding::SampledKind::kFloat}));
 
@@ -2969,13 +2969,13 @@
     InspectorGetMultisampledTextureResourceBindingsTest,
     InspectorGetMultisampledTextureResourceBindingsTestWithParam,
     testing::Values(
-        GetMultisampledTextureTestParams{type::TextureDimension::k2d,
+        GetMultisampledTextureTestParams{core::type::TextureDimension::k2d,
                                          inspector::ResourceBinding::TextureDimension::k2d,
                                          inspector::ResourceBinding::SampledKind::kFloat},
-        GetMultisampledTextureTestParams{type::TextureDimension::k2d,
+        GetMultisampledTextureTestParams{core::type::TextureDimension::k2d,
                                          inspector::ResourceBinding::TextureDimension::k2d,
                                          inspector::ResourceBinding::SampledKind::kSInt},
-        GetMultisampledTextureTestParams{type::TextureDimension::k2d,
+        GetMultisampledTextureTestParams{core::type::TextureDimension::k2d,
                                          inspector::ResourceBinding::TextureDimension::k2d,
                                          inspector::ResourceBinding::SampledKind::kUInt}));
 
@@ -3009,7 +3009,7 @@
     TexelFormatParams format_params;
     std::tie(dim_params, format_params) = GetParam();
 
-    type::TextureDimension dim;
+    core::type::TextureDimension dim;
     ResourceBinding::TextureDimension expected_dim;
     std::tie(dim, expected_dim) = dim_params;
 
@@ -3023,14 +3023,14 @@
 
     ast::Type dim_type;
     switch (dim) {
-        case type::TextureDimension::k1d:
+        case core::type::TextureDimension::k1d:
             dim_type = ty.u32();
             break;
-        case type::TextureDimension::k2d:
-        case type::TextureDimension::k2dArray:
+        case core::type::TextureDimension::k2d:
+        case core::type::TextureDimension::k2dArray:
             dim_type = ty.vec2<u32>();
             break;
-        case type::TextureDimension::k3d:
+        case core::type::TextureDimension::k3d:
             dim_type = ty.vec3<u32>();
             break;
         default:
@@ -3061,13 +3061,13 @@
 INSTANTIATE_TEST_SUITE_P(
     InspectorGetStorageTextureResourceBindingsTest,
     InspectorGetStorageTextureResourceBindingsTestWithParam,
-    testing::Combine(testing::Values(std::make_tuple(type::TextureDimension::k1d,
+    testing::Combine(testing::Values(std::make_tuple(core::type::TextureDimension::k1d,
                                                      ResourceBinding::TextureDimension::k1d),
-                                     std::make_tuple(type::TextureDimension::k2d,
+                                     std::make_tuple(core::type::TextureDimension::k2d,
                                                      ResourceBinding::TextureDimension::k2d),
-                                     std::make_tuple(type::TextureDimension::k2dArray,
+                                     std::make_tuple(core::type::TextureDimension::k2dArray,
                                                      ResourceBinding::TextureDimension::k2dArray),
-                                     std::make_tuple(type::TextureDimension::k3d,
+                                     std::make_tuple(core::type::TextureDimension::k3d,
                                                      ResourceBinding::TextureDimension::k3d)),
                      testing::Values(std::make_tuple(core::TexelFormat::kR32Float,
                                                      ResourceBinding::TexelFormat::kR32Float,
@@ -3146,17 +3146,17 @@
     InspectorGetDepthTextureResourceBindingsTest,
     InspectorGetDepthTextureResourceBindingsTestWithParam,
     testing::Values(
-        GetDepthTextureTestParams{type::TextureDimension::k2d,
+        GetDepthTextureTestParams{core::type::TextureDimension::k2d,
                                   inspector::ResourceBinding::TextureDimension::k2d},
-        GetDepthTextureTestParams{type::TextureDimension::k2dArray,
+        GetDepthTextureTestParams{core::type::TextureDimension::k2dArray,
                                   inspector::ResourceBinding::TextureDimension::k2dArray},
-        GetDepthTextureTestParams{type::TextureDimension::kCube,
+        GetDepthTextureTestParams{core::type::TextureDimension::kCube,
                                   inspector::ResourceBinding::TextureDimension::kCube},
-        GetDepthTextureTestParams{type::TextureDimension::kCubeArray,
+        GetDepthTextureTestParams{core::type::TextureDimension::kCubeArray,
                                   inspector::ResourceBinding::TextureDimension::kCubeArray}));
 
 TEST_F(InspectorGetDepthMultisampledTextureResourceBindingsTest, textureDimensions) {
-    auto depth_ms_texture_type = ty.depth_multisampled_texture(type::TextureDimension::k2d);
+    auto depth_ms_texture_type = ty.depth_multisampled_texture(core::type::TextureDimension::k2d);
     AddResource("tex", depth_ms_texture_type, 0, 0);
 
     Func("ep", tint::Empty, ty.void_(),
diff --git a/src/tint/lang/wgsl/inspector/resource_binding.cc b/src/tint/lang/wgsl/inspector/resource_binding.cc
index 8185020..20ab2b3 100644
--- a/src/tint/lang/wgsl/inspector/resource_binding.cc
+++ b/src/tint/lang/wgsl/inspector/resource_binding.cc
@@ -26,44 +26,44 @@
 namespace tint::inspector {
 
 ResourceBinding::TextureDimension TypeTextureDimensionToResourceBindingTextureDimension(
-    const type::TextureDimension& type_dim) {
+    const core::type::TextureDimension& type_dim) {
     switch (type_dim) {
-        case type::TextureDimension::k1d:
+        case core::type::TextureDimension::k1d:
             return ResourceBinding::TextureDimension::k1d;
-        case type::TextureDimension::k2d:
+        case core::type::TextureDimension::k2d:
             return ResourceBinding::TextureDimension::k2d;
-        case type::TextureDimension::k2dArray:
+        case core::type::TextureDimension::k2dArray:
             return ResourceBinding::TextureDimension::k2dArray;
-        case type::TextureDimension::k3d:
+        case core::type::TextureDimension::k3d:
             return ResourceBinding::TextureDimension::k3d;
-        case type::TextureDimension::kCube:
+        case core::type::TextureDimension::kCube:
             return ResourceBinding::TextureDimension::kCube;
-        case type::TextureDimension::kCubeArray:
+        case core::type::TextureDimension::kCubeArray:
             return ResourceBinding::TextureDimension::kCubeArray;
-        case type::TextureDimension::kNone:
+        case core::type::TextureDimension::kNone:
             return ResourceBinding::TextureDimension::kNone;
     }
     return ResourceBinding::TextureDimension::kNone;
 }
 
-ResourceBinding::SampledKind BaseTypeToSampledKind(const type::Type* base_type) {
+ResourceBinding::SampledKind BaseTypeToSampledKind(const core::type::Type* base_type) {
     if (!base_type) {
         return ResourceBinding::SampledKind::kUnknown;
     }
 
-    if (auto* at = base_type->As<type::Array>()) {
+    if (auto* at = base_type->As<core::type::Array>()) {
         base_type = at->ElemType();
-    } else if (auto* mt = base_type->As<type::Matrix>()) {
+    } else if (auto* mt = base_type->As<core::type::Matrix>()) {
         base_type = mt->type();
-    } else if (auto* vt = base_type->As<type::Vector>()) {
+    } else if (auto* vt = base_type->As<core::type::Vector>()) {
         base_type = vt->type();
     }
 
-    if (base_type->Is<type::F32>()) {
+    if (base_type->Is<core::type::F32>()) {
         return ResourceBinding::SampledKind::kFloat;
-    } else if (base_type->Is<type::U32>()) {
+    } else if (base_type->Is<core::type::U32>()) {
         return ResourceBinding::SampledKind::kUInt;
-    } else if (base_type->Is<type::I32>()) {
+    } else if (base_type->Is<core::type::I32>()) {
         return ResourceBinding::SampledKind::kSInt;
     } else {
         return ResourceBinding::SampledKind::kUnknown;
diff --git a/src/tint/lang/wgsl/inspector/resource_binding.h b/src/tint/lang/wgsl/inspector/resource_binding.h
index d234fea..c9d372c 100644
--- a/src/tint/lang/wgsl/inspector/resource_binding.h
+++ b/src/tint/lang/wgsl/inspector/resource_binding.h
@@ -104,17 +104,17 @@
     TexelFormat image_format;
 };
 
-/// Convert from internal type::TextureDimension to public
+/// Convert from internal core::type::TextureDimension to public
 /// ResourceBinding::TextureDimension
 /// @param type_dim internal value to convert from
 /// @returns the publicly visible equivalent
 ResourceBinding::TextureDimension TypeTextureDimensionToResourceBindingTextureDimension(
-    const type::TextureDimension& type_dim);
+    const core::type::TextureDimension& type_dim);
 
-/// Infer ResourceBinding::SampledKind for a given type::Type
+/// Infer ResourceBinding::SampledKind for a given core::type::Type
 /// @param base_type internal type to infer from
 /// @returns the publicly visible equivalent
-ResourceBinding::SampledKind BaseTypeToSampledKind(const type::Type* base_type);
+ResourceBinding::SampledKind BaseTypeToSampledKind(const core::type::Type* base_type);
 
 /// Convert from internal core::TexelFormat to public
 /// ResourceBinding::TexelFormat
diff --git a/src/tint/lang/wgsl/program/program.cc b/src/tint/lang/wgsl/program/program.cc
index ee199caa..5c058c9 100644
--- a/src/tint/lang/wgsl/program/program.cc
+++ b/src/tint/lang/wgsl/program/program.cc
@@ -108,19 +108,19 @@
     return is_valid_;
 }
 
-const type::Type* Program::TypeOf(const ast::Expression* expr) const {
+const core::type::Type* Program::TypeOf(const ast::Expression* expr) const {
     return tint::Switch(
         Sem().Get(expr),  //
         [](const sem::ValueExpression* ty_expr) { return ty_expr->Type(); },
         [](const sem::TypeExpression* ty_expr) { return ty_expr->Type(); });
 }
 
-const type::Type* Program::TypeOf(const ast::Variable* var) const {
+const core::type::Type* Program::TypeOf(const ast::Variable* var) const {
     auto* sem = Sem().Get(var);
     return sem ? sem->Type() : nullptr;
 }
 
-const type::Type* Program::TypeOf(const ast::TypeDecl* type_decl) const {
+const core::type::Type* Program::TypeOf(const ast::TypeDecl* type_decl) const {
     return Sem().Get(type_decl);
 }
 
diff --git a/src/tint/lang/wgsl/program/program.h b/src/tint/lang/wgsl/program/program.h
index e30f46f..a367412 100644
--- a/src/tint/lang/wgsl/program/program.h
+++ b/src/tint/lang/wgsl/program/program.h
@@ -73,7 +73,7 @@
     }
 
     /// @returns a reference to the program's types
-    const type::Manager& Types() const {
+    const core::type::Manager& Types() const {
         AssertNotMoved();
         return constants_.types;
     }
@@ -136,20 +136,20 @@
     /// @param expr the AST expression
     /// @return the resolved semantic type for the expression, or nullptr if the
     /// expression has no resolved type.
-    const type::Type* TypeOf(const ast::Expression* expr) const;
+    const core::type::Type* TypeOf(const ast::Expression* expr) const;
 
     /// Helper for returning the resolved semantic type of the variable `var`.
     /// @param var the AST variable
     /// @return the resolved semantic type for the variable, or nullptr if the
     /// variable has no resolved type.
-    const type::Type* TypeOf(const ast::Variable* var) const;
+    const core::type::Type* TypeOf(const ast::Variable* var) const;
 
     /// Helper for returning the resolved semantic type of the AST type
     /// declaration `type_decl`.
     /// @param type_decl the AST type declaration
     /// @return the resolved semantic type for the type declaration, or nullptr if
     /// the type declaration has no resolved type.
-    const type::Type* TypeOf(const ast::TypeDecl* type_decl) const;
+    const core::type::Type* TypeOf(const ast::TypeDecl* type_decl) const;
 
     /// A function that can be used to print a program
     using Printer = std::string (*)(const Program*);
diff --git a/src/tint/lang/wgsl/program/program_builder.cc b/src/tint/lang/wgsl/program/program_builder.cc
index 870901e..29d441c 100644
--- a/src/tint/lang/wgsl/program/program_builder.cc
+++ b/src/tint/lang/wgsl/program/program_builder.cc
@@ -65,19 +65,19 @@
     }
 }
 
-const type::Type* ProgramBuilder::TypeOf(const ast::Expression* expr) const {
+const core::type::Type* ProgramBuilder::TypeOf(const ast::Expression* expr) const {
     return tint::Switch(
         Sem().Get(expr),  //
         [](const sem::ValueExpression* e) { return e->Type(); },
         [](const sem::TypeExpression* e) { return e->Type(); });
 }
 
-const type::Type* ProgramBuilder::TypeOf(const ast::Variable* var) const {
+const core::type::Type* ProgramBuilder::TypeOf(const ast::Variable* var) const {
     auto* sem = Sem().Get(var);
     return sem ? sem->Type() : nullptr;
 }
 
-const type::Type* ProgramBuilder::TypeOf(const ast::TypeDecl* type_decl) const {
+const core::type::Type* ProgramBuilder::TypeOf(const ast::TypeDecl* type_decl) const {
     return Sem().Get(type_decl);
 }
 
diff --git a/src/tint/lang/wgsl/program/program_builder.h b/src/tint/lang/wgsl/program/program_builder.h
index 97aee37..391d251 100644
--- a/src/tint/lang/wgsl/program/program_builder.h
+++ b/src/tint/lang/wgsl/program/program_builder.h
@@ -93,13 +93,13 @@
     static ProgramBuilder Wrap(const Program* program);
 
     /// @returns a reference to the program's types
-    type::Manager& Types() {
+    core::type::Manager& Types() {
         AssertNotMoved();
         return constants.types;
     }
 
     /// @returns a reference to the program's types
-    const type::Manager& Types() const {
+    const core::type::Manager& Types() const {
         AssertNotMoved();
         return constants.types;
     }
@@ -143,21 +143,21 @@
     /// @returns the node pointer
     template <typename T, typename... ARGS>
     tint::traits::EnableIf<tint::traits::IsTypeOrDerived<T, sem::Node> &&
-                               !tint::traits::IsTypeOrDerived<T, type::Node>,
+                               !tint::traits::IsTypeOrDerived<T, core::type::Node>,
                            T>*
     create(ARGS&&... args) {
         AssertNotMoved();
         return sem_nodes_.Create<T>(std::forward<ARGS>(args)...);
     }
 
-    /// Creates a new type::Node owned by the ProgramBuilder.
+    /// Creates a new core::type::Node owned by the ProgramBuilder.
     /// When the ProgramBuilder is destructed, owned ProgramBuilder and the returned node will also
-    /// be destructed. If T derives from type::UniqueNode, then the calling create() for the same
-    /// `T` and arguments will return the same pointer.
+    /// be destructed. If T derives from core::type::UniqueNode, then the calling create() for the
+    /// same `T` and arguments will return the same pointer.
     /// @param args the arguments to pass to the constructor
     /// @returns the new, or existing node
     template <typename T, typename... ARGS>
-    tint::traits::EnableIfIsType<T, type::Node>* create(ARGS&&... args) {
+    tint::traits::EnableIfIsType<T, core::type::Node>* create(ARGS&&... args) {
         AssertNotMoved();
         return constants.types.Get<T>(std::forward<ARGS>(args)...);
     }
@@ -168,7 +168,7 @@
     /// @param expr the AST expression
     /// @return the resolved semantic type for the expression, or nullptr if the
     /// expression has no resolved type.
-    const type::Type* TypeOf(const ast::Expression* expr) const;
+    const core::type::Type* TypeOf(const ast::Expression* expr) const;
 
     /// Helper for returning the resolved semantic type of the variable `var`.
     /// @note As the Resolver is run when the Program is built, this will only be
@@ -176,7 +176,7 @@
     /// @param var the AST variable
     /// @return the resolved semantic type for the variable, or nullptr if the
     /// variable has no resolved type.
-    const type::Type* TypeOf(const ast::Variable* var) const;
+    const core::type::Type* TypeOf(const ast::Variable* var) const;
 
     /// Helper for returning the resolved semantic type of the AST type
     /// declaration `type_decl`.
@@ -185,7 +185,7 @@
     /// @param type_decl the AST type declaration
     /// @return the resolved semantic type for the type declaration, or nullptr if
     /// the type declaration has no resolved type.
-    const type::Type* TypeOf(const ast::TypeDecl* type_decl) const;
+    const core::type::Type* TypeOf(const ast::TypeDecl* type_decl) const;
 
     /// The constants manager
     core::constant::Manager constants;
diff --git a/src/tint/lang/wgsl/reader/program_to_ir/program_to_ir.cc b/src/tint/lang/wgsl/reader/program_to_ir/program_to_ir.cc
index 7d0c972..f9dc57d 100644
--- a/src/tint/lang/wgsl/reader/program_to_ir/program_to_ir.cc
+++ b/src/tint/lang/wgsl/reader/program_to_ir/program_to_ir.cc
@@ -137,7 +137,7 @@
 
     // The clone context used to clone data from #program_
     core::constant::CloneContext clone_ctx_{
-        /* type_ctx */ type::CloneContext{
+        /* type_ctx */ core::type::CloneContext{
             /* src */ {&program_->Symbols()},
             /* dst */ {&builder_.ir.symbols, &builder_.ir.Types()},
         },
@@ -919,8 +919,10 @@
 
                 // The access result type should match the source result type. If the source is a
                 // pointer, we generate a pointer.
-                const type::Type* ty = sem->Type()->UnwrapRef()->Clone(impl.clone_ctx_.type_ctx);
-                if (auto* ptr = obj->Type()->As<type::Pointer>(); ptr && !ty->Is<type::Pointer>()) {
+                const core::type::Type* ty =
+                    sem->Type()->UnwrapRef()->Clone(impl.clone_ctx_.type_ctx);
+                if (auto* ptr = obj->Type()->As<core::type::Pointer>();
+                    ptr && !ty->Is<core::type::Pointer>()) {
                     ty = impl.builder_.ir.Types().ptr(ptr->AddressSpace(), ty, ptr->Access());
                 }
 
@@ -1141,12 +1143,12 @@
                     return std::nullopt;
                 }
 
-                auto* ref = access->Object()->Type()->As<type::Reference>();
+                auto* ref = access->Object()->Type()->As<core::type::Reference>();
                 if (!ref) {
                     return std::nullopt;
                 }
 
-                if (!ref->StoreType()->Is<type::Vector>()) {
+                if (!ref->StoreType()->Is<core::type::Vector>()) {
                     return std::nullopt;
                 }
                 return tint::Switch(
@@ -1280,8 +1282,8 @@
         return tint::Switch(  //
             var,
             [&](const ast::Var* v) {
-                auto* ref = sem->Type()->As<type::Reference>();
-                auto* ty = builder_.ir.Types().Get<type::Pointer>(
+                auto* ref = sem->Type()->As<core::type::Reference>();
+                auto* ty = builder_.ir.Types().Get<core::type::Pointer>(
                     ref->AddressSpace(), ref->StoreType()->Clone(clone_ctx_.type_ctx),
                     ref->Access());
 
@@ -1349,7 +1351,10 @@
             });
     }
 
-    ir::Binary* BinaryOp(const type::Type* ty, ir::Value* lhs, ir::Value* rhs, core::BinaryOp op) {
+    ir::Binary* BinaryOp(const core::type::Type* ty,
+                         ir::Value* lhs,
+                         ir::Value* rhs,
+                         core::BinaryOp op) {
         switch (op) {
             case core::BinaryOp::kAnd:
                 return builder_.And(ty, lhs, rhs);
diff --git a/src/tint/lang/wgsl/resolver/array_accessor_test.cc b/src/tint/lang/wgsl/resolver/array_accessor_test.cc
index 8e3931e..470ea97 100644
--- a/src/tint/lang/wgsl/resolver/array_accessor_test.cc
+++ b/src/tint/lang/wgsl/resolver/array_accessor_test.cc
@@ -109,8 +109,8 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(acc), nullptr);
-    ASSERT_TRUE(TypeOf(acc)->Is<type::Vector>());
-    EXPECT_EQ(TypeOf(acc)->As<type::Vector>()->Width(), 3u);
+    ASSERT_TRUE(TypeOf(acc)->Is<core::type::Vector>());
+    EXPECT_EQ(TypeOf(acc)->As<core::type::Vector>()->Width(), 3u);
 
     auto idx_sem = Sem().Get(acc)->UnwrapLoad()->As<sem::IndexAccessorExpression>();
     ASSERT_NE(idx_sem, nullptr);
@@ -127,7 +127,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(acc), nullptr);
-    EXPECT_TRUE(TypeOf(acc)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(acc)->Is<core::type::F32>());
 
     auto idx_sem = Sem().Get(acc)->UnwrapLoad()->As<sem::IndexAccessorExpression>();
     ASSERT_NE(idx_sem, nullptr);
@@ -176,7 +176,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(acc), nullptr);
-    EXPECT_TRUE(TypeOf(acc)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(acc)->Is<core::type::F32>());
 
     auto idx_sem = Sem().Get(acc)->UnwrapLoad()->As<sem::IndexAccessorExpression>();
     ASSERT_NE(idx_sem, nullptr);
@@ -189,7 +189,7 @@
     auto* acc = IndexAccessor("my_var", 2_i);
     WrapInFunction(acc);
     EXPECT_TRUE(r()->Resolve()) << r()->error();
-    EXPECT_TRUE(TypeOf(acc)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(acc)->Is<core::type::F32>());
 
     auto idx_sem = Sem().Get(acc)->UnwrapLoad()->As<sem::IndexAccessorExpression>();
     ASSERT_NE(idx_sem, nullptr);
@@ -202,7 +202,7 @@
     auto* acc = IndexAccessor("my_var", 2_u);
     WrapInFunction(acc);
     EXPECT_TRUE(r()->Resolve()) << r()->error();
-    EXPECT_TRUE(TypeOf(acc)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(acc)->Is<core::type::F32>());
 
     auto idx_sem = Sem().Get(acc)->UnwrapLoad()->As<sem::IndexAccessorExpression>();
     ASSERT_NE(idx_sem, nullptr);
@@ -215,7 +215,7 @@
     auto* acc = IndexAccessor("my_var", 2_a);
     WrapInFunction(acc);
     EXPECT_TRUE(r()->Resolve()) << r()->error();
-    EXPECT_TRUE(TypeOf(acc)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(acc)->Is<core::type::F32>());
 
     auto idx_sem = Sem().Get(acc)->UnwrapLoad()->As<sem::IndexAccessorExpression>();
     ASSERT_NE(idx_sem, nullptr);
@@ -234,7 +234,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(acc), nullptr);
-    EXPECT_TRUE(TypeOf(acc)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(acc)->Is<core::type::F32>());
 
     auto idx_sem = Sem().Get(acc)->UnwrapLoad()->As<sem::IndexAccessorExpression>();
     ASSERT_NE(idx_sem, nullptr);
@@ -251,7 +251,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(acc), nullptr);
-    EXPECT_TRUE(TypeOf(acc)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(acc)->Is<core::type::F32>());
 }
 
 TEST_F(ResolverIndexAccessorTest, Array_Dynamic_I32) {
diff --git a/src/tint/lang/wgsl/resolver/assignment_validation_test.cc b/src/tint/lang/wgsl/resolver/assignment_validation_test.cc
index 3aaeaae..7539446 100644
--- a/src/tint/lang/wgsl/resolver/assignment_validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/assignment_validation_test.cc
@@ -290,7 +290,7 @@
     // a = b;
 
     auto make_type = [&] {
-        return ty.storage_texture(type::TextureDimension::k1d, core::TexelFormat::kRgba8Unorm,
+        return ty.storage_texture(core::type::TextureDimension::k1d, core::TexelFormat::kRgba8Unorm,
                                   core::Access::kWrite);
     };
 
@@ -420,9 +420,9 @@
     auto* U = Structure("U", Vector{
                                  Member("i", ty.i32()),
                              });
-    GlobalVar("tex", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Group(0_a),
+    GlobalVar("tex", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()), Group(0_a),
               Binding(0_a));
-    GlobalVar("smp", ty.sampler(type::SamplerKind::kSampler), Group(0_a), Binding(1_a));
+    GlobalVar("smp", ty.sampler(core::type::SamplerKind::kSampler), Group(0_a), Binding(1_a));
     GlobalVar("u", ty.Of(U), core::AddressSpace::kUniform, Group(0_a), Binding(2_a));
     GlobalVar("s", ty.Of(S), core::AddressSpace::kStorage, Group(0_a), Binding(3_a));
     GlobalVar("wg", ty.array<f32, 10>(), core::AddressSpace::kWorkgroup);
diff --git a/src/tint/lang/wgsl/resolver/atomics_test.cc b/src/tint/lang/wgsl/resolver/atomics_test.cc
index 6e106aa..e19fe74 100644
--- a/src/tint/lang/wgsl/resolver/atomics_test.cc
+++ b/src/tint/lang/wgsl/resolver/atomics_test.cc
@@ -30,20 +30,20 @@
     auto* g = GlobalVar("a", ty.atomic(Source{{12, 34}}, ty.i32()), core::AddressSpace::kWorkgroup);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
-    ASSERT_TRUE(TypeOf(g)->Is<type::Reference>());
-    auto* atomic = TypeOf(g)->UnwrapRef()->As<type::Atomic>();
+    ASSERT_TRUE(TypeOf(g)->Is<core::type::Reference>());
+    auto* atomic = TypeOf(g)->UnwrapRef()->As<core::type::Atomic>();
     ASSERT_NE(atomic, nullptr);
-    EXPECT_TRUE(atomic->Type()->Is<type::I32>());
+    EXPECT_TRUE(atomic->Type()->Is<core::type::I32>());
 }
 
 TEST_F(ResolverAtomicTest, GlobalWorkgroupU32) {
     auto* g = GlobalVar("a", ty.atomic(Source{{12, 34}}, ty.u32()), core::AddressSpace::kWorkgroup);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
-    ASSERT_TRUE(TypeOf(g)->Is<type::Reference>());
-    auto* atomic = TypeOf(g)->UnwrapRef()->As<type::Atomic>();
+    ASSERT_TRUE(TypeOf(g)->Is<core::type::Reference>());
+    auto* atomic = TypeOf(g)->UnwrapRef()->As<core::type::Atomic>();
     ASSERT_NE(atomic, nullptr);
-    EXPECT_TRUE(atomic->Type()->Is<type::U32>());
+    EXPECT_TRUE(atomic->Type()->Is<core::type::U32>());
 }
 
 TEST_F(ResolverAtomicTest, GlobalStorageStruct) {
@@ -52,13 +52,13 @@
                         Binding(0_a), Group(0_a));
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
-    ASSERT_TRUE(TypeOf(g)->Is<type::Reference>());
+    ASSERT_TRUE(TypeOf(g)->Is<core::type::Reference>());
     auto* str = TypeOf(g)->UnwrapRef()->As<sem::Struct>();
     ASSERT_NE(str, nullptr);
     ASSERT_EQ(str->Members().Length(), 1u);
-    auto* atomic = str->Members()[0]->Type()->As<type::Atomic>();
+    auto* atomic = str->Members()[0]->Type()->As<core::type::Atomic>();
     ASSERT_NE(atomic, nullptr);
-    ASSERT_TRUE(atomic->Type()->Is<type::I32>());
+    ASSERT_TRUE(atomic->Type()->Is<core::type::I32>());
 }
 
 }  // namespace
diff --git a/src/tint/lang/wgsl/resolver/attribute_validation_test.cc b/src/tint/lang/wgsl/resolver/attribute_validation_test.cc
index b046d56..3b7a35a 100644
--- a/src/tint/lang/wgsl/resolver/attribute_validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/attribute_validation_test.cc
@@ -596,7 +596,7 @@
 }
 
 TEST_F(EntryPointParameterAttributeTest, DuplicateInternalAttribute) {
-    auto* s = Param("s", ty.sampler(type::SamplerKind::kSampler),
+    auto* s = Param("s", ty.sampler(core::type::SamplerKind::kSampler),
                     Vector{
                         Binding(0_a),
                         Group(0_a),
@@ -975,7 +975,7 @@
 
     auto attrs = createAttributes(Source{{12, 34}}, *this, params.kind);
     if (IsBindingAttribute(params.kind)) {
-        GlobalVar("a", ty.sampler(type::SamplerKind::kSampler), attrs);
+        GlobalVar("a", ty.sampler(core::type::SamplerKind::kSampler), attrs);
     } else {
         GlobalVar("a", ty.f32(), core::AddressSpace::kPrivate, attrs);
     }
@@ -1011,7 +1011,7 @@
                                          TestParams{AttributeKind::kBindingAndGroup, true}));
 
 TEST_F(VariableAttributeTest, DuplicateAttribute) {
-    GlobalVar("a", ty.sampler(type::SamplerKind::kSampler), Binding(Source{{12, 34}}, 2_a),
+    GlobalVar("a", ty.sampler(core::type::SamplerKind::kSampler), Binding(Source{{12, 34}}, 2_a),
               Group(2_a), Binding(Source{{56, 78}}, 3_a));
 
     EXPECT_FALSE(r()->Resolve());
@@ -1610,7 +1610,7 @@
 }
 
 TEST_F(ResourceAttributeTest, TextureMissingBinding) {
-    GlobalVar(Source{{12, 34}}, "G", ty.depth_texture(type::TextureDimension::k2d));
+    GlobalVar(Source{{12, 34}}, "G", ty.depth_texture(core::type::TextureDimension::k2d));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(),
@@ -1618,7 +1618,7 @@
 }
 
 TEST_F(ResourceAttributeTest, SamplerMissingBinding) {
-    GlobalVar(Source{{12, 34}}, "G", ty.sampler(type::SamplerKind::kSampler));
+    GlobalVar(Source{{12, 34}}, "G", ty.sampler(core::type::SamplerKind::kSampler));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(),
@@ -1626,7 +1626,7 @@
 }
 
 TEST_F(ResourceAttributeTest, BindingPairMissingBinding) {
-    GlobalVar(Source{{12, 34}}, "G", ty.sampler(type::SamplerKind::kSampler), Group(1_a));
+    GlobalVar(Source{{12, 34}}, "G", ty.sampler(core::type::SamplerKind::kSampler), Group(1_a));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(),
@@ -1634,7 +1634,7 @@
 }
 
 TEST_F(ResourceAttributeTest, BindingPairMissingGroup) {
-    GlobalVar(Source{{12, 34}}, "G", ty.sampler(type::SamplerKind::kSampler), Binding(1_a));
+    GlobalVar(Source{{12, 34}}, "G", ty.sampler(core::type::SamplerKind::kSampler), Binding(1_a));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(),
@@ -1642,10 +1642,12 @@
 }
 
 TEST_F(ResourceAttributeTest, BindingPointUsedTwiceByEntryPoint) {
-    GlobalVar(Source{{12, 34}}, "A", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()),
-              Binding(1_a), Group(2_a));
-    GlobalVar(Source{{56, 78}}, "B", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()),
-              Binding(1_a), Group(2_a));
+    GlobalVar(Source{{12, 34}}, "A",
+              ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()), Binding(1_a),
+              Group(2_a));
+    GlobalVar(Source{{56, 78}}, "B",
+              ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()), Binding(1_a),
+              Group(2_a));
 
     Func("F", tint::Empty, ty.void_(),
          Vector{
@@ -1666,10 +1668,12 @@
 }
 
 TEST_F(ResourceAttributeTest, BindingPointUsedTwiceByDifferentEntryPoints) {
-    GlobalVar(Source{{12, 34}}, "A", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()),
-              Binding(1_a), Group(2_a));
-    GlobalVar(Source{{56, 78}}, "B", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()),
-              Binding(1_a), Group(2_a));
+    GlobalVar(Source{{12, 34}}, "A",
+              ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()), Binding(1_a),
+              Group(2_a));
+    GlobalVar(Source{{56, 78}}, "B",
+              ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()), Binding(1_a),
+              Group(2_a));
 
     Func("F_A", tint::Empty, ty.void_(),
          Vector{
@@ -2040,7 +2044,7 @@
 TEST_F(GroupAndBindingTest, Const_I32) {
     GlobalConst("b", Expr(4_i));
     GlobalConst("g", Expr(2_i));
-    GlobalVar("val", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Binding("b"),
+    GlobalVar("val", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()), Binding("b"),
               Group("g"));
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -2049,7 +2053,7 @@
 TEST_F(GroupAndBindingTest, Const_U32) {
     GlobalConst("b", Expr(4_u));
     GlobalConst("g", Expr(2_u));
-    GlobalVar("val", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Binding("b"),
+    GlobalVar("val", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()), Binding("b"),
               Group("g"));
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -2058,14 +2062,14 @@
 TEST_F(GroupAndBindingTest, Const_AInt) {
     GlobalConst("b", Expr(4_a));
     GlobalConst("g", Expr(2_a));
-    GlobalVar("val", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Binding("b"),
+    GlobalVar("val", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()), Binding("b"),
               Group("g"));
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
 
 TEST_F(GroupAndBindingTest, Binding_NonConstant) {
-    GlobalVar("val", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()),
+    GlobalVar("val", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()),
               Binding(Call<u32>(Call(Source{{12, 34}}, "dpdx", 1_a))), Group(1_i));
 
     EXPECT_FALSE(r()->Resolve());
@@ -2075,7 +2079,7 @@
 }
 
 TEST_F(GroupAndBindingTest, Binding_Negative) {
-    GlobalVar("val", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()),
+    GlobalVar("val", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()),
               Binding(Source{{12, 34}}, -2_i), Group(1_i));
 
     EXPECT_FALSE(r()->Resolve());
@@ -2083,7 +2087,7 @@
 }
 
 TEST_F(GroupAndBindingTest, Binding_F32) {
-    GlobalVar("val", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()),
+    GlobalVar("val", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()),
               Binding(Source{{12, 34}}, 2.0_f), Group(1_u));
 
     EXPECT_FALSE(r()->Resolve());
@@ -2091,7 +2095,7 @@
 }
 
 TEST_F(GroupAndBindingTest, Binding_AFloat) {
-    GlobalVar("val", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()),
+    GlobalVar("val", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()),
               Binding(Source{{12, 34}}, 2.0_a), Group(1_u));
 
     EXPECT_FALSE(r()->Resolve());
@@ -2099,7 +2103,7 @@
 }
 
 TEST_F(GroupAndBindingTest, Group_NonConstant) {
-    GlobalVar("val", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Binding(2_u),
+    GlobalVar("val", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()), Binding(2_u),
               Group(Call<u32>(Call(Source{{12, 34}}, "dpdx", 1_a))));
 
     EXPECT_FALSE(r()->Resolve());
@@ -2109,7 +2113,7 @@
 }
 
 TEST_F(GroupAndBindingTest, Group_Negative) {
-    GlobalVar("val", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Binding(2_u),
+    GlobalVar("val", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()), Binding(2_u),
               Group(Source{{12, 34}}, -1_i));
 
     EXPECT_FALSE(r()->Resolve());
@@ -2117,7 +2121,7 @@
 }
 
 TEST_F(GroupAndBindingTest, Group_F32) {
-    GlobalVar("val", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Binding(2_u),
+    GlobalVar("val", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()), Binding(2_u),
               Group(Source{{12, 34}}, 1.0_f));
 
     EXPECT_FALSE(r()->Resolve());
@@ -2125,7 +2129,7 @@
 }
 
 TEST_F(GroupAndBindingTest, Group_AFloat) {
-    GlobalVar("val", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Binding(2_u),
+    GlobalVar("val", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()), Binding(2_u),
               Group(Source{{12, 34}}, 1.0_a));
 
     EXPECT_FALSE(r()->Resolve());
diff --git a/src/tint/lang/wgsl/resolver/builtin_structs_test.cc b/src/tint/lang/wgsl/resolver/builtin_structs_test.cc
index c86fd53..fe96142 100644
--- a/src/tint/lang/wgsl/resolver/builtin_structs_test.cc
+++ b/src/tint/lang/wgsl/resolver/builtin_structs_test.cc
@@ -34,7 +34,7 @@
     auto* var = GlobalVar("p", ty(GetParam()), core::AddressSpace::kPrivate);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
-    auto* str = As<type::Struct>(TypeOf(var)->UnwrapRef());
+    auto* str = As<core::type::Struct>(TypeOf(var)->UnwrapRef());
     ASSERT_NE(str, nullptr);
     EXPECT_EQ(str->Name().Name(), tint::ToString(GetParam()));
     EXPECT_FALSE(Is<sem::Struct>(str));
diff --git a/src/tint/lang/wgsl/resolver/builtin_test.cc b/src/tint/lang/wgsl/resolver/builtin_test.cc
index 52ee20f..535cb5f 100644
--- a/src/tint/lang/wgsl/resolver/builtin_test.cc
+++ b/src/tint/lang/wgsl/resolver/builtin_test.cc
@@ -109,7 +109,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    EXPECT_TRUE(TypeOf(expr)->Is<type::Bool>());
+    EXPECT_TRUE(TypeOf(expr)->Is<core::type::Bool>());
 }
 TEST_P(ResolverBuiltinTest_BoolMethod, Vector) {
     auto name = GetParam();
@@ -122,7 +122,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    EXPECT_TRUE(TypeOf(expr)->Is<type::Bool>());
+    EXPECT_TRUE(TypeOf(expr)->Is<core::type::Bool>());
 }
 INSTANTIATE_TEST_SUITE_P(ResolverTest,
                          ResolverBuiltinTest_BoolMethod,
@@ -139,9 +139,9 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    EXPECT_TRUE(TypeOf(expr)->Is<type::Vector>());
-    EXPECT_EQ(TypeOf(expr)->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(TypeOf(expr)->As<type::Vector>()->type()->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(expr)->Is<core::type::Vector>());
+    EXPECT_EQ(TypeOf(expr)->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(TypeOf(expr)->As<core::type::Vector>()->type()->Is<core::type::F32>());
 }
 
 TEST_F(ResolverBuiltinTest, Select_Error_NoParams) {
@@ -245,7 +245,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<type::U32>());
+    EXPECT_TRUE(TypeOf(call)->Is<core::type::U32>());
 }
 
 TEST_F(ResolverBuiltinArrayTest, ArrayLength_Error_ArraySized) {
@@ -313,7 +313,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
+        EXPECT_TRUE(TypeOf(call)->Is<core::type::F32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -338,9 +338,9 @@
 
         ASSERT_NE(TypeOf(call), nullptr);
         EXPECT_TRUE(TypeOf(call)->is_float_vector());
-        EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 3u);
-        ASSERT_NE(TypeOf(call)->As<type::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<type::Vector>()->type()->Is<type::F32>());
+        EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 3u);
+        ASSERT_NE(TypeOf(call)->As<core::type::Vector>()->type(), nullptr);
+        EXPECT_TRUE(TypeOf(call)->As<core::type::Vector>()->type()->Is<core::type::F32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -361,7 +361,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
+        EXPECT_TRUE(TypeOf(call)->Is<core::type::F32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -383,9 +383,9 @@
 
         ASSERT_NE(TypeOf(call), nullptr);
         EXPECT_TRUE(TypeOf(call)->is_float_vector());
-        EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 3u);
-        ASSERT_NE(TypeOf(call)->As<type::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<type::Vector>()->type()->Is<type::F32>());
+        EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 3u);
+        ASSERT_NE(TypeOf(call)->As<core::type::Vector>()->type(), nullptr);
+        EXPECT_TRUE(TypeOf(call)->As<core::type::Vector>()->type()->Is<core::type::F32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -406,7 +406,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
+        EXPECT_TRUE(TypeOf(call)->Is<core::type::F32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -429,9 +429,9 @@
 
         ASSERT_NE(TypeOf(call), nullptr);
         EXPECT_TRUE(TypeOf(call)->is_float_vector());
-        EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 3u);
-        ASSERT_NE(TypeOf(call)->As<type::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<type::Vector>()->type()->Is<type::F32>());
+        EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 3u);
+        ASSERT_NE(TypeOf(call)->As<core::type::Vector>()->type(), nullptr);
+        EXPECT_TRUE(TypeOf(call)->As<core::type::Vector>()->type()->Is<core::type::F32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -453,7 +453,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
+        EXPECT_TRUE(TypeOf(call)->Is<core::type::F32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -476,9 +476,9 @@
 
         ASSERT_NE(TypeOf(call), nullptr);
         EXPECT_TRUE(TypeOf(call)->is_float_vector());
-        EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 3u);
-        ASSERT_NE(TypeOf(call)->As<type::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<type::Vector>()->type()->Is<type::F32>());
+        EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 3u);
+        ASSERT_NE(TypeOf(call)->As<core::type::Vector>()->type(), nullptr);
+        EXPECT_TRUE(TypeOf(call)->As<core::type::Vector>()->type()->Is<core::type::F32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -507,7 +507,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<type::F16>());
+        EXPECT_TRUE(TypeOf(call)->Is<core::type::F16>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -534,9 +534,9 @@
 
         ASSERT_NE(TypeOf(call), nullptr);
         EXPECT_TRUE(TypeOf(call)->is_float_vector());
-        EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 3u);
-        ASSERT_NE(TypeOf(call)->As<type::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<type::Vector>()->type()->Is<type::F16>());
+        EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 3u);
+        ASSERT_NE(TypeOf(call)->As<core::type::Vector>()->type(), nullptr);
+        EXPECT_TRUE(TypeOf(call)->As<core::type::Vector>()->type()->Is<core::type::F16>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -559,7 +559,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<type::F16>());
+        EXPECT_TRUE(TypeOf(call)->Is<core::type::F16>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -583,9 +583,9 @@
 
         ASSERT_NE(TypeOf(call), nullptr);
         EXPECT_TRUE(TypeOf(call)->is_float_vector());
-        EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 3u);
-        ASSERT_NE(TypeOf(call)->As<type::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<type::Vector>()->type()->Is<type::F16>());
+        EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 3u);
+        ASSERT_NE(TypeOf(call)->As<core::type::Vector>()->type(), nullptr);
+        EXPECT_TRUE(TypeOf(call)->As<core::type::Vector>()->type()->Is<core::type::F16>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -608,7 +608,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<type::F16>());
+        EXPECT_TRUE(TypeOf(call)->Is<core::type::F16>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -633,9 +633,9 @@
 
         ASSERT_NE(TypeOf(call), nullptr);
         EXPECT_TRUE(TypeOf(call)->is_float_vector());
-        EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 3u);
-        ASSERT_NE(TypeOf(call)->As<type::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<type::Vector>()->type()->Is<type::F16>());
+        EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 3u);
+        ASSERT_NE(TypeOf(call)->As<core::type::Vector>()->type(), nullptr);
+        EXPECT_TRUE(TypeOf(call)->As<core::type::Vector>()->type()->Is<core::type::F16>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -659,7 +659,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<type::F16>());
+        EXPECT_TRUE(TypeOf(call)->Is<core::type::F16>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -684,9 +684,9 @@
 
         ASSERT_NE(TypeOf(call), nullptr);
         EXPECT_TRUE(TypeOf(call)->is_float_vector());
-        EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 3u);
-        ASSERT_NE(TypeOf(call)->As<type::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<type::Vector>()->type()->Is<type::F16>());
+        EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 3u);
+        ASSERT_NE(TypeOf(call)->As<core::type::Vector>()->type(), nullptr);
+        EXPECT_TRUE(TypeOf(call)->As<core::type::Vector>()->type()->Is<core::type::F16>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -761,8 +761,8 @@
 
     ASSERT_NE(TypeOf(call), nullptr);
     EXPECT_TRUE(TypeOf(call)->is_float_vector());
-    EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(TypeOf(call)->As<type::Vector>()->type()->Is<type::F32>());
+    EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(TypeOf(call)->As<core::type::Vector>()->type()->Is<core::type::F32>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Cross_f16) {
@@ -775,8 +775,8 @@
 
     ASSERT_NE(TypeOf(call), nullptr);
     EXPECT_TRUE(TypeOf(call)->is_float_vector());
-    EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(TypeOf(call)->As<type::Vector>()->type()->Is<type::F16>());
+    EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(TypeOf(call)->As<core::type::Vector>()->type()->Is<core::type::F16>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Cross_Error_NoArgs) {
@@ -859,7 +859,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(call)->Is<core::type::F32>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Distance_Scalar_f16) {
@@ -871,7 +871,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<type::F16>());
+    EXPECT_TRUE(TypeOf(call)->Is<core::type::F16>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Distance_Vector_f32) {
@@ -881,7 +881,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(call)->Is<core::type::F32>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Distance_Vector_f16) {
@@ -893,7 +893,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<type::F16>());
+    EXPECT_TRUE(TypeOf(call)->Is<core::type::F16>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Distance_TooManyParams) {
@@ -948,19 +948,19 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    auto* ty = TypeOf(call)->As<type::Struct>();
+    auto* ty = TypeOf(call)->As<core::type::Struct>();
     ASSERT_NE(ty, nullptr);
     ASSERT_EQ(ty->Members().Length(), 2u);
 
     auto* fract = ty->Members()[0];
-    EXPECT_TRUE(fract->Type()->Is<type::F32>());
+    EXPECT_TRUE(fract->Type()->Is<core::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<type::I32>());
+    EXPECT_TRUE(exp->Type()->Is<core::type::I32>());
     EXPECT_EQ(exp->Offset(), 4u);
     EXPECT_EQ(exp->Size(), 4u);
     EXPECT_EQ(exp->Align(), 4u);
@@ -979,19 +979,19 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    auto* ty = TypeOf(call)->As<type::Struct>();
+    auto* ty = TypeOf(call)->As<core::type::Struct>();
     ASSERT_NE(ty, nullptr);
     ASSERT_EQ(ty->Members().Length(), 2u);
 
     auto* fract = ty->Members()[0];
-    EXPECT_TRUE(fract->Type()->Is<type::F16>());
+    EXPECT_TRUE(fract->Type()->Is<core::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<type::I32>());
+    EXPECT_TRUE(exp->Type()->Is<core::type::I32>());
     EXPECT_EQ(exp->Offset(), 4u);
     EXPECT_EQ(exp->Size(), 4u);
     EXPECT_EQ(exp->Align(), 4u);
@@ -1008,23 +1008,23 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    auto* ty = TypeOf(call)->As<type::Struct>();
+    auto* ty = TypeOf(call)->As<core::type::Struct>();
     ASSERT_NE(ty, nullptr);
     ASSERT_EQ(ty->Members().Length(), 2u);
 
     auto* fract = ty->Members()[0];
-    ASSERT_TRUE(fract->Type()->Is<type::Vector>());
-    EXPECT_EQ(fract->Type()->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(fract->Type()->As<type::Vector>()->type()->Is<type::F32>());
+    ASSERT_TRUE(fract->Type()->Is<core::type::Vector>());
+    EXPECT_EQ(fract->Type()->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(fract->Type()->As<core::type::Vector>()->type()->Is<core::type::F32>());
     EXPECT_EQ(fract->Offset(), 0u);
     EXPECT_EQ(fract->Size(), 12u);
     EXPECT_EQ(fract->Align(), 16u);
     EXPECT_EQ(fract->Name(), Sym("fract"));
 
     auto* exp = ty->Members()[1];
-    ASSERT_TRUE(exp->Type()->Is<type::Vector>());
-    EXPECT_EQ(exp->Type()->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(exp->Type()->As<type::Vector>()->type()->Is<type::I32>());
+    ASSERT_TRUE(exp->Type()->Is<core::type::Vector>());
+    EXPECT_EQ(exp->Type()->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(exp->Type()->As<core::type::Vector>()->type()->Is<core::type::I32>());
     EXPECT_EQ(exp->Offset(), 16u);
     EXPECT_EQ(exp->Size(), 12u);
     EXPECT_EQ(exp->Align(), 16u);
@@ -1043,23 +1043,23 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    auto* ty = TypeOf(call)->As<type::Struct>();
+    auto* ty = TypeOf(call)->As<core::type::Struct>();
     ASSERT_NE(ty, nullptr);
     ASSERT_EQ(ty->Members().Length(), 2u);
 
     auto* fract = ty->Members()[0];
-    ASSERT_TRUE(fract->Type()->Is<type::Vector>());
-    EXPECT_EQ(fract->Type()->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(fract->Type()->As<type::Vector>()->type()->Is<type::F16>());
+    ASSERT_TRUE(fract->Type()->Is<core::type::Vector>());
+    EXPECT_EQ(fract->Type()->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(fract->Type()->As<core::type::Vector>()->type()->Is<core::type::F16>());
     EXPECT_EQ(fract->Offset(), 0u);
     EXPECT_EQ(fract->Size(), 6u);
     EXPECT_EQ(fract->Align(), 8u);
     EXPECT_EQ(fract->Name(), Sym("fract"));
 
     auto* exp = ty->Members()[1];
-    ASSERT_TRUE(exp->Type()->Is<type::Vector>());
-    EXPECT_EQ(exp->Type()->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(exp->Type()->As<type::Vector>()->type()->Is<type::I32>());
+    ASSERT_TRUE(exp->Type()->Is<core::type::Vector>());
+    EXPECT_EQ(exp->Type()->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(exp->Type()->As<core::type::Vector>()->type()->Is<core::type::I32>());
     EXPECT_EQ(exp->Offset(), 16u);
     EXPECT_EQ(exp->Size(), 12u);
     EXPECT_EQ(exp->Align(), 16u);
@@ -1093,7 +1093,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(call)->Is<core::type::F32>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Length_Scalar_f16) {
@@ -1105,7 +1105,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<type::F16>());
+    EXPECT_TRUE(TypeOf(call)->Is<core::type::F16>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Length_FloatVector_f32) {
@@ -1115,7 +1115,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(call)->Is<core::type::F32>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Length_FloatVector_f16) {
@@ -1127,7 +1127,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<type::F16>());
+    EXPECT_TRUE(TypeOf(call)->Is<core::type::F16>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Length_NoParams) {
@@ -1168,9 +1168,9 @@
 
     ASSERT_NE(TypeOf(call), nullptr);
     EXPECT_TRUE(TypeOf(call)->is_float_vector());
-    EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 3u);
-    ASSERT_NE(TypeOf(call)->As<type::Vector>()->type(), nullptr);
-    EXPECT_TRUE(TypeOf(call)->As<type::Vector>()->type()->Is<type::F32>());
+    EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 3u);
+    ASSERT_NE(TypeOf(call)->As<core::type::Vector>()->type(), nullptr);
+    EXPECT_TRUE(TypeOf(call)->As<core::type::Vector>()->type()->Is<core::type::F32>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Mix_VectorScalar_f16) {
@@ -1183,9 +1183,9 @@
 
     ASSERT_NE(TypeOf(call), nullptr);
     EXPECT_TRUE(TypeOf(call)->is_float_vector());
-    EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 3u);
-    ASSERT_NE(TypeOf(call)->As<type::Vector>()->type(), nullptr);
-    EXPECT_TRUE(TypeOf(call)->As<type::Vector>()->type()->Is<type::F16>());
+    EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 3u);
+    ASSERT_NE(TypeOf(call)->As<core::type::Vector>()->type(), nullptr);
+    EXPECT_TRUE(TypeOf(call)->As<core::type::Vector>()->type()->Is<core::type::F16>());
 }
 
 // modf: (f32) -> __modf_result, (vecN<f32>) -> __modf_result_vecN, (f16) -> __modf_result_f16,
@@ -1197,19 +1197,19 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    auto* ty = TypeOf(call)->As<type::Struct>();
+    auto* ty = TypeOf(call)->As<core::type::Struct>();
     ASSERT_NE(ty, nullptr);
     ASSERT_EQ(ty->Members().Length(), 2u);
 
     auto* fract = ty->Members()[0];
-    EXPECT_TRUE(fract->Type()->Is<type::F32>());
+    EXPECT_TRUE(fract->Type()->Is<core::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<type::F32>());
+    EXPECT_TRUE(whole->Type()->Is<core::type::F32>());
     EXPECT_EQ(whole->Offset(), 4u);
     EXPECT_EQ(whole->Size(), 4u);
     EXPECT_EQ(whole->Align(), 4u);
@@ -1228,19 +1228,19 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    auto* ty = TypeOf(call)->As<type::Struct>();
+    auto* ty = TypeOf(call)->As<core::type::Struct>();
     ASSERT_NE(ty, nullptr);
     ASSERT_EQ(ty->Members().Length(), 2u);
 
     auto* fract = ty->Members()[0];
-    EXPECT_TRUE(fract->Type()->Is<type::F16>());
+    EXPECT_TRUE(fract->Type()->Is<core::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<type::F16>());
+    EXPECT_TRUE(whole->Type()->Is<core::type::F16>());
     EXPECT_EQ(whole->Offset(), 2u);
     EXPECT_EQ(whole->Size(), 2u);
     EXPECT_EQ(whole->Align(), 2u);
@@ -1257,23 +1257,23 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    auto* ty = TypeOf(call)->As<type::Struct>();
+    auto* ty = TypeOf(call)->As<core::type::Struct>();
     ASSERT_NE(ty, nullptr);
     ASSERT_EQ(ty->Members().Length(), 2u);
 
     auto* fract = ty->Members()[0];
-    ASSERT_TRUE(fract->Type()->Is<type::Vector>());
-    EXPECT_EQ(fract->Type()->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(fract->Type()->As<type::Vector>()->type()->Is<type::F32>());
+    ASSERT_TRUE(fract->Type()->Is<core::type::Vector>());
+    EXPECT_EQ(fract->Type()->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(fract->Type()->As<core::type::Vector>()->type()->Is<core::type::F32>());
     EXPECT_EQ(fract->Offset(), 0u);
     EXPECT_EQ(fract->Size(), 12u);
     EXPECT_EQ(fract->Align(), 16u);
     EXPECT_EQ(fract->Name(), Sym("fract"));
 
     auto* whole = ty->Members()[1];
-    ASSERT_TRUE(whole->Type()->Is<type::Vector>());
-    EXPECT_EQ(whole->Type()->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(whole->Type()->As<type::Vector>()->type()->Is<type::F32>());
+    ASSERT_TRUE(whole->Type()->Is<core::type::Vector>());
+    EXPECT_EQ(whole->Type()->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(whole->Type()->As<core::type::Vector>()->type()->Is<core::type::F32>());
     EXPECT_EQ(whole->Offset(), 16u);
     EXPECT_EQ(whole->Size(), 12u);
     EXPECT_EQ(whole->Align(), 16u);
@@ -1292,23 +1292,23 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    auto* ty = TypeOf(call)->As<type::Struct>();
+    auto* ty = TypeOf(call)->As<core::type::Struct>();
     ASSERT_NE(ty, nullptr);
     ASSERT_EQ(ty->Members().Length(), 2u);
 
     auto* fract = ty->Members()[0];
-    ASSERT_TRUE(fract->Type()->Is<type::Vector>());
-    EXPECT_EQ(fract->Type()->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(fract->Type()->As<type::Vector>()->type()->Is<type::F16>());
+    ASSERT_TRUE(fract->Type()->Is<core::type::Vector>());
+    EXPECT_EQ(fract->Type()->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(fract->Type()->As<core::type::Vector>()->type()->Is<core::type::F16>());
     EXPECT_EQ(fract->Offset(), 0u);
     EXPECT_EQ(fract->Size(), 6u);
     EXPECT_EQ(fract->Align(), 8u);
     EXPECT_EQ(fract->Name(), Sym("fract"));
 
     auto* whole = ty->Members()[1];
-    ASSERT_TRUE(whole->Type()->Is<type::Vector>());
-    EXPECT_EQ(whole->Type()->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(whole->Type()->As<type::Vector>()->type()->Is<type::F16>());
+    ASSERT_TRUE(whole->Type()->Is<core::type::Vector>());
+    EXPECT_EQ(whole->Type()->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(whole->Type()->As<core::type::Vector>()->type()->Is<core::type::F16>());
     EXPECT_EQ(whole->Offset(), 8u);
     EXPECT_EQ(whole->Size(), 6u);
     EXPECT_EQ(whole->Align(), 8u);
@@ -1389,8 +1389,8 @@
 
     ASSERT_NE(TypeOf(call), nullptr);
     EXPECT_TRUE(TypeOf(call)->is_float_vector());
-    EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(TypeOf(call)->As<type::Vector>()->type()->Is<type::F32>());
+    EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(TypeOf(call)->As<core::type::Vector>()->type()->Is<core::type::F32>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Normalize_Vector_f16) {
@@ -1403,8 +1403,8 @@
 
     ASSERT_NE(TypeOf(call), nullptr);
     EXPECT_TRUE(TypeOf(call)->is_float_vector());
-    EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(TypeOf(call)->As<type::Vector>()->type()->Is<type::F16>());
+    EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(TypeOf(call)->As<core::type::Vector>()->type()->Is<core::type::F16>());
 }
 
 TEST_F(ResolverBuiltinFloatTest, Normalize_Error_NoParams) {
@@ -1465,7 +1465,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<type::I32>());
+        EXPECT_TRUE(TypeOf(call)->Is<core::type::I32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1487,9 +1487,9 @@
 
         ASSERT_NE(TypeOf(call), nullptr);
         EXPECT_TRUE(TypeOf(call)->is_signed_integer_vector());
-        EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 3u);
-        ASSERT_NE(TypeOf(call)->As<type::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<type::Vector>()->type()->Is<type::I32>());
+        EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 3u);
+        ASSERT_NE(TypeOf(call)->As<core::type::Vector>()->type(), nullptr);
+        EXPECT_TRUE(TypeOf(call)->As<core::type::Vector>()->type()->Is<core::type::I32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1510,7 +1510,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<type::U32>());
+        EXPECT_TRUE(TypeOf(call)->Is<core::type::U32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1532,9 +1532,9 @@
 
         ASSERT_NE(TypeOf(call), nullptr);
         EXPECT_TRUE(TypeOf(call)->is_unsigned_integer_vector());
-        EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 3u);
-        ASSERT_NE(TypeOf(call)->As<type::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<type::Vector>()->type()->Is<type::U32>());
+        EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 3u);
+        ASSERT_NE(TypeOf(call)->As<core::type::Vector>()->type(), nullptr);
+        EXPECT_TRUE(TypeOf(call)->As<core::type::Vector>()->type()->Is<core::type::U32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1555,7 +1555,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<type::I32>());
+        EXPECT_TRUE(TypeOf(call)->Is<core::type::I32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1577,9 +1577,9 @@
 
         ASSERT_NE(TypeOf(call), nullptr);
         EXPECT_TRUE(TypeOf(call)->is_signed_integer_vector());
-        EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 3u);
-        ASSERT_NE(TypeOf(call)->As<type::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<type::Vector>()->type()->Is<type::I32>());
+        EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 3u);
+        ASSERT_NE(TypeOf(call)->As<core::type::Vector>()->type(), nullptr);
+        EXPECT_TRUE(TypeOf(call)->As<core::type::Vector>()->type()->Is<core::type::I32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1600,7 +1600,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<type::U32>());
+        EXPECT_TRUE(TypeOf(call)->Is<core::type::U32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1622,9 +1622,9 @@
 
         ASSERT_NE(TypeOf(call), nullptr);
         EXPECT_TRUE(TypeOf(call)->is_unsigned_integer_vector());
-        EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 3u);
-        ASSERT_NE(TypeOf(call)->As<type::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<type::Vector>()->type()->Is<type::U32>());
+        EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 3u);
+        ASSERT_NE(TypeOf(call)->As<core::type::Vector>()->type(), nullptr);
+        EXPECT_TRUE(TypeOf(call)->As<core::type::Vector>()->type()->Is<core::type::U32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1645,7 +1645,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<type::I32>());
+        EXPECT_TRUE(TypeOf(call)->Is<core::type::I32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1668,9 +1668,9 @@
 
         ASSERT_NE(TypeOf(call), nullptr);
         EXPECT_TRUE(TypeOf(call)->is_signed_integer_vector());
-        EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 3u);
-        ASSERT_NE(TypeOf(call)->As<type::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<type::Vector>()->type()->Is<type::I32>());
+        EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 3u);
+        ASSERT_NE(TypeOf(call)->As<core::type::Vector>()->type(), nullptr);
+        EXPECT_TRUE(TypeOf(call)->As<core::type::Vector>()->type()->Is<core::type::I32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1692,7 +1692,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<type::U32>());
+        EXPECT_TRUE(TypeOf(call)->Is<core::type::U32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1715,9 +1715,9 @@
 
         ASSERT_NE(TypeOf(call), nullptr);
         EXPECT_TRUE(TypeOf(call)->is_unsigned_integer_vector());
-        EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 3u);
-        ASSERT_NE(TypeOf(call)->As<type::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<type::Vector>()->type()->Is<type::U32>());
+        EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 3u);
+        ASSERT_NE(TypeOf(call)->As<core::type::Vector>()->type(), nullptr);
+        EXPECT_TRUE(TypeOf(call)->As<core::type::Vector>()->type()->Is<core::type::U32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1739,7 +1739,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<type::I32>());
+        EXPECT_TRUE(TypeOf(call)->Is<core::type::I32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1762,9 +1762,9 @@
 
         ASSERT_NE(TypeOf(call), nullptr);
         EXPECT_TRUE(TypeOf(call)->is_signed_integer_vector());
-        EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 3u);
-        ASSERT_NE(TypeOf(call)->As<type::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<type::Vector>()->type()->Is<type::I32>());
+        EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 3u);
+        ASSERT_NE(TypeOf(call)->As<core::type::Vector>()->type(), nullptr);
+        EXPECT_TRUE(TypeOf(call)->As<core::type::Vector>()->type()->Is<core::type::I32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1786,7 +1786,7 @@
         EXPECT_TRUE(r()->Resolve()) << r()->error();
 
         ASSERT_NE(TypeOf(call), nullptr);
-        EXPECT_TRUE(TypeOf(call)->Is<type::U32>());
+        EXPECT_TRUE(TypeOf(call)->Is<core::type::U32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1809,9 +1809,9 @@
 
         ASSERT_NE(TypeOf(call), nullptr);
         EXPECT_TRUE(TypeOf(call)->is_unsigned_integer_vector());
-        EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 3u);
-        ASSERT_NE(TypeOf(call)->As<type::Vector>()->type(), nullptr);
-        EXPECT_TRUE(TypeOf(call)->As<type::Vector>()->type()->Is<type::U32>());
+        EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 3u);
+        ASSERT_NE(TypeOf(call)->As<core::type::Vector>()->type(), nullptr);
+        EXPECT_TRUE(TypeOf(call)->As<core::type::Vector>()->type()->Is<core::type::U32>());
     } else {
         // Invalid parameter count.
         EXPECT_FALSE(r()->Resolve());
@@ -1853,7 +1853,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(call)->Is<core::type::F32>());
 }
 
 TEST_F(ResolverBuiltinTest, Determinant_2x2_f16) {
@@ -1867,7 +1867,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<type::F16>());
+    EXPECT_TRUE(TypeOf(call)->Is<core::type::F16>());
 }
 
 TEST_F(ResolverBuiltinTest, Determinant_3x3_f32) {
@@ -1879,7 +1879,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(call)->Is<core::type::F32>());
 }
 
 TEST_F(ResolverBuiltinTest, Determinant_3x3_f16) {
@@ -1893,7 +1893,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<type::F16>());
+    EXPECT_TRUE(TypeOf(call)->Is<core::type::F16>());
 }
 
 TEST_F(ResolverBuiltinTest, Determinant_4x4_f32) {
@@ -1905,7 +1905,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(call)->Is<core::type::F32>());
 }
 
 TEST_F(ResolverBuiltinTest, Determinant_4x4_f16) {
@@ -1919,7 +1919,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<type::F16>());
+    EXPECT_TRUE(TypeOf(call)->Is<core::type::F16>());
 }
 
 TEST_F(ResolverBuiltinTest, Determinant_NotSquare) {
@@ -1966,7 +1966,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    EXPECT_TRUE(TypeOf(expr)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(expr)->Is<core::type::F32>());
 }
 
 TEST_F(ResolverBuiltinTest, Dot_Vec2_f16) {
@@ -1980,7 +1980,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    EXPECT_TRUE(TypeOf(expr)->Is<type::F16>());
+    EXPECT_TRUE(TypeOf(expr)->Is<core::type::F16>());
 }
 
 TEST_F(ResolverBuiltinTest, Dot_Vec3_i32) {
@@ -1992,7 +1992,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    EXPECT_TRUE(TypeOf(expr)->Is<type::I32>());
+    EXPECT_TRUE(TypeOf(expr)->Is<core::type::I32>());
 }
 
 TEST_F(ResolverBuiltinTest, Dot_Vec4_u32) {
@@ -2004,7 +2004,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    EXPECT_TRUE(TypeOf(expr)->Is<type::U32>());
+    EXPECT_TRUE(TypeOf(expr)->Is<core::type::U32>());
 }
 
 TEST_F(ResolverBuiltinTest, Dot_Error_Scalar) {
@@ -2040,7 +2040,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    ASSERT_TRUE(TypeOf(expr)->Is<type::F32>());
+    ASSERT_TRUE(TypeOf(expr)->Is<core::type::F32>());
 }
 
 TEST_P(ResolverBuiltinDerivativeTest, Vector) {
@@ -2054,9 +2054,9 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    ASSERT_TRUE(TypeOf(expr)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(expr)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(expr)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(expr)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(expr)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(expr)->As<core::type::Vector>()->Width(), 4u);
 }
 
 TEST_P(ResolverBuiltinDerivativeTest, MissingParam) {
@@ -2104,7 +2104,7 @@
 }
 
 struct TextureTestParams {
-    type::TextureDimension dim;
+    core::type::TextureDimension dim;
     Texture type = Texture::kF32;
     core::TexelFormat format = core::TexelFormat::kR32Float;
 };
@@ -2122,16 +2122,16 @@
     /// @param dim dimensionality of the texture being sampled
     /// @param scalar the scalar type
     /// @returns a pointer to a type appropriate for the coord param
-    ast::Type GetCoordsType(type::TextureDimension dim, ast::Type scalar) {
+    ast::Type GetCoordsType(core::type::TextureDimension dim, ast::Type scalar) {
         switch (dim) {
-            case type::TextureDimension::k1d:
+            case core::type::TextureDimension::k1d:
                 return ty(scalar);
-            case type::TextureDimension::k2d:
-            case type::TextureDimension::k2dArray:
+            case core::type::TextureDimension::k2d:
+            case core::type::TextureDimension::k2dArray:
                 return ty.vec2(scalar);
-            case type::TextureDimension::k3d:
-            case type::TextureDimension::kCube:
-            case type::TextureDimension::kCubeArray:
+            case core::type::TextureDimension::k3d:
+            case core::type::TextureDimension::kCube:
+            case core::type::TextureDimension::kCubeArray:
                 return ty.vec3(scalar);
             default:
                 [=] {
@@ -2177,7 +2177,7 @@
 
     add_call_param("texture", texture_type, &call_params);
     add_call_param("coords", coords_type, &call_params);
-    if (dim == type::TextureDimension::k2dArray) {
+    if (dim == core::type::TextureDimension::k2dArray) {
         add_call_param("array_index", ty.i32(), &call_params);
     }
     add_call_param("level", ty.i32(), &call_params);
@@ -2188,23 +2188,23 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    ASSERT_TRUE(TypeOf(expr)->Is<type::Vector>());
+    ASSERT_TRUE(TypeOf(expr)->Is<core::type::Vector>());
     if (type == Texture::kF32) {
-        EXPECT_TRUE(TypeOf(expr)->As<type::Vector>()->type()->Is<type::F32>());
+        EXPECT_TRUE(TypeOf(expr)->As<core::type::Vector>()->type()->Is<core::type::F32>());
     } else if (type == Texture::kI32) {
-        EXPECT_TRUE(TypeOf(expr)->As<type::Vector>()->type()->Is<type::I32>());
+        EXPECT_TRUE(TypeOf(expr)->As<core::type::Vector>()->type()->Is<core::type::I32>());
     } else {
-        EXPECT_TRUE(TypeOf(expr)->As<type::Vector>()->type()->Is<type::U32>());
+        EXPECT_TRUE(TypeOf(expr)->As<core::type::Vector>()->type()->Is<core::type::U32>());
     }
-    EXPECT_EQ(TypeOf(expr)->As<type::Vector>()->Width(), 4u);
+    EXPECT_EQ(TypeOf(expr)->As<core::type::Vector>()->Width(), 4u);
 }
 
 INSTANTIATE_TEST_SUITE_P(ResolverTest,
                          ResolverBuiltinTest_SampledTextureOperation,
-                         testing::Values(TextureTestParams{type::TextureDimension::k1d},
-                                         TextureTestParams{type::TextureDimension::k2d},
-                                         TextureTestParams{type::TextureDimension::k2dArray},
-                                         TextureTestParams{type::TextureDimension::k3d}));
+                         testing::Values(TextureTestParams{core::type::TextureDimension::k1d},
+                                         TextureTestParams{core::type::TextureDimension::k2d},
+                                         TextureTestParams{core::type::TextureDimension::k2dArray},
+                                         TextureTestParams{core::type::TextureDimension::k3d}));
 
 using ResolverBuiltinTest_Texture = ResolverTestWithParam<ast::test::TextureOverloadCase>;
 
@@ -2480,78 +2480,78 @@
                 str << param.texture_dimension;
                 FAIL() << "invalid texture dimensions: " << str.str();
             }
-            case type::TextureDimension::k1d:
-                EXPECT_TRUE(TypeOf(call)->Is<type::U32>());
+            case core::type::TextureDimension::k1d:
+                EXPECT_TRUE(TypeOf(call)->Is<core::type::U32>());
                 break;
-            case type::TextureDimension::k2d:
-            case type::TextureDimension::k2dArray:
-            case type::TextureDimension::kCube:
-            case type::TextureDimension::kCubeArray: {
-                auto* vec = As<type::Vector>(TypeOf(call));
+            case core::type::TextureDimension::k2d:
+            case core::type::TextureDimension::k2dArray:
+            case core::type::TextureDimension::kCube:
+            case core::type::TextureDimension::kCubeArray: {
+                auto* vec = As<core::type::Vector>(TypeOf(call));
                 ASSERT_NE(vec, nullptr);
                 EXPECT_EQ(vec->Width(), 2u);
-                EXPECT_TRUE(vec->type()->Is<type::U32>());
+                EXPECT_TRUE(vec->type()->Is<core::type::U32>());
                 break;
             }
-            case type::TextureDimension::k3d: {
-                auto* vec = As<type::Vector>(TypeOf(call));
+            case core::type::TextureDimension::k3d: {
+                auto* vec = As<core::type::Vector>(TypeOf(call));
                 ASSERT_NE(vec, nullptr);
                 EXPECT_EQ(vec->Width(), 3u);
-                EXPECT_TRUE(vec->type()->Is<type::U32>());
+                EXPECT_TRUE(vec->type()->Is<core::type::U32>());
                 break;
             }
         }
     } else if (std::string(param.function) == "textureNumLayers") {
-        EXPECT_TRUE(TypeOf(call)->Is<type::U32>());
+        EXPECT_TRUE(TypeOf(call)->Is<core::type::U32>());
     } else if (std::string(param.function) == "textureNumLevels") {
-        EXPECT_TRUE(TypeOf(call)->Is<type::U32>());
+        EXPECT_TRUE(TypeOf(call)->Is<core::type::U32>());
     } else if (std::string(param.function) == "textureNumSamples") {
-        EXPECT_TRUE(TypeOf(call)->Is<type::U32>());
+        EXPECT_TRUE(TypeOf(call)->Is<core::type::U32>());
     } else if (std::string(param.function) == "textureStore") {
-        EXPECT_TRUE(TypeOf(call)->Is<type::Void>());
+        EXPECT_TRUE(TypeOf(call)->Is<core::type::Void>());
     } else if (std::string(param.function) == "textureGather") {
-        auto* vec = As<type::Vector>(TypeOf(call));
+        auto* vec = As<core::type::Vector>(TypeOf(call));
         ASSERT_NE(vec, nullptr);
         EXPECT_EQ(vec->Width(), 4u);
         switch (param.texture_data_type) {
             case ast::test::TextureDataType::kF32:
-                EXPECT_TRUE(vec->type()->Is<type::F32>());
+                EXPECT_TRUE(vec->type()->Is<core::type::F32>());
                 break;
             case ast::test::TextureDataType::kU32:
-                EXPECT_TRUE(vec->type()->Is<type::U32>());
+                EXPECT_TRUE(vec->type()->Is<core::type::U32>());
                 break;
             case ast::test::TextureDataType::kI32:
-                EXPECT_TRUE(vec->type()->Is<type::I32>());
+                EXPECT_TRUE(vec->type()->Is<core::type::I32>());
                 break;
         }
     } else if (std::string(param.function) == "textureGatherCompare") {
-        auto* vec = As<type::Vector>(TypeOf(call));
+        auto* vec = As<core::type::Vector>(TypeOf(call));
         ASSERT_NE(vec, nullptr);
         EXPECT_EQ(vec->Width(), 4u);
-        EXPECT_TRUE(vec->type()->Is<type::F32>());
+        EXPECT_TRUE(vec->type()->Is<core::type::F32>());
     } else {
         switch (param.texture_kind) {
             case ast::test::TextureKind::kRegular:
             case ast::test::TextureKind::kMultisampled:
             case ast::test::TextureKind::kStorage: {
-                auto* vec = TypeOf(call)->As<type::Vector>();
+                auto* vec = TypeOf(call)->As<core::type::Vector>();
                 ASSERT_NE(vec, nullptr);
                 switch (param.texture_data_type) {
                     case ast::test::TextureDataType::kF32:
-                        EXPECT_TRUE(vec->type()->Is<type::F32>());
+                        EXPECT_TRUE(vec->type()->Is<core::type::F32>());
                         break;
                     case ast::test::TextureDataType::kU32:
-                        EXPECT_TRUE(vec->type()->Is<type::U32>());
+                        EXPECT_TRUE(vec->type()->Is<core::type::U32>());
                         break;
                     case ast::test::TextureDataType::kI32:
-                        EXPECT_TRUE(vec->type()->Is<type::I32>());
+                        EXPECT_TRUE(vec->type()->Is<core::type::I32>());
                         break;
                 }
                 break;
             }
             case ast::test::TextureKind::kDepth:
             case ast::test::TextureKind::kDepthMultisampled: {
-                EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
+                EXPECT_TRUE(TypeOf(call)->Is<core::type::F32>());
                 break;
             }
         }
@@ -2585,7 +2585,7 @@
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<type::U32>());
+    EXPECT_TRUE(TypeOf(call)->Is<core::type::U32>());
 }
 
 TEST_P(ResolverBuiltinTest_DataPacking, Error_IncorrectParamType) {
@@ -2657,9 +2657,9 @@
     ASSERT_NE(TypeOf(call), nullptr);
     EXPECT_TRUE(TypeOf(call)->is_float_vector());
     if (pack4) {
-        EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 4u);
+        EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 4u);
     } else {
-        EXPECT_EQ(TypeOf(call)->As<type::Vector>()->Width(), 2u);
+        EXPECT_EQ(TypeOf(call)->As<core::type::Vector>()->Width(), 2u);
     }
 }
 
@@ -2686,7 +2686,7 @@
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<type::Void>());
+    EXPECT_TRUE(TypeOf(call)->Is<core::type::Void>());
 }
 
 TEST_P(ResolverBuiltinTest_Barrier, Error_TooManyParams) {
diff --git a/src/tint/lang/wgsl/resolver/builtins_validation_test.cc b/src/tint/lang/wgsl/resolver/builtins_validation_test.cc
index 74d7fd3..204a678 100644
--- a/src/tint/lang/wgsl/resolver/builtins_validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/builtins_validation_test.cc
@@ -936,12 +936,12 @@
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
-    auto* res_ty = TypeOf(builtin)->As<type::Struct>();
+    auto* res_ty = TypeOf(builtin)->As<core::type::Struct>();
     ASSERT_TRUE(res_ty != nullptr);
     auto members = res_ty->Members();
     ASSERT_EQ(members.Length(), 2u);
-    EXPECT_TRUE(members[0]->Type()->Is<type::F32>());
-    EXPECT_TRUE(members[1]->Type()->Is<type::I32>());
+    EXPECT_TRUE(members[0]->Type()->Is<core::type::F32>());
+    EXPECT_TRUE(members[1]->Type()->Is<core::type::I32>());
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Frexp_Vec2) {
@@ -949,16 +949,16 @@
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
-    auto* res_ty = TypeOf(builtin)->As<type::Struct>();
+    auto* res_ty = TypeOf(builtin)->As<core::type::Struct>();
     ASSERT_TRUE(res_ty != nullptr);
     auto members = res_ty->Members();
     ASSERT_EQ(members.Length(), 2u);
-    ASSERT_TRUE(members[0]->Type()->Is<type::Vector>());
-    ASSERT_TRUE(members[1]->Type()->Is<type::Vector>());
-    EXPECT_EQ(members[0]->Type()->As<type::Vector>()->Width(), 2u);
-    EXPECT_TRUE(members[0]->Type()->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(members[1]->Type()->As<type::Vector>()->Width(), 2u);
-    EXPECT_TRUE(members[1]->Type()->As<type::Vector>()->type()->Is<type::I32>());
+    ASSERT_TRUE(members[0]->Type()->Is<core::type::Vector>());
+    ASSERT_TRUE(members[1]->Type()->Is<core::type::Vector>());
+    EXPECT_EQ(members[0]->Type()->As<core::type::Vector>()->Width(), 2u);
+    EXPECT_TRUE(members[0]->Type()->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(members[1]->Type()->As<core::type::Vector>()->Width(), 2u);
+    EXPECT_TRUE(members[1]->Type()->As<core::type::Vector>()->type()->Is<core::type::I32>());
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Frexp_Vec3) {
@@ -966,16 +966,16 @@
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
-    auto* res_ty = TypeOf(builtin)->As<type::Struct>();
+    auto* res_ty = TypeOf(builtin)->As<core::type::Struct>();
     ASSERT_TRUE(res_ty != nullptr);
     auto members = res_ty->Members();
     ASSERT_EQ(members.Length(), 2u);
-    ASSERT_TRUE(members[0]->Type()->Is<type::Vector>());
-    ASSERT_TRUE(members[1]->Type()->Is<type::Vector>());
-    EXPECT_EQ(members[0]->Type()->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(members[0]->Type()->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(members[1]->Type()->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(members[1]->Type()->As<type::Vector>()->type()->Is<type::I32>());
+    ASSERT_TRUE(members[0]->Type()->Is<core::type::Vector>());
+    ASSERT_TRUE(members[1]->Type()->Is<core::type::Vector>());
+    EXPECT_EQ(members[0]->Type()->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(members[0]->Type()->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(members[1]->Type()->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(members[1]->Type()->As<core::type::Vector>()->type()->Is<core::type::I32>());
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Frexp_Vec4) {
@@ -983,16 +983,16 @@
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
-    auto* res_ty = TypeOf(builtin)->As<type::Struct>();
+    auto* res_ty = TypeOf(builtin)->As<core::type::Struct>();
     ASSERT_TRUE(res_ty != nullptr);
     auto members = res_ty->Members();
     ASSERT_EQ(members.Length(), 2u);
-    ASSERT_TRUE(members[0]->Type()->Is<type::Vector>());
-    ASSERT_TRUE(members[1]->Type()->Is<type::Vector>());
-    EXPECT_EQ(members[0]->Type()->As<type::Vector>()->Width(), 4u);
-    EXPECT_TRUE(members[0]->Type()->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(members[1]->Type()->As<type::Vector>()->Width(), 4u);
-    EXPECT_TRUE(members[1]->Type()->As<type::Vector>()->type()->Is<type::I32>());
+    ASSERT_TRUE(members[0]->Type()->Is<core::type::Vector>());
+    ASSERT_TRUE(members[1]->Type()->Is<core::type::Vector>());
+    EXPECT_EQ(members[0]->Type()->As<core::type::Vector>()->Width(), 4u);
+    EXPECT_TRUE(members[0]->Type()->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(members[1]->Type()->As<core::type::Vector>()->Width(), 4u);
+    EXPECT_TRUE(members[1]->Type()->As<core::type::Vector>()->type()->Is<core::type::I32>());
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Modf_Scalar) {
@@ -1000,12 +1000,12 @@
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
-    auto* res_ty = TypeOf(builtin)->As<type::Struct>();
+    auto* res_ty = TypeOf(builtin)->As<core::type::Struct>();
     ASSERT_TRUE(res_ty != nullptr);
     auto members = res_ty->Members();
     ASSERT_EQ(members.Length(), 2u);
-    EXPECT_TRUE(members[0]->Type()->Is<type::F32>());
-    EXPECT_TRUE(members[1]->Type()->Is<type::F32>());
+    EXPECT_TRUE(members[0]->Type()->Is<core::type::F32>());
+    EXPECT_TRUE(members[1]->Type()->Is<core::type::F32>());
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Modf_Vec2) {
@@ -1013,16 +1013,16 @@
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
-    auto* res_ty = TypeOf(builtin)->As<type::Struct>();
+    auto* res_ty = TypeOf(builtin)->As<core::type::Struct>();
     ASSERT_TRUE(res_ty != nullptr);
     auto members = res_ty->Members();
     ASSERT_EQ(members.Length(), 2u);
-    ASSERT_TRUE(members[0]->Type()->Is<type::Vector>());
-    ASSERT_TRUE(members[1]->Type()->Is<type::Vector>());
-    EXPECT_EQ(members[0]->Type()->As<type::Vector>()->Width(), 2u);
-    EXPECT_TRUE(members[0]->Type()->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(members[1]->Type()->As<type::Vector>()->Width(), 2u);
-    EXPECT_TRUE(members[1]->Type()->As<type::Vector>()->type()->Is<type::F32>());
+    ASSERT_TRUE(members[0]->Type()->Is<core::type::Vector>());
+    ASSERT_TRUE(members[1]->Type()->Is<core::type::Vector>());
+    EXPECT_EQ(members[0]->Type()->As<core::type::Vector>()->Width(), 2u);
+    EXPECT_TRUE(members[0]->Type()->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(members[1]->Type()->As<core::type::Vector>()->Width(), 2u);
+    EXPECT_TRUE(members[1]->Type()->As<core::type::Vector>()->type()->Is<core::type::F32>());
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Modf_Vec3) {
@@ -1030,16 +1030,16 @@
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
-    auto* res_ty = TypeOf(builtin)->As<type::Struct>();
+    auto* res_ty = TypeOf(builtin)->As<core::type::Struct>();
     ASSERT_TRUE(res_ty != nullptr);
     auto members = res_ty->Members();
     ASSERT_EQ(members.Length(), 2u);
-    ASSERT_TRUE(members[0]->Type()->Is<type::Vector>());
-    ASSERT_TRUE(members[1]->Type()->Is<type::Vector>());
-    EXPECT_EQ(members[0]->Type()->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(members[0]->Type()->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(members[1]->Type()->As<type::Vector>()->Width(), 3u);
-    EXPECT_TRUE(members[1]->Type()->As<type::Vector>()->type()->Is<type::F32>());
+    ASSERT_TRUE(members[0]->Type()->Is<core::type::Vector>());
+    ASSERT_TRUE(members[1]->Type()->Is<core::type::Vector>());
+    EXPECT_EQ(members[0]->Type()->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(members[0]->Type()->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(members[1]->Type()->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_TRUE(members[1]->Type()->As<core::type::Vector>()->type()->Is<core::type::F32>());
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Modf_Vec4) {
@@ -1047,16 +1047,16 @@
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
-    auto* res_ty = TypeOf(builtin)->As<type::Struct>();
+    auto* res_ty = TypeOf(builtin)->As<core::type::Struct>();
     ASSERT_TRUE(res_ty != nullptr);
     auto members = res_ty->Members();
     ASSERT_EQ(members.Length(), 2u);
-    ASSERT_TRUE(members[0]->Type()->Is<type::Vector>());
-    ASSERT_TRUE(members[1]->Type()->Is<type::Vector>());
-    EXPECT_EQ(members[0]->Type()->As<type::Vector>()->Width(), 4u);
-    EXPECT_TRUE(members[0]->Type()->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(members[1]->Type()->As<type::Vector>()->Width(), 4u);
-    EXPECT_TRUE(members[1]->Type()->As<type::Vector>()->type()->Is<type::F32>());
+    ASSERT_TRUE(members[0]->Type()->Is<core::type::Vector>());
+    ASSERT_TRUE(members[1]->Type()->Is<core::type::Vector>());
+    EXPECT_EQ(members[0]->Type()->As<core::type::Vector>()->Width(), 4u);
+    EXPECT_TRUE(members[0]->Type()->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(members[1]->Type()->As<core::type::Vector>()->Width(), 4u);
+    EXPECT_TRUE(members[1]->Type()->As<core::type::Vector>()->type()->Is<core::type::F32>());
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Cross_Float_Vec3) {
@@ -1158,7 +1158,7 @@
          });
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
-    EXPECT_TRUE(TypeOf(builtin)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(builtin)->Is<core::type::F32>());
 }
 
 TEST_P(FloatAllMatching, Vec2) {
@@ -1282,7 +1282,7 @@
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
-    EXPECT_TRUE(TypeOf(builtin)->Is<type::U32>());
+    EXPECT_TRUE(TypeOf(builtin)->Is<core::type::U32>());
 }
 
 TEST_P(IntegerAllMatching, Vec2Unsigned) {
@@ -1342,7 +1342,7 @@
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
-    EXPECT_TRUE(TypeOf(builtin)->Is<type::I32>());
+    EXPECT_TRUE(TypeOf(builtin)->Is<core::type::I32>());
 }
 
 TEST_P(IntegerAllMatching, Vec2Signed) {
diff --git a/src/tint/lang/wgsl/resolver/dependency_graph_test.cc b/src/tint/lang/wgsl/resolver/dependency_graph_test.cc
index 9f3fb00..1ceb195 100644
--- a/src/tint/lang/wgsl/resolver/dependency_graph_test.cc
+++ b/src/tint/lang/wgsl/resolver/dependency_graph_test.cc
@@ -489,12 +489,13 @@
         }
         case SymbolUseKind::GlobalVarSampledTexElemType: {
             ast::Type node = b.ty(source, symbol);
-            b.GlobalVar(b.Sym(), b.ty.sampled_texture(type::TextureDimension::k2d, node));
+            b.GlobalVar(b.Sym(), b.ty.sampled_texture(core::type::TextureDimension::k2d, node));
             return node->identifier;
         }
         case SymbolUseKind::GlobalVarMultisampledTexElemType: {
             ast::Type node = b.ty(source, symbol);
-            b.GlobalVar(b.Sym(), b.ty.multisampled_texture(type::TextureDimension::k2d, node));
+            b.GlobalVar(b.Sym(),
+                        b.ty.multisampled_texture(core::type::TextureDimension::k2d, node));
             return node->identifier;
         }
         case SymbolUseKind::GlobalVarValue: {
@@ -1722,14 +1723,14 @@
     GlobalVar(Sym(), ty.vec3(T));
     GlobalVar(Sym(), ty.mat3x2(T));
     GlobalVar(Sym(), ty.ptr<private_>(T));
-    GlobalVar(Sym(), ty.sampled_texture(type::TextureDimension::k2d, T));
-    GlobalVar(Sym(), ty.depth_texture(type::TextureDimension::k2d));
-    GlobalVar(Sym(), ty.depth_multisampled_texture(type::TextureDimension::k2d));
+    GlobalVar(Sym(), ty.sampled_texture(core::type::TextureDimension::k2d, T));
+    GlobalVar(Sym(), ty.depth_texture(core::type::TextureDimension::k2d));
+    GlobalVar(Sym(), ty.depth_multisampled_texture(core::type::TextureDimension::k2d));
     GlobalVar(Sym(), ty.external_texture());
-    GlobalVar(Sym(), ty.multisampled_texture(type::TextureDimension::k2d, T));
-    GlobalVar(Sym(), ty.storage_texture(type::TextureDimension::k2d, core::TexelFormat::kR32Float,
-                                        core::Access::kRead));
-    GlobalVar(Sym(), ty.sampler(type::SamplerKind::kSampler));
+    GlobalVar(Sym(), ty.multisampled_texture(core::type::TextureDimension::k2d, T));
+    GlobalVar(Sym(), ty.storage_texture(core::type::TextureDimension::k2d,
+                                        core::TexelFormat::kR32Float, core::Access::kRead));
+    GlobalVar(Sym(), ty.sampler(core::type::SamplerKind::kSampler));
 
     GlobalVar(Sym(), ty.i32(), Vector{Binding(V), Group(V)});
     GlobalVar(Sym(), ty.i32(), Vector{Location(V)});
diff --git a/src/tint/lang/wgsl/resolver/expression_kind_test.cc b/src/tint/lang/wgsl/resolver/expression_kind_test.cc
index 3e1e991..00511d9 100644
--- a/src/tint/lang/wgsl/resolver/expression_kind_test.cc
+++ b/src/tint/lang/wgsl/resolver/expression_kind_test.cc
@@ -178,7 +178,7 @@
                 ASSERT_NE(expr, nullptr);
                 auto* ty_expr = expr->As<sem::TypeExpression>();
                 ASSERT_NE(ty_expr, nullptr);
-                EXPECT_TRUE(ty_expr->Type()->Is<type::Vector>());
+                EXPECT_TRUE(ty_expr->Type()->Is<core::type::Vector>());
             };
             break;
         }
@@ -266,7 +266,7 @@
                 ASSERT_NE(expr, nullptr);
                 auto* ty_expr = expr->As<sem::TypeExpression>();
                 ASSERT_NE(ty_expr, nullptr);
-                EXPECT_TRUE(ty_expr->Type()->Is<type::I32>());
+                EXPECT_TRUE(ty_expr->Type()->Is<core::type::I32>());
             };
             break;
         }
diff --git a/src/tint/lang/wgsl/resolver/inferred_type_test.cc b/src/tint/lang/wgsl/resolver/inferred_type_test.cc
index 5032828..750fc39 100644
--- a/src/tint/lang/wgsl/resolver/inferred_type_test.cc
+++ b/src/tint/lang/wgsl/resolver/inferred_type_test.cc
@@ -124,8 +124,9 @@
 
 TEST_F(ResolverInferredTypeTest, InferArray_Pass) {
     auto type = ty.array<u32, 10>();
-    auto* expected_type = create<type::Array>(
-        create<type::U32>(), create<type::ConstantArrayCount>(10u), 4u, 4u * 10u, 4u, 4u);
+    auto* expected_type = create<core::type::Array>(create<core::type::U32>(),
+                                                    create<core::type::ConstantArrayCount>(10u), 4u,
+                                                    4u * 10u, 4u, 4u);
 
     auto* ctor_expr = Call(type);
     auto* var = Var("a", core::AddressSpace::kFunction, ctor_expr);
@@ -141,8 +142,8 @@
 
     auto* expected_type = create<sem::Struct>(
         str, str->name->symbol,
-        Vector{create<sem::StructMember>(member, member->name->symbol, create<type::I32>(), 0u, 0u,
-                                         0u, 4u, type::StructMemberAttributes{})},
+        Vector{create<sem::StructMember>(member, member->name->symbol, create<core::type::I32>(),
+                                         0u, 0u, 0u, 4u, core::type::StructMemberAttributes{})},
         0u, 4u, 4u);
 
     auto* ctor_expr = Call(ty.Of(str));
diff --git a/src/tint/lang/wgsl/resolver/is_host_shareable_test.cc b/src/tint/lang/wgsl/resolver/is_host_shareable_test.cc
index f6b4e00..e23a9b5 100644
--- a/src/tint/lang/wgsl/resolver/is_host_shareable_test.cc
+++ b/src/tint/lang/wgsl/resolver/is_host_shareable_test.cc
@@ -24,96 +24,96 @@
 using ResolverIsHostShareable = ResolverTest;
 
 TEST_F(ResolverIsHostShareable, Void) {
-    EXPECT_FALSE(r()->IsHostShareable(create<type::Void>()));
+    EXPECT_FALSE(r()->IsHostShareable(create<core::type::Void>()));
 }
 
 TEST_F(ResolverIsHostShareable, Bool) {
-    EXPECT_FALSE(r()->IsHostShareable(create<type::Bool>()));
+    EXPECT_FALSE(r()->IsHostShareable(create<core::type::Bool>()));
 }
 
 TEST_F(ResolverIsHostShareable, NumericScalar) {
-    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>()));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::I32>()));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::U32>()));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::F32>()));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::F16>()));
 }
 
 TEST_F(ResolverIsHostShareable, NumericVector) {
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Vector>(create<type::I32>(), 2u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Vector>(create<type::I32>(), 3u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Vector>(create<type::I32>(), 4u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Vector>(create<type::U32>(), 2u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Vector>(create<type::U32>(), 3u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Vector>(create<type::U32>(), 4u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Vector>(create<type::F32>(), 2u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Vector>(create<type::F32>(), 3u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Vector>(create<type::F32>(), 4u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Vector>(create<type::F16>(), 2u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Vector>(create<type::F16>(), 3u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Vector>(create<type::F16>(), 4u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Vector>(create<core::type::I32>(), 2u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Vector>(create<core::type::I32>(), 3u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Vector>(create<core::type::I32>(), 4u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Vector>(create<core::type::U32>(), 2u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Vector>(create<core::type::U32>(), 3u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Vector>(create<core::type::U32>(), 4u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Vector>(create<core::type::F32>(), 2u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Vector>(create<core::type::F32>(), 3u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Vector>(create<core::type::F32>(), 4u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Vector>(create<core::type::F16>(), 2u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Vector>(create<core::type::F16>(), 3u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Vector>(create<core::type::F16>(), 4u)));
 }
 
 TEST_F(ResolverIsHostShareable, BoolVector) {
-    EXPECT_FALSE(r()->IsHostShareable(create<type::Vector>(create<type::Bool>(), 2u)));
-    EXPECT_FALSE(r()->IsHostShareable(create<type::Vector>(create<type::Bool>(), 3u)));
-    EXPECT_FALSE(r()->IsHostShareable(create<type::Vector>(create<type::Bool>(), 4u)));
-    EXPECT_FALSE(r()->IsHostShareable(create<type::Vector>(create<type::Bool>(), 2u)));
-    EXPECT_FALSE(r()->IsHostShareable(create<type::Vector>(create<type::Bool>(), 3u)));
-    EXPECT_FALSE(r()->IsHostShareable(create<type::Vector>(create<type::Bool>(), 4u)));
-    EXPECT_FALSE(r()->IsHostShareable(create<type::Vector>(create<type::Bool>(), 2u)));
-    EXPECT_FALSE(r()->IsHostShareable(create<type::Vector>(create<type::Bool>(), 3u)));
-    EXPECT_FALSE(r()->IsHostShareable(create<type::Vector>(create<type::Bool>(), 4u)));
+    EXPECT_FALSE(r()->IsHostShareable(create<core::type::Vector>(create<core::type::Bool>(), 2u)));
+    EXPECT_FALSE(r()->IsHostShareable(create<core::type::Vector>(create<core::type::Bool>(), 3u)));
+    EXPECT_FALSE(r()->IsHostShareable(create<core::type::Vector>(create<core::type::Bool>(), 4u)));
+    EXPECT_FALSE(r()->IsHostShareable(create<core::type::Vector>(create<core::type::Bool>(), 2u)));
+    EXPECT_FALSE(r()->IsHostShareable(create<core::type::Vector>(create<core::type::Bool>(), 3u)));
+    EXPECT_FALSE(r()->IsHostShareable(create<core::type::Vector>(create<core::type::Bool>(), 4u)));
+    EXPECT_FALSE(r()->IsHostShareable(create<core::type::Vector>(create<core::type::Bool>(), 2u)));
+    EXPECT_FALSE(r()->IsHostShareable(create<core::type::Vector>(create<core::type::Bool>(), 3u)));
+    EXPECT_FALSE(r()->IsHostShareable(create<core::type::Vector>(create<core::type::Bool>(), 4u)));
 }
 
 TEST_F(ResolverIsHostShareable, Matrix) {
-    auto* vec2_f32 = create<type::Vector>(create<type::F32>(), 2u);
-    auto* vec3_f32 = create<type::Vector>(create<type::F32>(), 3u);
-    auto* vec4_f32 = create<type::Vector>(create<type::F32>(), 4u);
-    auto* vec2_f16 = create<type::Vector>(create<type::F16>(), 2u);
-    auto* vec3_f16 = create<type::Vector>(create<type::F16>(), 3u);
-    auto* vec4_f16 = create<type::Vector>(create<type::F16>(), 4u);
+    auto* vec2_f32 = create<core::type::Vector>(create<core::type::F32>(), 2u);
+    auto* vec3_f32 = create<core::type::Vector>(create<core::type::F32>(), 3u);
+    auto* vec4_f32 = create<core::type::Vector>(create<core::type::F32>(), 4u);
+    auto* vec2_f16 = create<core::type::Vector>(create<core::type::F16>(), 2u);
+    auto* vec3_f16 = create<core::type::Vector>(create<core::type::F16>(), 3u);
+    auto* vec4_f16 = create<core::type::Vector>(create<core::type::F16>(), 4u);
 
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Matrix>(vec2_f32, 2u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Matrix>(vec2_f32, 3u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Matrix>(vec2_f32, 4u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Matrix>(vec3_f32, 2u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Matrix>(vec3_f32, 3u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Matrix>(vec3_f32, 4u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Matrix>(vec4_f32, 2u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Matrix>(vec4_f32, 3u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Matrix>(vec4_f32, 4u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Matrix>(vec2_f32, 2u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Matrix>(vec2_f32, 3u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Matrix>(vec2_f32, 4u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Matrix>(vec3_f32, 2u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Matrix>(vec3_f32, 3u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Matrix>(vec3_f32, 4u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Matrix>(vec4_f32, 2u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Matrix>(vec4_f32, 3u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Matrix>(vec4_f32, 4u)));
 
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Matrix>(vec2_f16, 2u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Matrix>(vec2_f16, 3u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Matrix>(vec2_f16, 4u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Matrix>(vec3_f16, 2u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Matrix>(vec3_f16, 3u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Matrix>(vec3_f16, 4u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Matrix>(vec4_f16, 2u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Matrix>(vec4_f16, 3u)));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Matrix>(vec4_f16, 4u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Matrix>(vec2_f16, 2u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Matrix>(vec2_f16, 3u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Matrix>(vec2_f16, 4u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Matrix>(vec3_f16, 2u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Matrix>(vec3_f16, 3u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Matrix>(vec3_f16, 4u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Matrix>(vec4_f16, 2u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Matrix>(vec4_f16, 3u)));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Matrix>(vec4_f16, 4u)));
 }
 
 TEST_F(ResolverIsHostShareable, Pointer) {
-    auto* ptr = create<type::Pointer>(core::AddressSpace::kPrivate, create<type::I32>(),
-                                      core::Access::kReadWrite);
+    auto* ptr = create<core::type::Pointer>(core::AddressSpace::kPrivate, create<core::type::I32>(),
+                                            core::Access::kReadWrite);
     EXPECT_FALSE(r()->IsHostShareable(ptr));
 }
 
 TEST_F(ResolverIsHostShareable, Atomic) {
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Atomic>(create<type::I32>())));
-    EXPECT_TRUE(r()->IsHostShareable(create<type::Atomic>(create<type::U32>())));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Atomic>(create<core::type::I32>())));
+    EXPECT_TRUE(r()->IsHostShareable(create<core::type::Atomic>(create<core::type::U32>())));
 }
 
 TEST_F(ResolverIsHostShareable, ArraySizedOfHostShareable) {
-    auto* arr = create<type::Array>(create<type::I32>(), create<type::ConstantArrayCount>(5u), 4u,
-                                    20u, 4u, 4u);
+    auto* arr = create<core::type::Array>(
+        create<core::type::I32>(), create<core::type::ConstantArrayCount>(5u), 4u, 20u, 4u, 4u);
     EXPECT_TRUE(r()->IsHostShareable(arr));
 }
 
 TEST_F(ResolverIsHostShareable, ArrayUnsizedOfHostShareable) {
-    auto* arr =
-        create<type::Array>(create<type::I32>(), create<type::RuntimeArrayCount>(), 4u, 4u, 4u, 4u);
+    auto* arr = create<core::type::Array>(create<core::type::I32>(),
+                                          create<core::type::RuntimeArrayCount>(), 4u, 4u, 4u, 4u);
     EXPECT_TRUE(r()->IsHostShareable(arr));
 }
 
diff --git a/src/tint/lang/wgsl/resolver/is_storeable_test.cc b/src/tint/lang/wgsl/resolver/is_storeable_test.cc
index 30cf8b8..b040dce 100644
--- a/src/tint/lang/wgsl/resolver/is_storeable_test.cc
+++ b/src/tint/lang/wgsl/resolver/is_storeable_test.cc
@@ -26,79 +26,79 @@
 using ResolverIsStorableTest = ResolverTest;
 
 TEST_F(ResolverIsStorableTest, Void) {
-    EXPECT_FALSE(r()->IsStorable(create<type::Void>()));
+    EXPECT_FALSE(r()->IsStorable(create<core::type::Void>()));
 }
 
 TEST_F(ResolverIsStorableTest, Scalar) {
-    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>()));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Bool>()));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::I32>()));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::U32>()));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::F32>()));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::F16>()));
 }
 
 TEST_F(ResolverIsStorableTest, Vector) {
-    EXPECT_TRUE(r()->IsStorable(create<type::Vector>(create<type::I32>(), 2u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Vector>(create<type::I32>(), 3u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Vector>(create<type::I32>(), 4u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Vector>(create<type::U32>(), 2u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Vector>(create<type::U32>(), 3u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Vector>(create<type::U32>(), 4u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Vector>(create<type::F32>(), 2u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Vector>(create<type::F32>(), 3u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Vector>(create<type::F32>(), 4u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Vector>(create<type::F16>(), 2u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Vector>(create<type::F16>(), 3u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Vector>(create<type::F16>(), 4u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Vector>(create<core::type::I32>(), 2u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Vector>(create<core::type::I32>(), 3u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Vector>(create<core::type::I32>(), 4u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Vector>(create<core::type::U32>(), 2u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Vector>(create<core::type::U32>(), 3u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Vector>(create<core::type::U32>(), 4u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Vector>(create<core::type::F32>(), 2u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Vector>(create<core::type::F32>(), 3u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Vector>(create<core::type::F32>(), 4u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Vector>(create<core::type::F16>(), 2u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Vector>(create<core::type::F16>(), 3u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Vector>(create<core::type::F16>(), 4u)));
 }
 
 TEST_F(ResolverIsStorableTest, Matrix) {
-    auto* vec2_f32 = create<type::Vector>(create<type::F32>(), 2u);
-    auto* vec3_f32 = create<type::Vector>(create<type::F32>(), 3u);
-    auto* vec4_f32 = create<type::Vector>(create<type::F32>(), 4u);
-    auto* vec2_f16 = create<type::Vector>(create<type::F16>(), 2u);
-    auto* vec3_f16 = create<type::Vector>(create<type::F16>(), 3u);
-    auto* vec4_f16 = create<type::Vector>(create<type::F16>(), 4u);
-    EXPECT_TRUE(r()->IsStorable(create<type::Matrix>(vec2_f32, 2u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Matrix>(vec2_f32, 3u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Matrix>(vec2_f32, 4u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Matrix>(vec3_f32, 2u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Matrix>(vec3_f32, 3u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Matrix>(vec3_f32, 4u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Matrix>(vec4_f32, 2u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Matrix>(vec4_f32, 3u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Matrix>(vec4_f32, 4u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Matrix>(vec2_f16, 2u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Matrix>(vec2_f16, 3u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Matrix>(vec2_f16, 4u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Matrix>(vec3_f16, 2u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Matrix>(vec3_f16, 3u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Matrix>(vec3_f16, 4u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Matrix>(vec4_f16, 2u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Matrix>(vec4_f16, 3u)));
-    EXPECT_TRUE(r()->IsStorable(create<type::Matrix>(vec4_f16, 4u)));
+    auto* vec2_f32 = create<core::type::Vector>(create<core::type::F32>(), 2u);
+    auto* vec3_f32 = create<core::type::Vector>(create<core::type::F32>(), 3u);
+    auto* vec4_f32 = create<core::type::Vector>(create<core::type::F32>(), 4u);
+    auto* vec2_f16 = create<core::type::Vector>(create<core::type::F16>(), 2u);
+    auto* vec3_f16 = create<core::type::Vector>(create<core::type::F16>(), 3u);
+    auto* vec4_f16 = create<core::type::Vector>(create<core::type::F16>(), 4u);
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Matrix>(vec2_f32, 2u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Matrix>(vec2_f32, 3u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Matrix>(vec2_f32, 4u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Matrix>(vec3_f32, 2u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Matrix>(vec3_f32, 3u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Matrix>(vec3_f32, 4u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Matrix>(vec4_f32, 2u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Matrix>(vec4_f32, 3u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Matrix>(vec4_f32, 4u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Matrix>(vec2_f16, 2u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Matrix>(vec2_f16, 3u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Matrix>(vec2_f16, 4u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Matrix>(vec3_f16, 2u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Matrix>(vec3_f16, 3u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Matrix>(vec3_f16, 4u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Matrix>(vec4_f16, 2u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Matrix>(vec4_f16, 3u)));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Matrix>(vec4_f16, 4u)));
 }
 
 TEST_F(ResolverIsStorableTest, Pointer) {
-    auto* ptr = create<type::Pointer>(core::AddressSpace::kPrivate, create<type::I32>(),
-                                      core::Access::kReadWrite);
+    auto* ptr = create<core::type::Pointer>(core::AddressSpace::kPrivate, create<core::type::I32>(),
+                                            core::Access::kReadWrite);
     EXPECT_FALSE(r()->IsStorable(ptr));
 }
 
 TEST_F(ResolverIsStorableTest, Atomic) {
-    EXPECT_TRUE(r()->IsStorable(create<type::Atomic>(create<type::I32>())));
-    EXPECT_TRUE(r()->IsStorable(create<type::Atomic>(create<type::U32>())));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Atomic>(create<core::type::I32>())));
+    EXPECT_TRUE(r()->IsStorable(create<core::type::Atomic>(create<core::type::U32>())));
 }
 
 TEST_F(ResolverIsStorableTest, ArraySizedOfStorable) {
-    auto* arr = create<type::Array>(create<type::I32>(), create<type::ConstantArrayCount>(5u), 4u,
-                                    20u, 4u, 4u);
+    auto* arr = create<core::type::Array>(
+        create<core::type::I32>(), create<core::type::ConstantArrayCount>(5u), 4u, 20u, 4u, 4u);
     EXPECT_TRUE(r()->IsStorable(arr));
 }
 
 TEST_F(ResolverIsStorableTest, ArrayUnsizedOfStorable) {
-    auto* arr =
-        create<type::Array>(create<type::I32>(), create<type::RuntimeArrayCount>(), 4u, 4u, 4u, 4u);
+    auto* arr = create<core::type::Array>(create<core::type::I32>(),
+                                          create<core::type::RuntimeArrayCount>(), 4u, 4u, 4u, 4u);
     EXPECT_TRUE(r()->IsStorable(arr));
 }
 
diff --git a/src/tint/lang/wgsl/resolver/load_test.cc b/src/tint/lang/wgsl/resolver/load_test.cc
index 26cb8c8..9c5f5ab 100644
--- a/src/tint/lang/wgsl/resolver/load_test.cc
+++ b/src/tint/lang/wgsl/resolver/load_test.cc
@@ -38,9 +38,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* load = Sem().Get<sem::Load>(ident);
     ASSERT_NE(load, nullptr);
-    EXPECT_TRUE(load->Type()->Is<type::I32>());
-    EXPECT_TRUE(load->Reference()->Type()->Is<type::Reference>());
-    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<type::I32>());
+    EXPECT_TRUE(load->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(load->Reference()->Type()->Is<core::type::Reference>());
+    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<core::type::I32>());
 }
 
 TEST_F(ResolverLoadTest, LetInitializer) {
@@ -53,9 +53,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* load = Sem().Get<sem::Load>(ident);
     ASSERT_NE(load, nullptr);
-    EXPECT_TRUE(load->Type()->Is<type::I32>());
-    EXPECT_TRUE(load->Reference()->Type()->Is<type::Reference>());
-    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<type::I32>());
+    EXPECT_TRUE(load->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(load->Reference()->Type()->Is<core::type::Reference>());
+    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<core::type::I32>());
 }
 
 TEST_F(ResolverLoadTest, Assignment) {
@@ -70,9 +70,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* load = Sem().Get<sem::Load>(ident);
     ASSERT_NE(load, nullptr);
-    EXPECT_TRUE(load->Type()->Is<type::I32>());
-    EXPECT_TRUE(load->Reference()->Type()->Is<type::Reference>());
-    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<type::I32>());
+    EXPECT_TRUE(load->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(load->Reference()->Type()->Is<core::type::Reference>());
+    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<core::type::I32>());
 }
 
 TEST_F(ResolverLoadTest, CompoundAssignment) {
@@ -87,9 +87,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* load = Sem().Get<sem::Load>(ident);
     ASSERT_NE(load, nullptr);
-    EXPECT_TRUE(load->Type()->Is<type::I32>());
-    EXPECT_TRUE(load->Reference()->Type()->Is<type::Reference>());
-    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<type::I32>());
+    EXPECT_TRUE(load->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(load->Reference()->Type()->Is<core::type::Reference>());
+    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<core::type::I32>());
 }
 
 TEST_F(ResolverLoadTest, UnaryOp) {
@@ -102,9 +102,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* load = Sem().Get<sem::Load>(ident);
     ASSERT_NE(load, nullptr);
-    EXPECT_TRUE(load->Type()->Is<type::I32>());
-    EXPECT_TRUE(load->Reference()->Type()->Is<type::Reference>());
-    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<type::I32>());
+    EXPECT_TRUE(load->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(load->Reference()->Type()->Is<core::type::Reference>());
+    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<core::type::I32>());
 }
 
 TEST_F(ResolverLoadTest, UnaryOp_NoLoad) {
@@ -117,8 +117,8 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* var_user = Sem().Get<sem::VariableUser>(ident);
     ASSERT_NE(var_user, nullptr);
-    EXPECT_TRUE(var_user->Type()->Is<type::Reference>());
-    EXPECT_TRUE(var_user->Type()->UnwrapRef()->Is<type::I32>());
+    EXPECT_TRUE(var_user->Type()->Is<core::type::Reference>());
+    EXPECT_TRUE(var_user->Type()->UnwrapRef()->Is<core::type::I32>());
 }
 
 TEST_F(ResolverLoadTest, BinaryOp) {
@@ -131,9 +131,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* load = Sem().Get<sem::Load>(ident);
     ASSERT_NE(load, nullptr);
-    EXPECT_TRUE(load->Type()->Is<type::I32>());
-    EXPECT_TRUE(load->Reference()->Type()->Is<type::Reference>());
-    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<type::I32>());
+    EXPECT_TRUE(load->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(load->Reference()->Type()->Is<core::type::Reference>());
+    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<core::type::I32>());
 }
 
 TEST_F(ResolverLoadTest, Index) {
@@ -146,9 +146,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* load = Sem().Get<sem::Load>(ident);
     ASSERT_NE(load, nullptr);
-    EXPECT_TRUE(load->Type()->Is<type::I32>());
-    EXPECT_TRUE(load->Reference()->Type()->Is<type::Reference>());
-    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<type::I32>());
+    EXPECT_TRUE(load->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(load->Reference()->Type()->Is<core::type::Reference>());
+    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<core::type::I32>());
 }
 
 TEST_F(ResolverLoadTest, MultiComponentSwizzle) {
@@ -161,9 +161,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* load = Sem().Get<sem::Load>(ident);
     ASSERT_NE(load, nullptr);
-    EXPECT_TRUE(load->Type()->Is<type::Vector>());
-    EXPECT_TRUE(load->Reference()->Type()->Is<type::Reference>());
-    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<type::Vector>());
+    EXPECT_TRUE(load->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(load->Reference()->Type()->Is<core::type::Reference>());
+    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<core::type::Vector>());
 }
 
 TEST_F(ResolverLoadTest, Bitcast) {
@@ -176,9 +176,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* load = Sem().Get<sem::Load>(ident);
     ASSERT_NE(load, nullptr);
-    EXPECT_TRUE(load->Type()->Is<type::F32>());
-    EXPECT_TRUE(load->Reference()->Type()->Is<type::Reference>());
-    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<type::F32>());
+    EXPECT_TRUE(load->Type()->Is<core::type::F32>());
+    EXPECT_TRUE(load->Reference()->Type()->Is<core::type::Reference>());
+    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<core::type::F32>());
 }
 
 TEST_F(ResolverLoadTest, BuiltinArg) {
@@ -191,9 +191,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* load = Sem().Get<sem::Load>(ident);
     ASSERT_NE(load, nullptr);
-    EXPECT_TRUE(load->Type()->Is<type::F32>());
-    EXPECT_TRUE(load->Reference()->Type()->Is<type::Reference>());
-    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<type::F32>());
+    EXPECT_TRUE(load->Type()->Is<core::type::F32>());
+    EXPECT_TRUE(load->Reference()->Type()->Is<core::type::Reference>());
+    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<core::type::F32>());
 }
 
 TEST_F(ResolverLoadTest, FunctionArg) {
@@ -208,9 +208,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* load = Sem().Get<sem::Load>(ident);
     ASSERT_NE(load, nullptr);
-    EXPECT_TRUE(load->Type()->Is<type::F32>());
-    EXPECT_TRUE(load->Reference()->Type()->Is<type::Reference>());
-    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<type::F32>());
+    EXPECT_TRUE(load->Type()->Is<core::type::F32>());
+    EXPECT_TRUE(load->Reference()->Type()->Is<core::type::Reference>());
+    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<core::type::F32>());
 }
 
 TEST_F(ResolverLoadTest, FunctionArg_Handles) {
@@ -220,13 +220,13 @@
     //   return textureSampleLevel(tp, sp, vec2(), 0);
     // }
     // f(t, s);
-    GlobalVar("t", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()),
+    GlobalVar("t", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()),
               Vector{Group(0_a), Binding(0_a)});
-    GlobalVar("s", ty.sampler(type::SamplerKind::kSampler), Vector{Group(0_a), Binding(1_a)});
+    GlobalVar("s", ty.sampler(core::type::SamplerKind::kSampler), Vector{Group(0_a), Binding(1_a)});
     Func("f",
          Vector{
-             Param("tp", ty.sampled_texture(type::TextureDimension::k2d, ty.f32())),
-             Param("sp", ty.sampler(type::SamplerKind::kSampler)),
+             Param("tp", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32())),
+             Param("sp", ty.sampler(core::type::SamplerKind::kSampler)),
          },
          ty.vec4<f32>(),
          Vector{
@@ -241,16 +241,16 @@
     {
         auto* load = Sem().Get<sem::Load>(t_ident);
         ASSERT_NE(load, nullptr);
-        EXPECT_TRUE(load->Type()->Is<type::SampledTexture>());
-        EXPECT_TRUE(load->Reference()->Type()->Is<type::Reference>());
-        EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<type::SampledTexture>());
+        EXPECT_TRUE(load->Type()->Is<core::type::SampledTexture>());
+        EXPECT_TRUE(load->Reference()->Type()->Is<core::type::Reference>());
+        EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<core::type::SampledTexture>());
     }
     {
         auto* load = Sem().Get<sem::Load>(s_ident);
         ASSERT_NE(load, nullptr);
-        EXPECT_TRUE(load->Type()->Is<type::Sampler>());
-        EXPECT_TRUE(load->Reference()->Type()->Is<type::Reference>());
-        EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<type::Sampler>());
+        EXPECT_TRUE(load->Type()->Is<core::type::Sampler>());
+        EXPECT_TRUE(load->Reference()->Type()->Is<core::type::Reference>());
+        EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<core::type::Sampler>());
     }
 }
 
@@ -267,9 +267,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* load = Sem().Get<sem::Load>(ident);
     ASSERT_NE(load, nullptr);
-    EXPECT_TRUE(load->Type()->Is<type::F32>());
-    EXPECT_TRUE(load->Reference()->Type()->Is<type::Reference>());
-    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<type::F32>());
+    EXPECT_TRUE(load->Type()->Is<core::type::F32>());
+    EXPECT_TRUE(load->Reference()->Type()->Is<core::type::Reference>());
+    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<core::type::F32>());
 }
 
 TEST_F(ResolverLoadTest, IfCond) {
@@ -282,9 +282,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* load = Sem().Get<sem::Load>(ident);
     ASSERT_NE(load, nullptr);
-    EXPECT_TRUE(load->Type()->Is<type::Bool>());
-    EXPECT_TRUE(load->Reference()->Type()->Is<type::Reference>());
-    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<type::Bool>());
+    EXPECT_TRUE(load->Type()->Is<core::type::Bool>());
+    EXPECT_TRUE(load->Reference()->Type()->Is<core::type::Reference>());
+    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<core::type::Bool>());
 }
 
 TEST_F(ResolverLoadTest, Switch) {
@@ -299,9 +299,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* load = Sem().Get<sem::Load>(ident);
     ASSERT_NE(load, nullptr);
-    EXPECT_TRUE(load->Type()->Is<type::I32>());
-    EXPECT_TRUE(load->Reference()->Type()->Is<type::Reference>());
-    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<type::I32>());
+    EXPECT_TRUE(load->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(load->Reference()->Type()->Is<core::type::Reference>());
+    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<core::type::I32>());
 }
 
 TEST_F(ResolverLoadTest, BreakIfCond) {
@@ -318,9 +318,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* load = Sem().Get<sem::Load>(ident);
     ASSERT_NE(load, nullptr);
-    EXPECT_TRUE(load->Type()->Is<type::Bool>());
-    EXPECT_TRUE(load->Reference()->Type()->Is<type::Reference>());
-    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<type::Bool>());
+    EXPECT_TRUE(load->Type()->Is<core::type::Bool>());
+    EXPECT_TRUE(load->Reference()->Type()->Is<core::type::Reference>());
+    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<core::type::Bool>());
 }
 
 TEST_F(ResolverLoadTest, ForCond) {
@@ -333,9 +333,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* load = Sem().Get<sem::Load>(ident);
     ASSERT_NE(load, nullptr);
-    EXPECT_TRUE(load->Type()->Is<type::Bool>());
-    EXPECT_TRUE(load->Reference()->Type()->Is<type::Reference>());
-    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<type::Bool>());
+    EXPECT_TRUE(load->Type()->Is<core::type::Bool>());
+    EXPECT_TRUE(load->Reference()->Type()->Is<core::type::Reference>());
+    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<core::type::Bool>());
 }
 
 TEST_F(ResolverLoadTest, WhileCond) {
@@ -348,9 +348,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* load = Sem().Get<sem::Load>(ident);
     ASSERT_NE(load, nullptr);
-    EXPECT_TRUE(load->Type()->Is<type::Bool>());
-    EXPECT_TRUE(load->Reference()->Type()->Is<type::Reference>());
-    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<type::Bool>());
+    EXPECT_TRUE(load->Type()->Is<core::type::Bool>());
+    EXPECT_TRUE(load->Reference()->Type()->Is<core::type::Reference>());
+    EXPECT_TRUE(load->Reference()->Type()->UnwrapRef()->Is<core::type::Bool>());
 }
 
 TEST_F(ResolverLoadTest, AddressOf) {
@@ -363,7 +363,7 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* no_load = Sem().GetVal(ident);
     ASSERT_NE(no_load, nullptr);
-    EXPECT_TRUE(no_load->Type()->Is<type::Reference>());  // No load
+    EXPECT_TRUE(no_load->Type()->Is<core::type::Reference>());  // No load
 }
 
 }  // namespace
diff --git a/src/tint/lang/wgsl/resolver/materialize_test.cc b/src/tint/lang/wgsl/resolver/materialize_test.cc
index 28fc798..c56245b 100644
--- a/src/tint/lang/wgsl/resolver/materialize_test.cc
+++ b/src/tint/lang/wgsl/resolver/materialize_test.cc
@@ -77,7 +77,7 @@
 class MaterializeTest : public resolver::ResolverTestWithParam<CASE> {
   protected:
     void CheckTypesAndValues(const sem::ValueExpression* expr,
-                             const tint::type::Type* expected_sem_ty,
+                             const tint::core::type::Type* expected_sem_ty,
                              const std::variant<AInt, AFloat>& expected_value) {
         std::visit([&](auto v) { CheckTypesAndValuesImpl(expr, expected_sem_ty, v); },
                    expected_value);
@@ -86,7 +86,7 @@
   private:
     template <typename T>
     void CheckTypesAndValuesImpl(const sem::ValueExpression* expr,
-                                 const tint::type::Type* expected_sem_ty,
+                                 const tint::core::type::Type* expected_sem_ty,
                                  T expected_value) {
         EXPECT_TYPE(expr->Type(), expected_sem_ty);
 
@@ -96,7 +96,7 @@
 
         tint::Switch(
             expected_sem_ty,  //
-            [&](const type::Vector* v) {
+            [&](const core::type::Vector* v) {
                 for (uint32_t i = 0; i < v->Width(); i++) {
                     auto* el = value->Index(i);
                     ASSERT_NE(el, nullptr);
@@ -104,7 +104,7 @@
                     EXPECT_EQ(el->ValueAs<T>(), expected_value);
                 }
             },
-            [&](const type::Matrix* m) {
+            [&](const core::type::Matrix* m) {
                 for (uint32_t c = 0; c < m->columns(); c++) {
                     auto* column = value->Index(c);
                     ASSERT_NE(column, nullptr);
@@ -117,7 +117,7 @@
                     }
                 }
             },
-            [&](const type::Array* a) {
+            [&](const core::type::Array* a) {
                 auto count = a->ConstantCount();
                 ASSERT_NE(count, 0u);
                 for (uint32_t i = 0; i < count; i++) {
@@ -1266,12 +1266,12 @@
     auto* sem = Sem().Get(call);
     ASSERT_TRUE(sem->Is<sem::Materialize>());
     auto* materialize = sem->As<sem::Materialize>();
-    ASSERT_TRUE(materialize->Type()->Is<type::Struct>());
-    auto* concrete_str = materialize->Type()->As<type::Struct>();
-    ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<type::F32>());
-    ASSERT_TRUE(materialize->Expr()->Type()->Is<type::Struct>());
-    auto* abstract_str = materialize->Expr()->Type()->As<type::Struct>();
-    ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<type::AbstractFloat>());
+    ASSERT_TRUE(materialize->Type()->Is<core::type::Struct>());
+    auto* concrete_str = materialize->Type()->As<core::type::Struct>();
+    ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<core::type::F32>());
+    ASSERT_TRUE(materialize->Expr()->Type()->Is<core::type::Struct>());
+    auto* abstract_str = materialize->Expr()->Type()->As<core::type::Struct>();
+    ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<core::type::AbstractFloat>());
 }
 
 TEST_F(MaterializeAbstractStructure, Modf_Vector_DefaultType) {
@@ -1282,15 +1282,22 @@
     auto* sem = Sem().Get(call);
     ASSERT_TRUE(sem->Is<sem::Materialize>());
     auto* materialize = sem->As<sem::Materialize>();
-    ASSERT_TRUE(materialize->Type()->Is<type::Struct>());
-    auto* concrete_str = materialize->Type()->As<type::Struct>();
-    ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<type::Vector>());
-    ASSERT_TRUE(concrete_str->Members()[0]->Type()->As<type::Vector>()->type()->Is<type::F32>());
-    ASSERT_TRUE(materialize->Expr()->Type()->Is<type::Struct>());
-    auto* abstract_str = materialize->Expr()->Type()->As<type::Struct>();
-    ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<type::Vector>());
-    ASSERT_TRUE(
-        abstract_str->Members()[0]->Type()->As<type::Vector>()->type()->Is<type::AbstractFloat>());
+    ASSERT_TRUE(materialize->Type()->Is<core::type::Struct>());
+    auto* concrete_str = materialize->Type()->As<core::type::Struct>();
+    ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<core::type::Vector>());
+    ASSERT_TRUE(concrete_str->Members()[0]
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::F32>());
+    ASSERT_TRUE(materialize->Expr()->Type()->Is<core::type::Struct>());
+    auto* abstract_str = materialize->Expr()->Type()->As<core::type::Struct>();
+    ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<core::type::Vector>());
+    ASSERT_TRUE(abstract_str->Members()[0]
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::AbstractFloat>());
 }
 
 TEST_F(MaterializeAbstractStructure, Modf_Scalar_ExplicitType) {
@@ -1304,12 +1311,12 @@
     auto* sem = Sem().Get(call);
     ASSERT_TRUE(sem->Is<sem::Materialize>());
     auto* materialize = sem->As<sem::Materialize>();
-    ASSERT_TRUE(materialize->Type()->Is<type::Struct>());
-    auto* concrete_str = materialize->Type()->As<type::Struct>();
-    ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<type::F16>());
-    ASSERT_TRUE(materialize->Expr()->Type()->Is<type::Struct>());
-    auto* abstract_str = materialize->Expr()->Type()->As<type::Struct>();
-    ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<type::AbstractFloat>());
+    ASSERT_TRUE(materialize->Type()->Is<core::type::Struct>());
+    auto* concrete_str = materialize->Type()->As<core::type::Struct>();
+    ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<core::type::F16>());
+    ASSERT_TRUE(materialize->Expr()->Type()->Is<core::type::Struct>());
+    auto* abstract_str = materialize->Expr()->Type()->As<core::type::Struct>();
+    ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<core::type::AbstractFloat>());
 }
 
 TEST_F(MaterializeAbstractStructure, Modf_Vector_ExplicitType) {
@@ -1322,15 +1329,22 @@
     auto* sem = Sem().Get(call);
     ASSERT_TRUE(sem->Is<sem::Materialize>());
     auto* materialize = sem->As<sem::Materialize>();
-    ASSERT_TRUE(materialize->Type()->Is<type::Struct>());
-    auto* concrete_str = materialize->Type()->As<type::Struct>();
-    ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<type::Vector>());
-    ASSERT_TRUE(concrete_str->Members()[0]->Type()->As<type::Vector>()->type()->Is<type::F16>());
-    ASSERT_TRUE(materialize->Expr()->Type()->Is<type::Struct>());
-    auto* abstract_str = materialize->Expr()->Type()->As<type::Struct>();
-    ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<type::Vector>());
-    ASSERT_TRUE(
-        abstract_str->Members()[0]->Type()->As<type::Vector>()->type()->Is<type::AbstractFloat>());
+    ASSERT_TRUE(materialize->Type()->Is<core::type::Struct>());
+    auto* concrete_str = materialize->Type()->As<core::type::Struct>();
+    ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<core::type::Vector>());
+    ASSERT_TRUE(concrete_str->Members()[0]
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::F16>());
+    ASSERT_TRUE(materialize->Expr()->Type()->Is<core::type::Struct>());
+    auto* abstract_str = materialize->Expr()->Type()->As<core::type::Struct>();
+    ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<core::type::Vector>());
+    ASSERT_TRUE(abstract_str->Members()[0]
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::AbstractFloat>());
 }
 
 TEST_F(MaterializeAbstractStructure, Frexp_Scalar_DefaultType) {
@@ -1341,14 +1355,14 @@
     auto* sem = Sem().Get(call);
     ASSERT_TRUE(sem->Is<sem::Materialize>());
     auto* materialize = sem->As<sem::Materialize>();
-    ASSERT_TRUE(materialize->Type()->Is<type::Struct>());
-    auto* concrete_str = materialize->Type()->As<type::Struct>();
-    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<type::Struct>());
-    auto* abstract_str = materialize->Expr()->Type()->As<type::Struct>();
-    ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<type::AbstractFloat>());
-    ASSERT_TRUE(abstract_str->Members()[1]->Type()->Is<type::AbstractInt>());
+    ASSERT_TRUE(materialize->Type()->Is<core::type::Struct>());
+    auto* concrete_str = materialize->Type()->As<core::type::Struct>();
+    ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<core::type::F32>());
+    ASSERT_TRUE(concrete_str->Members()[1]->Type()->Is<core::type::I32>());
+    ASSERT_TRUE(materialize->Expr()->Type()->Is<core::type::Struct>());
+    auto* abstract_str = materialize->Expr()->Type()->As<core::type::Struct>();
+    ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<core::type::AbstractFloat>());
+    ASSERT_TRUE(abstract_str->Members()[1]->Type()->Is<core::type::AbstractInt>());
 }
 
 TEST_F(MaterializeAbstractStructure, Frexp_Vector_DefaultType) {
@@ -1359,19 +1373,33 @@
     auto* sem = Sem().Get(call);
     ASSERT_TRUE(sem->Is<sem::Materialize>());
     auto* materialize = sem->As<sem::Materialize>();
-    ASSERT_TRUE(materialize->Type()->Is<type::Struct>());
-    auto* concrete_str = materialize->Type()->As<type::Struct>();
-    ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<type::Vector>());
-    ASSERT_TRUE(concrete_str->Members()[1]->Type()->Is<type::Vector>());
-    ASSERT_TRUE(concrete_str->Members()[0]->Type()->As<type::Vector>()->type()->Is<type::F32>());
-    ASSERT_TRUE(concrete_str->Members()[1]->Type()->As<type::Vector>()->type()->Is<type::I32>());
-    ASSERT_TRUE(materialize->Expr()->Type()->Is<type::Struct>());
-    auto* abstract_str = materialize->Expr()->Type()->As<type::Struct>();
-    ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<type::Vector>());
-    ASSERT_TRUE(
-        abstract_str->Members()[0]->Type()->As<type::Vector>()->type()->Is<type::AbstractFloat>());
-    ASSERT_TRUE(
-        abstract_str->Members()[1]->Type()->As<type::Vector>()->type()->Is<type::AbstractInt>());
+    ASSERT_TRUE(materialize->Type()->Is<core::type::Struct>());
+    auto* concrete_str = materialize->Type()->As<core::type::Struct>();
+    ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<core::type::Vector>());
+    ASSERT_TRUE(concrete_str->Members()[1]->Type()->Is<core::type::Vector>());
+    ASSERT_TRUE(concrete_str->Members()[0]
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::F32>());
+    ASSERT_TRUE(concrete_str->Members()[1]
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::I32>());
+    ASSERT_TRUE(materialize->Expr()->Type()->Is<core::type::Struct>());
+    auto* abstract_str = materialize->Expr()->Type()->As<core::type::Struct>();
+    ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<core::type::Vector>());
+    ASSERT_TRUE(abstract_str->Members()[0]
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::AbstractFloat>());
+    ASSERT_TRUE(abstract_str->Members()[1]
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::AbstractInt>());
 }
 
 TEST_F(MaterializeAbstractStructure, Frexp_Scalar_ExplicitType) {
@@ -1385,14 +1413,14 @@
     auto* sem = Sem().Get(call);
     ASSERT_TRUE(sem->Is<sem::Materialize>());
     auto* materialize = sem->As<sem::Materialize>();
-    ASSERT_TRUE(materialize->Type()->Is<type::Struct>());
-    auto* concrete_str = materialize->Type()->As<type::Struct>();
-    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<type::Struct>());
-    auto* abstract_str = materialize->Expr()->Type()->As<type::Struct>();
-    ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<type::AbstractFloat>());
-    ASSERT_TRUE(abstract_str->Members()[1]->Type()->Is<type::AbstractInt>());
+    ASSERT_TRUE(materialize->Type()->Is<core::type::Struct>());
+    auto* concrete_str = materialize->Type()->As<core::type::Struct>();
+    ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<core::type::F16>());
+    ASSERT_TRUE(concrete_str->Members()[1]->Type()->Is<core::type::I32>());
+    ASSERT_TRUE(materialize->Expr()->Type()->Is<core::type::Struct>());
+    auto* abstract_str = materialize->Expr()->Type()->As<core::type::Struct>();
+    ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<core::type::AbstractFloat>());
+    ASSERT_TRUE(abstract_str->Members()[1]->Type()->Is<core::type::AbstractInt>());
 }
 
 TEST_F(MaterializeAbstractStructure, Frexp_Vector_ExplicitType) {
@@ -1405,19 +1433,33 @@
     auto* sem = Sem().Get(call);
     ASSERT_TRUE(sem->Is<sem::Materialize>());
     auto* materialize = sem->As<sem::Materialize>();
-    ASSERT_TRUE(materialize->Type()->Is<type::Struct>());
-    auto* concrete_str = materialize->Type()->As<type::Struct>();
-    ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<type::Vector>());
-    ASSERT_TRUE(concrete_str->Members()[1]->Type()->Is<type::Vector>());
-    ASSERT_TRUE(concrete_str->Members()[0]->Type()->As<type::Vector>()->type()->Is<type::F16>());
-    ASSERT_TRUE(concrete_str->Members()[1]->Type()->As<type::Vector>()->type()->Is<type::I32>());
-    ASSERT_TRUE(materialize->Expr()->Type()->Is<type::Struct>());
-    auto* abstract_str = materialize->Expr()->Type()->As<type::Struct>();
-    ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<type::Vector>());
-    ASSERT_TRUE(
-        abstract_str->Members()[0]->Type()->As<type::Vector>()->type()->Is<type::AbstractFloat>());
-    ASSERT_TRUE(
-        abstract_str->Members()[1]->Type()->As<type::Vector>()->type()->Is<type::AbstractInt>());
+    ASSERT_TRUE(materialize->Type()->Is<core::type::Struct>());
+    auto* concrete_str = materialize->Type()->As<core::type::Struct>();
+    ASSERT_TRUE(concrete_str->Members()[0]->Type()->Is<core::type::Vector>());
+    ASSERT_TRUE(concrete_str->Members()[1]->Type()->Is<core::type::Vector>());
+    ASSERT_TRUE(concrete_str->Members()[0]
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::F16>());
+    ASSERT_TRUE(concrete_str->Members()[1]
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::I32>());
+    ASSERT_TRUE(materialize->Expr()->Type()->Is<core::type::Struct>());
+    auto* abstract_str = materialize->Expr()->Type()->As<core::type::Struct>();
+    ASSERT_TRUE(abstract_str->Members()[0]->Type()->Is<core::type::Vector>());
+    ASSERT_TRUE(abstract_str->Members()[0]
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::AbstractFloat>());
+    ASSERT_TRUE(abstract_str->Members()[1]
+                    ->Type()
+                    ->As<core::type::Vector>()
+                    ->type()
+                    ->Is<core::type::AbstractInt>());
 }
 
 }  // namespace materialize_abstract_structure
diff --git a/src/tint/lang/wgsl/resolver/ptr_ref_test.cc b/src/tint/lang/wgsl/resolver/ptr_ref_test.cc
index 3257029..e22f9b9 100644
--- a/src/tint/lang/wgsl/resolver/ptr_ref_test.cc
+++ b/src/tint/lang/wgsl/resolver/ptr_ref_test.cc
@@ -37,9 +37,10 @@
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(expr)->Is<type::Pointer>());
-    EXPECT_TRUE(TypeOf(expr)->As<type::Pointer>()->StoreType()->Is<type::I32>());
-    EXPECT_EQ(TypeOf(expr)->As<type::Pointer>()->AddressSpace(), core::AddressSpace::kFunction);
+    ASSERT_TRUE(TypeOf(expr)->Is<core::type::Pointer>());
+    EXPECT_TRUE(TypeOf(expr)->As<core::type::Pointer>()->StoreType()->Is<core::type::I32>());
+    EXPECT_EQ(TypeOf(expr)->As<core::type::Pointer>()->AddressSpace(),
+              core::AddressSpace::kFunction);
 }
 
 TEST_F(ResolverPtrRefTest, AddressOfThenDeref) {
@@ -59,8 +60,8 @@
     auto* ref = load->Reference();
     ASSERT_NE(ref, nullptr);
 
-    ASSERT_TRUE(ref->Type()->Is<type::Reference>());
-    EXPECT_TRUE(ref->Type()->As<type::Reference>()->StoreType()->Is<type::I32>());
+    ASSERT_TRUE(ref->Type()->Is<core::type::Reference>());
+    EXPECT_TRUE(ref->Type()->As<core::type::Reference>()->StoreType()->Is<core::type::I32>());
 }
 
 TEST_F(ResolverPtrRefTest, DefaultPtrAddressSpace) {
@@ -90,22 +91,22 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(function_ptr)->Is<type::Pointer>())
+    ASSERT_TRUE(TypeOf(function_ptr)->Is<core::type::Pointer>())
         << "function_ptr is " << TypeOf(function_ptr)->TypeInfo().name;
-    ASSERT_TRUE(TypeOf(private_ptr)->Is<type::Pointer>())
+    ASSERT_TRUE(TypeOf(private_ptr)->Is<core::type::Pointer>())
         << "private_ptr is " << TypeOf(private_ptr)->TypeInfo().name;
-    ASSERT_TRUE(TypeOf(workgroup_ptr)->Is<type::Pointer>())
+    ASSERT_TRUE(TypeOf(workgroup_ptr)->Is<core::type::Pointer>())
         << "workgroup_ptr is " << TypeOf(workgroup_ptr)->TypeInfo().name;
-    ASSERT_TRUE(TypeOf(uniform_ptr)->Is<type::Pointer>())
+    ASSERT_TRUE(TypeOf(uniform_ptr)->Is<core::type::Pointer>())
         << "uniform_ptr is " << TypeOf(uniform_ptr)->TypeInfo().name;
-    ASSERT_TRUE(TypeOf(storage_ptr)->Is<type::Pointer>())
+    ASSERT_TRUE(TypeOf(storage_ptr)->Is<core::type::Pointer>())
         << "storage_ptr is " << TypeOf(storage_ptr)->TypeInfo().name;
 
-    EXPECT_EQ(TypeOf(function_ptr)->As<type::Pointer>()->Access(), core::Access::kReadWrite);
-    EXPECT_EQ(TypeOf(private_ptr)->As<type::Pointer>()->Access(), core::Access::kReadWrite);
-    EXPECT_EQ(TypeOf(workgroup_ptr)->As<type::Pointer>()->Access(), core::Access::kReadWrite);
-    EXPECT_EQ(TypeOf(uniform_ptr)->As<type::Pointer>()->Access(), core::Access::kRead);
-    EXPECT_EQ(TypeOf(storage_ptr)->As<type::Pointer>()->Access(), core::Access::kRead);
+    EXPECT_EQ(TypeOf(function_ptr)->As<core::type::Pointer>()->Access(), core::Access::kReadWrite);
+    EXPECT_EQ(TypeOf(private_ptr)->As<core::type::Pointer>()->Access(), core::Access::kReadWrite);
+    EXPECT_EQ(TypeOf(workgroup_ptr)->As<core::type::Pointer>()->Access(), core::Access::kReadWrite);
+    EXPECT_EQ(TypeOf(uniform_ptr)->As<core::type::Pointer>()->Access(), core::Access::kRead);
+    EXPECT_EQ(TypeOf(storage_ptr)->As<core::type::Pointer>()->Access(), core::Access::kRead);
 }
 
 }  // namespace
diff --git a/src/tint/lang/wgsl/resolver/ptr_ref_validation_test.cc b/src/tint/lang/wgsl/resolver/ptr_ref_validation_test.cc
index f806252..d4ddb72 100644
--- a/src/tint/lang/wgsl/resolver/ptr_ref_validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/ptr_ref_validation_test.cc
@@ -55,7 +55,7 @@
 TEST_F(ResolverPtrRefValidationTest, AddressOfHandle) {
     // @group(0) @binding(0) var t: texture_3d<f32>;
     // &t
-    GlobalVar("t", ty.sampled_texture(type::TextureDimension::k3d, ty.f32()), Group(0_a),
+    GlobalVar("t", ty.sampled_texture(core::type::TextureDimension::k3d, ty.f32()), Group(0_a),
               Binding(0_a));
     auto* expr = AddressOf(Expr(Source{{12, 34}}, "t"));
     WrapInFunction(expr);
@@ -95,7 +95,7 @@
 TEST_F(ResolverPtrRefValidationTest, IndirectOfAddressOfHandle) {
     // @group(0) @binding(0) var t: texture_3d<f32>;
     // *&t
-    GlobalVar("t", ty.sampled_texture(type::TextureDimension::k3d, ty.f32()), Group(0_a),
+    GlobalVar("t", ty.sampled_texture(core::type::TextureDimension::k3d, ty.f32()), Group(0_a),
               Binding(0_a));
     auto* expr = Deref(AddressOf(Expr(Source{{12, 34}}, "t")));
     WrapInFunction(expr);
diff --git a/src/tint/lang/wgsl/resolver/resolver.cc b/src/tint/lang/wgsl/resolver/resolver.cc
index c231fcc..45e1d94 100644
--- a/src/tint/lang/wgsl/resolver/resolver.cc
+++ b/src/tint/lang/wgsl/resolver/resolver.cc
@@ -245,7 +245,7 @@
 }
 
 sem::Variable* Resolver::Let(const ast::Let* v, bool is_global) {
-    const type::Type* ty = nullptr;
+    const core::type::Type* ty = nullptr;
 
     // If the variable has a declared type, resolve it.
     if (v->type) {
@@ -288,8 +288,8 @@
         return nullptr;
     }
 
-    if (!ApplyAddressSpaceUsageToType(core::AddressSpace::kUndefined, const_cast<type::Type*>(ty),
-                                      v->source)) {
+    if (!ApplyAddressSpaceUsageToType(core::AddressSpace::kUndefined,
+                                      const_cast<core::type::Type*>(ty), v->source)) {
         AddNote("while instantiating 'let' " + v->name->symbol.Name(), v->source);
         return nullptr;
     }
@@ -313,7 +313,7 @@
 }
 
 sem::Variable* Resolver::Override(const ast::Override* v) {
-    const type::Type* ty = nullptr;
+    const core::type::Type* ty = nullptr;
 
     // If the variable has a declared type, resolve it.
     if (v->type) {
@@ -351,8 +351,8 @@
         return nullptr;
     }
 
-    if (!ApplyAddressSpaceUsageToType(core::AddressSpace::kUndefined, const_cast<type::Type*>(ty),
-                                      v->source)) {
+    if (!ApplyAddressSpaceUsageToType(core::AddressSpace::kUndefined,
+                                      const_cast<core::type::Type*>(ty), v->source)) {
         AddNote("while instantiating 'override' " + v->name->symbol.Name(), v->source);
         return nullptr;
     }
@@ -375,7 +375,7 @@
                 if (!materialized) {
                     return false;
                 }
-                if (!materialized->Type()->IsAnyOf<type::I32, type::U32>()) {
+                if (!materialized->Type()->IsAnyOf<core::type::I32, core::type::U32>()) {
                     AddError("@id must be an i32 or u32 value", attr->source);
                     return false;
                 }
@@ -415,7 +415,7 @@
 }
 
 sem::Variable* Resolver::Const(const ast::Const* c, bool is_global) {
-    const type::Type* ty = nullptr;
+    const core::type::Type* ty = nullptr;
 
     // If the variable has a declared type, resolve it.
     if (c->type) {
@@ -470,8 +470,8 @@
         return nullptr;
     }
 
-    if (!ApplyAddressSpaceUsageToType(core::AddressSpace::kUndefined, const_cast<type::Type*>(ty),
-                                      c->source)) {
+    if (!ApplyAddressSpaceUsageToType(core::AddressSpace::kUndefined,
+                                      const_cast<core::type::Type*>(ty), c->source)) {
         AddNote("while instantiating 'const' " + c->name->symbol.Name(), c->source);
         return nullptr;
     }
@@ -491,7 +491,7 @@
 }
 
 sem::Variable* Resolver::Var(const ast::Var* var, bool is_global) {
-    const type::Type* storage_ty = nullptr;
+    const core::type::Type* storage_ty = nullptr;
 
     // If the variable has a declared type, resolve it.
     if (auto ty = var->type) {
@@ -568,7 +568,7 @@
         return nullptr;
     }
 
-    auto* var_ty = builder_->create<type::Reference>(address_space, storage_ty, access);
+    auto* var_ty = builder_->create<core::type::Reference>(address_space, storage_ty, access);
 
     if (!ApplyAddressSpaceUsageToType(address_space, var_ty,
                                       var->type ? var->type->source : var->source)) {
@@ -782,7 +782,7 @@
         return nullptr;
     }
 
-    type::Type* ty = Type(param->type);
+    core::type::Type* ty = Type(param->type);
     if (!ty) {
         return nullptr;
     }
@@ -792,11 +792,12 @@
         return nullptr;
     }
 
-    if (auto* ptr = ty->As<type::Pointer>()) {
+    if (auto* ptr = ty->As<core::type::Pointer>()) {
         // For MSL, we push module-scope variables into the entry point as pointer
         // parameters, so we also need to handle their store type.
-        if (!ApplyAddressSpaceUsageToType(
-                ptr->AddressSpace(), const_cast<type::Type*>(ptr->StoreType()), param->source)) {
+        if (!ApplyAddressSpaceUsageToType(ptr->AddressSpace(),
+                                          const_cast<core::type::Type*>(ptr->StoreType()),
+                                          param->source)) {
             add_note();
             return nullptr;
         }
@@ -920,7 +921,7 @@
     for (auto* var : transitively_referenced_overrides) {
         builder_->Sem().AddTransitivelyReferencedOverride(sem, var);
     }
-    if (auto* arr = sem->Type()->UnwrapRef()->As<type::Array>()) {
+    if (auto* arr = sem->Type()->UnwrapRef()->As<core::type::Array>()) {
         auto* refs = builder_->Sem().TransitivelyReferencedOverrides(arr);
         if (refs) {
             for (auto* var : *refs) {
@@ -940,7 +941,7 @@
         return nullptr;
     }
     auto* cond = expr->ConstantValue();
-    if (auto* ty = cond->Type(); !ty->Is<type::Bool>()) {
+    if (auto* ty = cond->Type(); !ty->Is<core::type::Bool>()) {
         AddError("const assertion condition must be a bool, got '" + ty->FriendlyName() + "'",
                  assertion->condition->source);
         return nullptr;
@@ -1015,17 +1016,17 @@
 
         func->AddParameter(p);
 
-        auto* p_ty = const_cast<type::Type*>(p->Type());
-        if (auto* str = p_ty->As<type::Struct>()) {
+        auto* p_ty = const_cast<core::type::Type*>(p->Type());
+        if (auto* str = p_ty->As<core::type::Struct>()) {
             switch (decl->PipelineStage()) {
                 case ast::PipelineStage::kVertex:
-                    str->AddUsage(type::PipelineStageUsage::kVertexInput);
+                    str->AddUsage(core::type::PipelineStageUsage::kVertexInput);
                     break;
                 case ast::PipelineStage::kFragment:
-                    str->AddUsage(type::PipelineStageUsage::kFragmentInput);
+                    str->AddUsage(core::type::PipelineStageUsage::kFragmentInput);
                     break;
                 case ast::PipelineStage::kCompute:
-                    str->AddUsage(type::PipelineStageUsage::kComputeInput);
+                    str->AddUsage(core::type::PipelineStageUsage::kComputeInput);
                     break;
                 case ast::PipelineStage::kNone:
                     break;
@@ -1034,14 +1035,14 @@
     }
 
     // Resolve the return type
-    type::Type* return_type = nullptr;
+    core::type::Type* return_type = nullptr;
     if (auto ty = decl->return_type) {
         return_type = Type(ty);
         if (!return_type) {
             return nullptr;
         }
     } else {
-        return_type = builder_->create<type::Void>();
+        return_type = builder_->create<core::type::Void>();
     }
     func->SetReturnType(return_type);
 
@@ -1123,7 +1124,7 @@
         }
     }
 
-    if (auto* str = return_type->As<type::Struct>()) {
+    if (auto* str = return_type->As<core::type::Struct>()) {
         if (!ApplyAddressSpaceUsageToType(core::AddressSpace::kUndefined, str, decl->source)) {
             AddNote("while instantiating return type for " + decl->name->symbol.Name(),
                     decl->source);
@@ -1132,13 +1133,13 @@
 
         switch (decl->PipelineStage()) {
             case ast::PipelineStage::kVertex:
-                str->AddUsage(type::PipelineStageUsage::kVertexOutput);
+                str->AddUsage(core::type::PipelineStageUsage::kVertexOutput);
                 break;
             case ast::PipelineStage::kFragment:
-                str->AddUsage(type::PipelineStageUsage::kFragmentOutput);
+                str->AddUsage(core::type::PipelineStageUsage::kFragmentOutput);
                 break;
             case ast::PipelineStage::kCompute:
-                str->AddUsage(type::PipelineStageUsage::kComputeOutput);
+                str->AddUsage(core::type::PipelineStageUsage::kComputeOutput);
                 break;
             case ast::PipelineStage::kNone:
                 break;
@@ -1259,7 +1260,8 @@
         });
 }
 
-sem::CaseStatement* Resolver::CaseStatement(const ast::CaseStatement* stmt, const type::Type* ty) {
+sem::CaseStatement* Resolver::CaseStatement(const ast::CaseStatement* stmt,
+                                            const core::type::Type* ty) {
     auto* sem =
         builder_->create<sem::CaseStatement>(stmt, current_compound_statement_, current_function_);
     return StatementScope(stmt, sem, [&] {
@@ -1278,7 +1280,7 @@
                 if (!materialized) {
                     return false;
                 }
-                if (!materialized->Type()->IsAnyOf<type::I32, type::U32>()) {
+                if (!materialized->Type()->IsAnyOf<core::type::I32, core::type::U32>()) {
                     AddError("case selector must be an i32 or u32 value", sel->source);
                     return false;
                 }
@@ -1517,11 +1519,11 @@
             [&](const ast::MemberAccessorExpression* member) { return MemberAccessor(member); },
             [&](const ast::UnaryOpExpression* unary) { return UnaryOp(unary); },
             [&](const ast::PhonyExpression*) {
-                return builder_->create<sem::ValueExpression>(expr, builder_->create<type::Void>(),
-                                                              core::EvaluationStage::kRuntime,
-                                                              current_statement_,
-                                                              /* constant_value */ nullptr,
-                                                              /* has_side_effects */ false);
+                return builder_->create<sem::ValueExpression>(
+                    expr, builder_->create<core::type::Void>(), core::EvaluationStage::kRuntime,
+                    current_statement_,
+                    /* constant_value */ nullptr,
+                    /* has_side_effects */ false);
             },
             [&](Default) {
                 StringStream err;
@@ -1589,12 +1591,12 @@
     return sem_.AsFunctionExpression(Expression(expr));
 }
 
-type::Type* Resolver::Type(const ast::Expression* ast) {
+core::type::Type* Resolver::Type(const ast::Expression* ast) {
     auto* type_expr = TypeExpression(ast);
     if (!type_expr) {
         return nullptr;
     }
-    return const_cast<type::Type*>(type_expr->Type());
+    return const_cast<core::type::Type*>(type_expr->Type());
 }
 
 sem::BuiltinEnumExpression<core::AddressSpace>* Resolver::AddressSpaceExpression(
@@ -1688,7 +1690,7 @@
     std::unordered_map<const sem::Variable*, const sem::ValueExpression*> arg_writes;
     for (size_t i = 0; i < args.Length(); i++) {
         auto* arg = args[i];
-        if (!arg->Type()->Is<type::Pointer>()) {
+        if (!arg->Type()->Is<core::type::Pointer>()) {
             continue;
         }
 
@@ -1752,38 +1754,40 @@
     return true;
 }
 
-const type::Type* Resolver::ConcreteType(const type::Type* ty,
-                                         const type::Type* target_ty,
-                                         const Source& source) {
-    auto i32 = [&] { return builder_->create<type::I32>(); };
-    auto f32 = [&] { return builder_->create<type::F32>(); };
-    auto i32v = [&](uint32_t width) { return builder_->create<type::Vector>(i32(), width); };
-    auto f32v = [&](uint32_t width) { return builder_->create<type::Vector>(f32(), width); };
+const core::type::Type* Resolver::ConcreteType(const core::type::Type* ty,
+                                               const core::type::Type* target_ty,
+                                               const Source& source) {
+    auto i32 = [&] { return builder_->create<core::type::I32>(); };
+    auto f32 = [&] { return builder_->create<core::type::F32>(); };
+    auto i32v = [&](uint32_t width) { return builder_->create<core::type::Vector>(i32(), width); };
+    auto f32v = [&](uint32_t width) { return builder_->create<core::type::Vector>(f32(), width); };
     auto f32m = [&](uint32_t columns, uint32_t rows) {
-        return builder_->create<type::Matrix>(f32v(rows), columns);
+        return builder_->create<core::type::Matrix>(f32v(rows), columns);
     };
 
     return Switch(
         ty,  //
-        [&](const type::AbstractInt*) { return target_ty ? target_ty : i32(); },
-        [&](const type::AbstractFloat*) { return target_ty ? target_ty : f32(); },
-        [&](const type::Vector* v) {
+        [&](const core::type::AbstractInt*) { return target_ty ? target_ty : i32(); },
+        [&](const core::type::AbstractFloat*) { return target_ty ? target_ty : f32(); },
+        [&](const core::type::Vector* v) {
             return Switch(
                 v->type(),  //
-                [&](const type::AbstractInt*) { return target_ty ? target_ty : i32v(v->Width()); },
-                [&](const type::AbstractFloat*) {
+                [&](const core::type::AbstractInt*) {
+                    return target_ty ? target_ty : i32v(v->Width());
+                },
+                [&](const core::type::AbstractFloat*) {
                     return target_ty ? target_ty : f32v(v->Width());
                 });
         },
-        [&](const type::Matrix* m) {
+        [&](const core::type::Matrix* m) {
             return Switch(m->type(),  //
-                          [&](const type::AbstractFloat*) {
+                          [&](const core::type::AbstractFloat*) {
                               return target_ty ? target_ty : f32m(m->columns(), m->rows());
                           });
         },
-        [&](const type::Array* a) -> const type::Type* {
-            const type::Type* target_el_ty = nullptr;
-            if (auto* target_arr_ty = As<type::Array>(target_ty)) {
+        [&](const core::type::Array* a) -> const core::type::Type* {
+            const core::type::Type* target_el_ty = nullptr;
+            if (auto* target_arr_ty = As<core::type::Array>(target_ty)) {
                 target_el_ty = target_arr_ty->ElemType();
             }
             if (auto* el_ty = ConcreteType(a->ElemType(), target_el_ty, source)) {
@@ -1791,7 +1795,7 @@
             }
             return nullptr;
         },
-        [&](const type::Struct* s) -> const type::Type* {
+        [&](const core::type::Struct* s) -> const core::type::Type* {
             if (auto tys = s->ConcreteTypes(); !tys.IsEmpty()) {
                 return target_ty ? target_ty : tys[0];
             }
@@ -1805,7 +1809,7 @@
         return nullptr;
     }
 
-    if (!expr->Type()->Is<type::Reference>()) {
+    if (!expr->Type()->Is<core::type::Reference>()) {
         // Expression is not a reference type, so cannot be loaded. Just return expr.
         return expr;
     }
@@ -1826,8 +1830,9 @@
     return load;
 }
 
-const sem::ValueExpression* Resolver::Materialize(const sem::ValueExpression* expr,
-                                                  const type::Type* target_type /* = nullptr */) {
+const sem::ValueExpression* Resolver::Materialize(
+    const sem::ValueExpression* expr,
+    const core::type::Type* target_type /* = nullptr */) {
     if (!expr) {
         // Allow for Materialize(ValueExpression(blah)), where failures pass through Materialize()
         return nullptr;
@@ -1890,7 +1895,7 @@
             }
             args[i] = materialized;
         }
-        if (!param_ty->Is<type::Reference>()) {
+        if (!param_ty->Is<core::type::Reference>()) {
             auto* load = Load(args[i]);
             if (!load) {
                 return false;
@@ -1901,13 +1906,13 @@
     return true;
 }
 
-bool Resolver::ShouldMaterializeArgument(const type::Type* parameter_ty) const {
+bool Resolver::ShouldMaterializeArgument(const core::type::Type* parameter_ty) const {
     const auto* param_el_ty = parameter_ty->DeepestElement();
-    return param_el_ty && !param_el_ty->Is<type::AbstractNumeric>();
+    return param_el_ty && !param_el_ty->Is<core::type::AbstractNumeric>();
 }
 
 bool Resolver::Convert(const core::constant::Value*& c,
-                       const type::Type* target_ty,
+                       const core::type::Type* target_ty,
                        const Source& source) {
     auto r = const_eval_.Convert(target_ty, c, source);
     if (!r) {
@@ -1950,10 +1955,10 @@
     auto* obj_ty = obj_raw_ty->UnwrapRef();
     auto* ty = Switch(
         obj_ty,  //
-        [&](const type::Array* arr) { return arr->ElemType(); },
-        [&](const type::Vector* vec) { return vec->type(); },
-        [&](const type::Matrix* mat) {
-            return builder_->create<type::Vector>(mat->type(), mat->rows());
+        [&](const core::type::Array* arr) { return arr->ElemType(); },
+        [&](const core::type::Vector* vec) { return vec->type(); },
+        [&](const core::type::Matrix* mat) {
+            return builder_->create<core::type::Vector>(mat->type(), mat->rows());
         },
         [&](Default) {
             AddError("cannot index type '" + sem_.TypeNameOf(obj_ty) + "'", expr->source);
@@ -1964,15 +1969,15 @@
     }
 
     auto* idx_ty = idx->Type()->UnwrapRef();
-    if (!idx_ty->IsAnyOf<type::I32, type::U32>()) {
+    if (!idx_ty->IsAnyOf<core::type::I32, core::type::U32>()) {
         AddError("index must be of type 'i32' or 'u32', found: '" + sem_.TypeNameOf(idx_ty) + "'",
                  idx->Declaration()->source);
         return nullptr;
     }
 
     // If we're extracting from a reference, we return a reference.
-    if (auto* ref = obj_raw_ty->As<type::Reference>()) {
-        ty = builder_->create<type::Reference>(ref->AddressSpace(), ty, ref->Access());
+    if (auto* ref = obj_raw_ty->As<core::type::Reference>()) {
+        ty = builder_->create<core::type::Reference>(ref->AddressSpace(), ty, ref->Access());
     }
 
     const core::constant::Value* val = nullptr;
@@ -2064,7 +2069,8 @@
 
     // ctor_or_conv is a helper for building either a sem::ValueConstructor or
     // sem::ValueConversion call for a CtorConvIntrinsic with an optional template argument type.
-    auto ctor_or_conv = [&](CtorConvIntrinsic ty, const type::Type* template_arg) -> sem::Call* {
+    auto ctor_or_conv = [&](CtorConvIntrinsic ty,
+                            const core::type::Type* template_arg) -> sem::Call* {
         auto arg_tys = tint::Transform(args, [](auto* arg) { return arg->Type(); });
         auto match = intrinsic_table_->Lookup(ty, template_arg, arg_tys, args_stage, expr->source);
         if (!match) {
@@ -2127,7 +2133,7 @@
 
     // arr_or_str_init is a helper for building a sem::ValueConstructor for an array or structure
     // constructor call target.
-    auto arr_or_str_init = [&](const type::Type* ty,
+    auto arr_or_str_init = [&](const core::type::Type* ty,
                                const sem::CallTarget* call_target) -> sem::Call* {
         if (!MaybeMaterializeAndLoadArguments(args, call_target)) {
             return nullptr;
@@ -2159,30 +2165,32 @@
                                            current_statement_, value, has_side_effects);
     };
 
-    auto ty_init_or_conv = [&](const type::Type* type) {
+    auto ty_init_or_conv = [&](const core::type::Type* type) {
         return Switch(
             type,  //
-            [&](const type::I32*) { return ctor_or_conv(CtorConvIntrinsic::kI32, nullptr); },
-            [&](const type::U32*) { return ctor_or_conv(CtorConvIntrinsic::kU32, nullptr); },
-            [&](const type::F16*) {
+            [&](const core::type::I32*) { return ctor_or_conv(CtorConvIntrinsic::kI32, nullptr); },
+            [&](const core::type::U32*) { return ctor_or_conv(CtorConvIntrinsic::kU32, nullptr); },
+            [&](const core::type::F16*) {
                 return validator_.CheckF16Enabled(expr->source)
                            ? ctor_or_conv(CtorConvIntrinsic::kF16, nullptr)
                            : nullptr;
             },
-            [&](const type::F32*) { return ctor_or_conv(CtorConvIntrinsic::kF32, nullptr); },
-            [&](const type::Bool*) { return ctor_or_conv(CtorConvIntrinsic::kBool, nullptr); },
-            [&](const type::Vector* v) {
+            [&](const core::type::F32*) { return ctor_or_conv(CtorConvIntrinsic::kF32, nullptr); },
+            [&](const core::type::Bool*) {
+                return ctor_or_conv(CtorConvIntrinsic::kBool, nullptr);
+            },
+            [&](const core::type::Vector* v) {
                 if (v->Packed()) {
                     TINT_ASSERT(v->Width() == 3u);
                     return ctor_or_conv(CtorConvIntrinsic::kPackedVec3, v->type());
                 }
                 return ctor_or_conv(core::intrinsic::VectorCtorConv(v->Width()), v->type());
             },
-            [&](const type::Matrix* m) {
+            [&](const core::type::Matrix* m) {
                 return ctor_or_conv(core::intrinsic::MatrixCtorConv(m->columns(), m->rows()),
                                     m->type());
             },
-            [&](const type::Array* arr) -> sem::Call* {
+            [&](const core::type::Array* arr) -> sem::Call* {
                 auto* call_target = array_ctors_.GetOrCreate(
                     ArrayConstructorSig{{arr, args.Length(), args_stage}},
                     [&]() -> sem::ValueConstructor* {
@@ -2209,7 +2217,7 @@
                 }
                 return call;
             },
-            [&](const type::Struct* str) -> sem::Call* {
+            [&](const core::type::Struct* str) -> sem::Call* {
                 auto* call_target = struct_ctors_.GetOrCreate(
                     StructConstructorSig{{str, args.Length(), args_stage}},
                     [&]() -> sem::ValueConstructor* {
@@ -2246,13 +2254,13 @@
 
     auto inferred_array = [&]() -> tint::sem::Call* {
         auto el_count =
-            builder_->create<type::ConstantArrayCount>(static_cast<uint32_t>(args.Length()));
+            builder_->create<core::type::ConstantArrayCount>(static_cast<uint32_t>(args.Length()));
         auto arg_tys = tint::Transform(args, [](auto* arg) { return arg->Type()->UnwrapRef(); });
-        auto el_ty = type::Type::Common(arg_tys);
+        auto el_ty = core::type::Type::Common(arg_tys);
         if (!el_ty) {
             AddError("cannot infer common array element type from constructor arguments",
                      expr->source);
-            Hashset<const type::Type*, 8> types;
+            Hashset<const core::type::Type*, 8> types;
             for (size_t i = 0; i < args.Length(); i++) {
                 if (types.Add(args[i]->Type())) {
                     AddNote("argument " + std::to_string(i) + " is of type '" +
@@ -2282,7 +2290,7 @@
         if (auto* ast_node = resolved->Node()) {
             return Switch(
                 sem_.Get(ast_node),  //
-                [&](type::Type* t) -> tint::sem::Call* {
+                [&](core::type::Type* t) -> tint::sem::Call* {
                     // User declared types cannot be templated.
                     if (!TINT_LIKELY(CheckNotTemplated("type", ident))) {
                         return nullptr;
@@ -2490,18 +2498,18 @@
     return call;
 }
 
-type::Type* Resolver::BuiltinType(core::Builtin builtin_ty, const ast::Identifier* ident) {
+core::type::Type* Resolver::BuiltinType(core::Builtin builtin_ty, const ast::Identifier* ident) {
     auto& b = *builder_;
 
-    auto check_no_tmpl_args = [&](type::Type* ty) -> type::Type* {
+    auto check_no_tmpl_args = [&](core::type::Type* ty) -> core::type::Type* {
         return TINT_LIKELY(CheckNotTemplated("type", ident)) ? ty : nullptr;
     };
-    auto af = [&] { return b.create<type::AbstractFloat>(); };
-    auto f32 = [&] { return b.create<type::F32>(); };
-    auto i32 = [&] { return b.create<type::I32>(); };
-    auto u32 = [&] { return b.create<type::U32>(); };
+    auto af = [&] { return b.create<core::type::AbstractFloat>(); };
+    auto f32 = [&] { return b.create<core::type::F32>(); };
+    auto i32 = [&] { return b.create<core::type::I32>(); };
+    auto u32 = [&] { return b.create<core::type::U32>(); };
     auto f16 = [&] {
-        return validator_.CheckF16Enabled(ident->source) ? b.create<type::F16>() : nullptr;
+        return validator_.CheckF16Enabled(ident->source) ? b.create<core::type::F16>() : nullptr;
     };
     auto templated_identifier =
         [&](size_t min_args, size_t max_args = /* use min */ 0) -> const ast::TemplatedIdentifier* {
@@ -2539,16 +2547,17 @@
         }
         return tmpl_ident;
     };
-    auto vec = [&](type::Type* el, uint32_t n) -> type::Vector* {
+    auto vec = [&](core::type::Type* el, uint32_t n) -> core::type::Vector* {
         if (TINT_UNLIKELY(!el)) {
             return nullptr;
         }
         if (TINT_UNLIKELY(!validator_.Vector(el, ident->source))) {
             return nullptr;
         }
-        return b.create<type::Vector>(el, n);
+        return b.create<core::type::Vector>(el, n);
     };
-    auto mat = [&](type::Type* el, uint32_t num_columns, uint32_t num_rows) -> type::Matrix* {
+    auto mat = [&](core::type::Type* el, uint32_t num_columns,
+                   uint32_t num_rows) -> core::type::Matrix* {
         if (TINT_UNLIKELY(!el)) {
             return nullptr;
         }
@@ -2559,9 +2568,9 @@
         if (!column) {
             return nullptr;
         }
-        return b.create<type::Matrix>(column, num_columns);
+        return b.create<core::type::Matrix>(column, num_columns);
     };
-    auto vec_t = [&](uint32_t n) -> type::Vector* {
+    auto vec_t = [&](uint32_t n) -> core::type::Vector* {
         auto* tmpl_ident = templated_identifier(1);
         if (TINT_UNLIKELY(!tmpl_ident)) {
             return nullptr;
@@ -2570,9 +2579,9 @@
         if (TINT_UNLIKELY(!ty)) {
             return nullptr;
         }
-        return vec(const_cast<type::Type*>(ty), n);
+        return vec(const_cast<core::type::Type*>(ty), n);
     };
-    auto mat_t = [&](uint32_t num_columns, uint32_t num_rows) -> type::Matrix* {
+    auto mat_t = [&](uint32_t num_columns, uint32_t num_rows) -> core::type::Matrix* {
         auto* tmpl_ident = templated_identifier(1);
         if (TINT_UNLIKELY(!tmpl_ident)) {
             return nullptr;
@@ -2581,9 +2590,9 @@
         if (TINT_UNLIKELY(!ty)) {
             return nullptr;
         }
-        return mat(const_cast<type::Type*>(ty), num_columns, num_rows);
+        return mat(const_cast<core::type::Type*>(ty), num_columns, num_rows);
     };
-    auto array = [&]() -> type::Array* {
+    auto array = [&]() -> core::type::Array* {
         UniqueVector<const sem::GlobalVariable*, 4> transitively_referenced_overrides;
         TINT_SCOPED_ASSIGNMENT(resolved_overrides_, &transitively_referenced_overrides);
 
@@ -2599,8 +2608,8 @@
             return nullptr;
         }
 
-        const type::ArrayCount* el_count =
-            ast_count ? ArrayCount(ast_count) : builder_->create<type::RuntimeArrayCount>();
+        const core::type::ArrayCount* el_count =
+            ast_count ? ArrayCount(ast_count) : builder_->create<core::type::RuntimeArrayCount>();
         if (!el_count) {
             return nullptr;
         }
@@ -2619,7 +2628,7 @@
             return nullptr;
         }
 
-        if (el_ty->Is<type::Atomic>()) {
+        if (el_ty->Is<core::type::Atomic>()) {
             atomic_composite_info_.Add(out, &ast_el_ty->source);
         } else {
             if (auto found = atomic_composite_info_.Get(el_ty)) {
@@ -2634,7 +2643,7 @@
         }
         return out;
     };
-    auto atomic = [&]() -> type::Atomic* {
+    auto atomic = [&]() -> core::type::Atomic* {
         auto* tmpl_ident = templated_identifier(1);  // atomic<type>
         if (TINT_UNLIKELY(!tmpl_ident)) {
             return nullptr;
@@ -2646,13 +2655,13 @@
         }
         auto* ty = ty_expr->Type();
 
-        auto* out = builder_->create<type::Atomic>(ty);
+        auto* out = builder_->create<core::type::Atomic>(ty);
         if (!validator_.Atomic(tmpl_ident, out)) {
             return nullptr;
         }
         return out;
     };
-    auto ptr = [&]() -> type::Pointer* {
+    auto ptr = [&]() -> core::type::Pointer* {
         auto* tmpl_ident = templated_identifier(2, 3);  // ptr<address, type [, access]>
         if (TINT_UNLIKELY(!tmpl_ident)) {
             return nullptr;
@@ -2668,7 +2677,7 @@
         if (TINT_UNLIKELY(!store_ty_expr)) {
             return nullptr;
         }
-        auto* store_ty = const_cast<type::Type*>(store_ty_expr->Type());
+        auto* store_ty = const_cast<core::type::Type*>(store_ty_expr->Type());
 
         auto access = DefaultAccessForAddressSpace(address_space);
         if (tmpl_ident->arguments.Length() > 2) {
@@ -2679,7 +2688,7 @@
             access = access_expr->Value();
         }
 
-        auto* out = b.create<type::Pointer>(address_space, store_ty, access);
+        auto* out = b.create<core::type::Pointer>(address_space, store_ty, access);
         if (!validator_.Pointer(tmpl_ident, out)) {
             return nullptr;
         }
@@ -2690,7 +2699,7 @@
         }
         return out;
     };
-    auto sampled_texture = [&](type::TextureDimension dim) -> type::SampledTexture* {
+    auto sampled_texture = [&](core::type::TextureDimension dim) -> core::type::SampledTexture* {
         auto* tmpl_ident = templated_identifier(1);
         if (TINT_UNLIKELY(!tmpl_ident)) {
             return nullptr;
@@ -2700,10 +2709,11 @@
         if (TINT_UNLIKELY(!ty_expr)) {
             return nullptr;
         }
-        auto* out = b.create<type::SampledTexture>(dim, ty_expr->Type());
+        auto* out = b.create<core::type::SampledTexture>(dim, ty_expr->Type());
         return validator_.SampledTexture(out, ident->source) ? out : nullptr;
     };
-    auto multisampled_texture = [&](type::TextureDimension dim) -> type::MultisampledTexture* {
+    auto multisampled_texture =
+        [&](core::type::TextureDimension dim) -> core::type::MultisampledTexture* {
         auto* tmpl_ident = templated_identifier(1);
         if (TINT_UNLIKELY(!tmpl_ident)) {
             return nullptr;
@@ -2713,10 +2723,10 @@
         if (TINT_UNLIKELY(!ty_expr)) {
             return nullptr;
         }
-        auto* out = b.create<type::MultisampledTexture>(dim, ty_expr->Type());
+        auto* out = b.create<core::type::MultisampledTexture>(dim, ty_expr->Type());
         return validator_.MultisampledTexture(out, ident->source) ? out : nullptr;
     };
-    auto storage_texture = [&](type::TextureDimension dim) -> type::StorageTexture* {
+    auto storage_texture = [&](core::type::TextureDimension dim) -> core::type::StorageTexture* {
         auto* tmpl_ident = templated_identifier(2);
         if (TINT_UNLIKELY(!tmpl_ident)) {
             return nullptr;
@@ -2730,14 +2740,15 @@
         if (TINT_UNLIKELY(!access)) {
             return nullptr;
         }
-        auto* subtype = type::StorageTexture::SubtypeFor(format->Value(), builder_->Types());
-        auto* tex = b.create<type::StorageTexture>(dim, format->Value(), access->Value(), subtype);
+        auto* subtype = core::type::StorageTexture::SubtypeFor(format->Value(), builder_->Types());
+        auto* tex =
+            b.create<core::type::StorageTexture>(dim, format->Value(), access->Value(), subtype);
         if (!validator_.StorageTexture(tex, ident->source)) {
             return nullptr;
         }
         return tex;
     };
-    auto packed_vec3_t = [&]() -> type::Vector* {
+    auto packed_vec3_t = [&]() -> core::type::Vector* {
         auto* tmpl_ident = templated_identifier(1);
         if (TINT_UNLIKELY(!tmpl_ident)) {
             return nullptr;
@@ -2750,12 +2761,12 @@
         if (TINT_UNLIKELY(!validator_.Vector(el_ty, ident->source))) {
             return nullptr;
         }
-        return b.create<type::Vector>(el_ty, 3u, true);
+        return b.create<core::type::Vector>(el_ty, 3u, true);
     };
 
     switch (builtin_ty) {
         case core::Builtin::kBool:
-            return check_no_tmpl_args(b.create<type::Bool>());
+            return check_no_tmpl_args(b.create<core::type::Bool>());
         case core::Builtin::kI32:
             return check_no_tmpl_args(i32());
         case core::Builtin::kU32:
@@ -2763,7 +2774,7 @@
         case core::Builtin::kF16:
             return check_no_tmpl_args(f16());
         case core::Builtin::kF32:
-            return check_no_tmpl_args(b.create<type::F32>());
+            return check_no_tmpl_args(b.create<core::type::F32>());
         case core::Builtin::kVec2:
             return vec_t(2);
         case core::Builtin::kVec3:
@@ -2855,105 +2866,124 @@
         case core::Builtin::kPtr:
             return ptr();
         case core::Builtin::kSampler:
-            return check_no_tmpl_args(builder_->create<type::Sampler>(type::SamplerKind::kSampler));
+            return check_no_tmpl_args(
+                builder_->create<core::type::Sampler>(core::type::SamplerKind::kSampler));
         case core::Builtin::kSamplerComparison:
             return check_no_tmpl_args(
-                builder_->create<type::Sampler>(type::SamplerKind::kComparisonSampler));
+                builder_->create<core::type::Sampler>(core::type::SamplerKind::kComparisonSampler));
         case core::Builtin::kTexture1D:
-            return sampled_texture(type::TextureDimension::k1d);
+            return sampled_texture(core::type::TextureDimension::k1d);
         case core::Builtin::kTexture2D:
-            return sampled_texture(type::TextureDimension::k2d);
+            return sampled_texture(core::type::TextureDimension::k2d);
         case core::Builtin::kTexture2DArray:
-            return sampled_texture(type::TextureDimension::k2dArray);
+            return sampled_texture(core::type::TextureDimension::k2dArray);
         case core::Builtin::kTexture3D:
-            return sampled_texture(type::TextureDimension::k3d);
+            return sampled_texture(core::type::TextureDimension::k3d);
         case core::Builtin::kTextureCube:
-            return sampled_texture(type::TextureDimension::kCube);
+            return sampled_texture(core::type::TextureDimension::kCube);
         case core::Builtin::kTextureCubeArray:
-            return sampled_texture(type::TextureDimension::kCubeArray);
+            return sampled_texture(core::type::TextureDimension::kCubeArray);
         case core::Builtin::kTextureDepth2D:
             return check_no_tmpl_args(
-                builder_->create<type::DepthTexture>(type::TextureDimension::k2d));
+                builder_->create<core::type::DepthTexture>(core::type::TextureDimension::k2d));
         case core::Builtin::kTextureDepth2DArray:
             return check_no_tmpl_args(
-                builder_->create<type::DepthTexture>(type::TextureDimension::k2dArray));
+                builder_->create<core::type::DepthTexture>(core::type::TextureDimension::k2dArray));
         case core::Builtin::kTextureDepthCube:
             return check_no_tmpl_args(
-                builder_->create<type::DepthTexture>(type::TextureDimension::kCube));
+                builder_->create<core::type::DepthTexture>(core::type::TextureDimension::kCube));
         case core::Builtin::kTextureDepthCubeArray:
-            return check_no_tmpl_args(
-                builder_->create<type::DepthTexture>(type::TextureDimension::kCubeArray));
+            return check_no_tmpl_args(builder_->create<core::type::DepthTexture>(
+                core::type::TextureDimension::kCubeArray));
         case core::Builtin::kTextureDepthMultisampled2D:
-            return check_no_tmpl_args(
-                builder_->create<type::DepthMultisampledTexture>(type::TextureDimension::k2d));
+            return check_no_tmpl_args(builder_->create<core::type::DepthMultisampledTexture>(
+                core::type::TextureDimension::k2d));
         case core::Builtin::kTextureExternal:
-            return check_no_tmpl_args(builder_->create<type::ExternalTexture>());
+            return check_no_tmpl_args(builder_->create<core::type::ExternalTexture>());
         case core::Builtin::kTextureMultisampled2D:
-            return multisampled_texture(type::TextureDimension::k2d);
+            return multisampled_texture(core::type::TextureDimension::k2d);
         case core::Builtin::kTextureStorage1D:
-            return storage_texture(type::TextureDimension::k1d);
+            return storage_texture(core::type::TextureDimension::k1d);
         case core::Builtin::kTextureStorage2D:
-            return storage_texture(type::TextureDimension::k2d);
+            return storage_texture(core::type::TextureDimension::k2d);
         case core::Builtin::kTextureStorage2DArray:
-            return storage_texture(type::TextureDimension::k2dArray);
+            return storage_texture(core::type::TextureDimension::k2dArray);
         case core::Builtin::kTextureStorage3D:
-            return storage_texture(type::TextureDimension::k3d);
+            return storage_texture(core::type::TextureDimension::k3d);
         case core::Builtin::kPackedVec3:
             return packed_vec3_t();
         case core::Builtin::kAtomicCompareExchangeResultI32:
-            return type::CreateAtomicCompareExchangeResult(builder_->Types(), builder_->Symbols(),
-                                                           i32());
+            return core::type::CreateAtomicCompareExchangeResult(builder_->Types(),
+                                                                 builder_->Symbols(), i32());
         case core::Builtin::kAtomicCompareExchangeResultU32:
-            return type::CreateAtomicCompareExchangeResult(builder_->Types(), builder_->Symbols(),
-                                                           u32());
+            return core::type::CreateAtomicCompareExchangeResult(builder_->Types(),
+                                                                 builder_->Symbols(), u32());
         case core::Builtin::kFrexpResultAbstract:
-            return type::CreateFrexpResult(builder_->Types(), builder_->Symbols(), af());
+            return core::type::CreateFrexpResult(builder_->Types(), builder_->Symbols(), af());
         case core::Builtin::kFrexpResultF16:
-            return type::CreateFrexpResult(builder_->Types(), builder_->Symbols(), f16());
+            return core::type::CreateFrexpResult(builder_->Types(), builder_->Symbols(), f16());
         case core::Builtin::kFrexpResultF32:
-            return type::CreateFrexpResult(builder_->Types(), builder_->Symbols(), f32());
+            return core::type::CreateFrexpResult(builder_->Types(), builder_->Symbols(), f32());
         case core::Builtin::kFrexpResultVec2Abstract:
-            return type::CreateFrexpResult(builder_->Types(), builder_->Symbols(), vec(af(), 2));
+            return core::type::CreateFrexpResult(builder_->Types(), builder_->Symbols(),
+                                                 vec(af(), 2));
         case core::Builtin::kFrexpResultVec2F16:
-            return type::CreateFrexpResult(builder_->Types(), builder_->Symbols(), vec(f16(), 2));
+            return core::type::CreateFrexpResult(builder_->Types(), builder_->Symbols(),
+                                                 vec(f16(), 2));
         case core::Builtin::kFrexpResultVec2F32:
-            return type::CreateFrexpResult(builder_->Types(), builder_->Symbols(), vec(f32(), 2));
+            return core::type::CreateFrexpResult(builder_->Types(), builder_->Symbols(),
+                                                 vec(f32(), 2));
         case core::Builtin::kFrexpResultVec3Abstract:
-            return type::CreateFrexpResult(builder_->Types(), builder_->Symbols(), vec(af(), 3));
+            return core::type::CreateFrexpResult(builder_->Types(), builder_->Symbols(),
+                                                 vec(af(), 3));
         case core::Builtin::kFrexpResultVec3F16:
-            return type::CreateFrexpResult(builder_->Types(), builder_->Symbols(), vec(f16(), 3));
+            return core::type::CreateFrexpResult(builder_->Types(), builder_->Symbols(),
+                                                 vec(f16(), 3));
         case core::Builtin::kFrexpResultVec3F32:
-            return type::CreateFrexpResult(builder_->Types(), builder_->Symbols(), vec(f32(), 3));
+            return core::type::CreateFrexpResult(builder_->Types(), builder_->Symbols(),
+                                                 vec(f32(), 3));
         case core::Builtin::kFrexpResultVec4Abstract:
-            return type::CreateFrexpResult(builder_->Types(), builder_->Symbols(), vec(af(), 4));
+            return core::type::CreateFrexpResult(builder_->Types(), builder_->Symbols(),
+                                                 vec(af(), 4));
         case core::Builtin::kFrexpResultVec4F16:
-            return type::CreateFrexpResult(builder_->Types(), builder_->Symbols(), vec(f16(), 4));
+            return core::type::CreateFrexpResult(builder_->Types(), builder_->Symbols(),
+                                                 vec(f16(), 4));
         case core::Builtin::kFrexpResultVec4F32:
-            return type::CreateFrexpResult(builder_->Types(), builder_->Symbols(), vec(f32(), 4));
+            return core::type::CreateFrexpResult(builder_->Types(), builder_->Symbols(),
+                                                 vec(f32(), 4));
         case core::Builtin::kModfResultAbstract:
-            return type::CreateModfResult(builder_->Types(), builder_->Symbols(), af());
+            return core::type::CreateModfResult(builder_->Types(), builder_->Symbols(), af());
         case core::Builtin::kModfResultF16:
-            return type::CreateModfResult(builder_->Types(), builder_->Symbols(), f16());
+            return core::type::CreateModfResult(builder_->Types(), builder_->Symbols(), f16());
         case core::Builtin::kModfResultF32:
-            return type::CreateModfResult(builder_->Types(), builder_->Symbols(), f32());
+            return core::type::CreateModfResult(builder_->Types(), builder_->Symbols(), f32());
         case core::Builtin::kModfResultVec2Abstract:
-            return type::CreateModfResult(builder_->Types(), builder_->Symbols(), vec(af(), 2));
+            return core::type::CreateModfResult(builder_->Types(), builder_->Symbols(),
+                                                vec(af(), 2));
         case core::Builtin::kModfResultVec2F16:
-            return type::CreateModfResult(builder_->Types(), builder_->Symbols(), vec(f16(), 2));
+            return core::type::CreateModfResult(builder_->Types(), builder_->Symbols(),
+                                                vec(f16(), 2));
         case core::Builtin::kModfResultVec2F32:
-            return type::CreateModfResult(builder_->Types(), builder_->Symbols(), vec(f32(), 2));
+            return core::type::CreateModfResult(builder_->Types(), builder_->Symbols(),
+                                                vec(f32(), 2));
         case core::Builtin::kModfResultVec3Abstract:
-            return type::CreateModfResult(builder_->Types(), builder_->Symbols(), vec(af(), 3));
+            return core::type::CreateModfResult(builder_->Types(), builder_->Symbols(),
+                                                vec(af(), 3));
         case core::Builtin::kModfResultVec3F16:
-            return type::CreateModfResult(builder_->Types(), builder_->Symbols(), vec(f16(), 3));
+            return core::type::CreateModfResult(builder_->Types(), builder_->Symbols(),
+                                                vec(f16(), 3));
         case core::Builtin::kModfResultVec3F32:
-            return type::CreateModfResult(builder_->Types(), builder_->Symbols(), vec(f32(), 3));
+            return core::type::CreateModfResult(builder_->Types(), builder_->Symbols(),
+                                                vec(f32(), 3));
         case core::Builtin::kModfResultVec4Abstract:
-            return type::CreateModfResult(builder_->Types(), builder_->Symbols(), vec(af(), 4));
+            return core::type::CreateModfResult(builder_->Types(), builder_->Symbols(),
+                                                vec(af(), 4));
         case core::Builtin::kModfResultVec4F16:
-            return type::CreateModfResult(builder_->Types(), builder_->Symbols(), vec(f16(), 4));
+            return core::type::CreateModfResult(builder_->Types(), builder_->Symbols(),
+                                                vec(f16(), 4));
         case core::Builtin::kModfResultVec4F32:
-            return type::CreateModfResult(builder_->Types(), builder_->Symbols(), vec(f32(), 4));
+            return core::type::CreateModfResult(builder_->Types(), builder_->Symbols(),
+                                                vec(f32(), 4));
         case core::Builtin::kUndefined:
             break;
     }
@@ -2965,11 +2995,11 @@
     return nullptr;
 }
 
-size_t Resolver::NestDepth(const type::Type* ty) const {
+size_t Resolver::NestDepth(const core::type::Type* ty) const {
     return Switch(
         ty,  //
-        [](const type::Vector*) { return size_t{1}; },
-        [](const type::Matrix*) { return size_t{2}; },
+        [](const core::type::Vector*) { return size_t{1}; },
+        [](const core::type::Matrix*) { return size_t{2}; },
         [&](Default) {
             if (auto d = nest_depth_.Get(ty)) {
                 return *d;
@@ -2992,7 +3022,7 @@
     if (auto* user =
             args[static_cast<size_t>(texture_index)]->UnwrapLoad()->As<sem::VariableUser>()) {
         auto* texture = user->Variable();
-        if (!texture->Type()->UnwrapRef()->Is<type::StorageTexture>()) {
+        if (!texture->Type()->UnwrapRef()->Is<core::type::StorageTexture>()) {
             int sampler_index = signature.IndexOf(core::ParameterUsage::kSampler);
             const sem::Variable* sampler = sampler_index != -1
                                                ? args[static_cast<size_t>(sampler_index)]
@@ -3086,33 +3116,33 @@
 sem::ValueExpression* Resolver::Literal(const ast::LiteralExpression* literal) {
     auto* ty = Switch(
         literal,
-        [&](const ast::IntLiteralExpression* i) -> type::Type* {
+        [&](const ast::IntLiteralExpression* i) -> core::type::Type* {
             switch (i->suffix) {
                 case ast::IntLiteralExpression::Suffix::kNone:
-                    return builder_->create<type::AbstractInt>();
+                    return builder_->create<core::type::AbstractInt>();
                 case ast::IntLiteralExpression::Suffix::kI:
-                    return builder_->create<type::I32>();
+                    return builder_->create<core::type::I32>();
                 case ast::IntLiteralExpression::Suffix::kU:
-                    return builder_->create<type::U32>();
+                    return builder_->create<core::type::U32>();
             }
             TINT_UNREACHABLE() << "Unhandled integer literal suffix: " << i->suffix;
             return nullptr;
         },
-        [&](const ast::FloatLiteralExpression* f) -> type::Type* {
+        [&](const ast::FloatLiteralExpression* f) -> core::type::Type* {
             switch (f->suffix) {
                 case ast::FloatLiteralExpression::Suffix::kNone:
-                    return builder_->create<type::AbstractFloat>();
+                    return builder_->create<core::type::AbstractFloat>();
                 case ast::FloatLiteralExpression::Suffix::kF:
-                    return builder_->create<type::F32>();
+                    return builder_->create<core::type::F32>();
                 case ast::FloatLiteralExpression::Suffix::kH:
                     return validator_.CheckF16Enabled(literal->source)
-                               ? builder_->create<type::F16>()
+                               ? builder_->create<core::type::F16>()
                                : nullptr;
             }
             TINT_UNREACHABLE() << "Unhandled float literal suffix: " << f->suffix;
             return nullptr;
         },
-        [&](const ast::BoolLiteralExpression*) { return builder_->create<type::Bool>(); },
+        [&](const ast::BoolLiteralExpression*) { return builder_->create<core::type::Bool>(); },
         [&](Default) {
             TINT_UNREACHABLE() << "Unhandled literal type: " << literal->TypeInfo().name;
             return nullptr;
@@ -3260,7 +3290,7 @@
                 variable->AddUser(user);
                 return user;
             },
-            [&](const type::Type* ty) -> sem::TypeExpression* {
+            [&](const core::type::Type* ty) -> sem::TypeExpression* {
                 // User declared types cannot be templated.
                 if (!TINT_LIKELY(CheckNotTemplated("type", ident))) {
                     return nullptr;
@@ -3371,7 +3401,7 @@
 
     auto* root_ident = object->RootIdentifier();
 
-    const type::Type* ty = nullptr;
+    const core::type::Type* ty = nullptr;
 
     // Object may be a side-effecting expression (e.g. function call).
     bool has_side_effects = object->HasSideEffects();
@@ -3380,10 +3410,10 @@
 
     return Switch(
         storage_ty,  //
-        [&](const type::Struct* str) -> sem::ValueExpression* {
+        [&](const core::type::Struct* str) -> sem::ValueExpression* {
             auto symbol = expr->member->symbol;
 
-            const type::StructMember* member = nullptr;
+            const core::type::StructMember* member = nullptr;
             for (auto* m : str->Members()) {
                 if (m->Name() == symbol) {
                     member = m;
@@ -3399,8 +3429,9 @@
             ty = member->Type();
 
             // If we're extracting from a reference, we return a reference.
-            if (auto* ref = object_ty->As<type::Reference>()) {
-                ty = builder_->create<type::Reference>(ref->AddressSpace(), ty, ref->Access());
+            if (auto* ref = object_ty->As<core::type::Reference>()) {
+                ty =
+                    builder_->create<core::type::Reference>(ref->AddressSpace(), ty, ref->Access());
             }
 
             const core::constant::Value* val = nullptr;
@@ -3411,7 +3442,7 @@
                 expr, ty, current_statement_, val, object, member, has_side_effects, root_ident);
         },
 
-        [&](const type::Vector* vec) -> sem::ValueExpression* {
+        [&](const core::type::Vector* vec) -> sem::ValueExpression* {
             std::string s = expr->member->symbol.Name();
             auto size = s.size();
             Vector<uint32_t, 4> swizzle;
@@ -3467,13 +3498,14 @@
                 // A single element swizzle is just the type of the vector.
                 ty = vec->type();
                 // If we're extracting from a reference, we return a reference.
-                if (auto* ref = object_ty->As<type::Reference>()) {
-                    ty = builder_->create<type::Reference>(ref->AddressSpace(), ty, ref->Access());
+                if (auto* ref = object_ty->As<core::type::Reference>()) {
+                    ty = builder_->create<core::type::Reference>(ref->AddressSpace(), ty,
+                                                                 ref->Access());
                 }
             } else {
                 // The vector will have a number of components equal to the length of
                 // the swizzle.
-                ty = builder_->create<type::Vector>(vec->type(), static_cast<uint32_t>(size));
+                ty = builder_->create<core::type::Vector>(vec->type(), static_cast<uint32_t>(size));
 
                 // The load rule is invoked before the swizzle, if necessary.
                 obj_expr = Load(object);
@@ -3591,14 +3623,14 @@
     }
     auto* expr_ty = expr->Type();
 
-    const type::Type* ty = nullptr;
+    const core::type::Type* ty = nullptr;
     const sem::Variable* root_ident = nullptr;
     const core::constant::Value* value = nullptr;
     auto stage = core::EvaluationStage::kRuntime;
 
     switch (unary->op) {
         case core::UnaryOp::kAddressOf:
-            if (auto* ref = expr_ty->As<type::Reference>()) {
+            if (auto* ref = expr_ty->As<core::type::Reference>()) {
                 if (ref->StoreType()->UnwrapRef()->is_handle()) {
                     AddError("cannot take the address of expression in handle address space",
                              unary->expr->source);
@@ -3607,14 +3639,15 @@
 
                 auto* array = unary->expr->As<ast::IndexAccessorExpression>();
                 auto* member = unary->expr->As<ast::MemberAccessorExpression>();
-                if ((array && sem_.TypeOf(array->object)->UnwrapRef()->Is<type::Vector>()) ||
-                    (member && sem_.TypeOf(member->object)->UnwrapRef()->Is<type::Vector>())) {
+                if ((array && sem_.TypeOf(array->object)->UnwrapRef()->Is<core::type::Vector>()) ||
+                    (member &&
+                     sem_.TypeOf(member->object)->UnwrapRef()->Is<core::type::Vector>())) {
                     AddError("cannot take the address of a vector component", unary->expr->source);
                     return nullptr;
                 }
 
-                ty = builder_->create<type::Pointer>(ref->AddressSpace(), ref->StoreType(),
-                                                     ref->Access());
+                ty = builder_->create<core::type::Pointer>(ref->AddressSpace(), ref->StoreType(),
+                                                           ref->Access());
 
                 root_ident = expr->RootIdentifier();
             } else {
@@ -3624,9 +3657,9 @@
             break;
 
         case core::UnaryOp::kIndirection:
-            if (auto* ptr = expr_ty->As<type::Pointer>()) {
-                ty = builder_->create<type::Reference>(ptr->AddressSpace(), ptr->StoreType(),
-                                                       ptr->Access());
+            if (auto* ptr = expr_ty->As<core::type::Pointer>()) {
+                ty = builder_->create<core::type::Reference>(ptr->AddressSpace(), ptr->StoreType(),
+                                                             ptr->Access());
                 root_ident = expr->RootIdentifier();
             } else {
                 AddError("cannot dereference expression of type '" + sem_.TypeNameOf(expr_ty) + "'",
@@ -3688,7 +3721,7 @@
         return tint::Failure;
     }
 
-    if (!materialized->Type()->IsAnyOf<type::I32, type::U32>()) {
+    if (!materialized->Type()->IsAnyOf<core::type::I32, core::type::U32>()) {
         AddError("@location must be an i32 or u32 value", attr->source);
         return tint::Failure;
     }
@@ -3712,7 +3745,7 @@
         return tint::Failure;
     }
 
-    if (!materialized->Type()->IsAnyOf<type::I32, type::U32>()) {
+    if (!materialized->Type()->IsAnyOf<core::type::I32, core::type::U32>()) {
         AddError("@location must be an i32 or u32 value", attr->source);
         return tint::Failure;
     }
@@ -3735,7 +3768,7 @@
     if (!materialized) {
         return tint::Failure;
     }
-    if (!materialized->Type()->IsAnyOf<type::I32, type::U32>()) {
+    if (!materialized->Type()->IsAnyOf<core::type::I32, core::type::U32>()) {
         AddError("@binding must be an i32 or u32 value", attr->source);
         return tint::Failure;
     }
@@ -3757,7 +3790,7 @@
     if (!materialized) {
         return tint::Failure;
     }
-    if (!materialized->Type()->IsAnyOf<type::I32, type::U32>()) {
+    if (!materialized->Type()->IsAnyOf<core::type::I32, core::type::U32>()) {
         AddError("@group must be an i32 or u32 value", attr->source);
         return tint::Failure;
     }
@@ -3780,7 +3813,7 @@
 
     auto values = attr->Values();
     Vector<const sem::ValueExpression*, 3> args;
-    Vector<const type::Type*, 3> arg_tys;
+    Vector<const core::type::Type*, 3> arg_tys;
 
     constexpr const char* kErrBadExpr =
         "workgroup_size argument must be a constant or override-expression of type "
@@ -3798,7 +3831,7 @@
             return tint::Failure;
         }
         auto* ty = expr->Type();
-        if (!ty->IsAnyOf<type::I32, type::U32, type::AbstractInt>()) {
+        if (!ty->IsAnyOf<core::type::I32, core::type::U32, core::type::AbstractInt>()) {
             AddError(kErrBadExpr, value->source);
             return tint::Failure;
         }
@@ -3813,7 +3846,7 @@
         arg_tys.Push(ty);
     }
 
-    auto* common_ty = type::Type::Common(arg_tys);
+    auto* common_ty = core::type::Type::Common(arg_tys);
     if (!common_ty) {
         AddError("workgroup_size arguments must be of the same type, either i32 or u32",
                  attr->source);
@@ -3821,8 +3854,8 @@
     }
 
     // If all arguments are abstract-integers, then materialize to i32.
-    if (common_ty->Is<type::AbstractInt>()) {
-        common_ty = builder_->create<type::I32>();
+    if (common_ty->Is<core::type::AbstractInt>()) {
+        common_ty = builder_->create<core::type::I32>();
     }
 
     for (size_t i = 0; i < args.Length(); i++) {
@@ -3955,10 +3988,10 @@
     return true;
 }
 
-type::Type* Resolver::TypeDecl(const ast::TypeDecl* named_type) {
+core::type::Type* Resolver::TypeDecl(const ast::TypeDecl* named_type) {
     Mark(named_type->name);
 
-    type::Type* result = nullptr;
+    core::type::Type* result = nullptr;
     if (auto* alias = named_type->As<ast::Alias>()) {
         result = Alias(alias);
     } else if (auto* str = named_type->As<ast::Struct>()) {
@@ -3975,7 +4008,7 @@
     return result;
 }
 
-const type::ArrayCount* Resolver::ArrayCount(const ast::Expression* count_expr) {
+const core::type::ArrayCount* Resolver::ArrayCount(const ast::Expression* count_expr) {
     // Evaluate the constant array count expression.
     const auto* count_sem = Materialize(ValueExpression(count_expr));
     if (!count_sem) {
@@ -4014,11 +4047,11 @@
         return nullptr;
     }
 
-    return builder_->create<type::ConstantArrayCount>(static_cast<uint32_t>(count));
+    return builder_->create<core::type::ConstantArrayCount>(static_cast<uint32_t>(count));
 }
 
 bool Resolver::ArrayAttributes(VectorRef<const ast::Attribute*> attributes,
-                               const type::Type* el_ty,
+                               const core::type::Type* el_ty,
                                uint32_t& explicit_stride) {
     if (!validator_.NoDuplicateAttributes(attributes)) {
         return false;
@@ -4053,19 +4086,19 @@
     return true;
 }
 
-type::Array* Resolver::Array(const Source& array_source,
-                             const Source& el_source,
-                             const Source& count_source,
-                             const type::Type* el_ty,
-                             const type::ArrayCount* el_count,
-                             uint32_t explicit_stride) {
+core::type::Array* Resolver::Array(const Source& array_source,
+                                   const Source& el_source,
+                                   const Source& count_source,
+                                   const core::type::Type* el_ty,
+                                   const core::type::ArrayCount* el_count,
+                                   uint32_t explicit_stride) {
     uint32_t el_align = el_ty->Align();
     uint32_t el_size = el_ty->Size();
     uint64_t implicit_stride = el_size ? tint::RoundUp<uint64_t>(el_align, el_size) : 0;
     uint64_t stride = explicit_stride ? explicit_stride : implicit_stride;
     uint64_t size = 0;
 
-    if (auto const_count = el_count->As<type::ConstantArrayCount>()) {
+    if (auto const_count = el_count->As<core::type::ConstantArrayCount>()) {
         size = const_count->value * stride;
         if (size > std::numeric_limits<uint32_t>::max()) {
             StringStream msg;
@@ -4074,10 +4107,10 @@
             AddError(msg.str(), count_source);
             return nullptr;
         }
-    } else if (el_count->Is<type::RuntimeArrayCount>()) {
+    } else if (el_count->Is<core::type::RuntimeArrayCount>()) {
         size = stride;
     }
-    auto* out = builder_->create<type::Array>(
+    auto* out = builder_->create<core::type::Array>(
         el_ty, el_count, el_align, static_cast<uint32_t>(size), static_cast<uint32_t>(stride),
         static_cast<uint32_t>(implicit_stride));
 
@@ -4099,7 +4132,7 @@
     return out;
 }
 
-type::Type* Resolver::Alias(const ast::Alias* alias) {
+core::type::Type* Resolver::Alias(const ast::Alias* alias) {
     auto* ty = Type(alias->type);
     if (!ty) {
         return nullptr;
@@ -4194,7 +4227,7 @@
         bool has_offset_attr = false;
         bool has_align_attr = false;
         bool has_size_attr = false;
-        type::StructMemberAttributes attributes;
+        core::type::StructMemberAttributes attributes;
         for (auto* attribute : member->attributes) {
             Mark(attribute);
             bool ok = Switch(
@@ -4233,7 +4266,7 @@
                     if (!materialized) {
                         return false;
                     }
-                    if (!materialized->Type()->IsAnyOf<type::I32, type::U32>()) {
+                    if (!materialized->Type()->IsAnyOf<core::type::I32, core::type::U32>()) {
                         AddError("@align must be an i32 or u32 value", attr->source);
                         return false;
                     }
@@ -4262,7 +4295,7 @@
                     if (!materialized) {
                         return false;
                     }
-                    if (!materialized->Type()->IsAnyOf<type::U32, type::I32>()) {
+                    if (!materialized->Type()->IsAnyOf<core::type::U32, core::type::I32>()) {
                         AddError("@size must be an i32 or u32 value", attr->source);
                         return false;
                     }
@@ -4392,7 +4425,7 @@
 
     for (size_t i = 0; i < sem_members.Length(); i++) {
         auto* mem_type = sem_members[i]->Type();
-        if (mem_type->Is<type::Atomic>()) {
+        if (mem_type->Is<core::type::Atomic>()) {
             atomic_composite_info_.Add(out, &sem_members[i]->Declaration()->source);
             break;
         } else {
@@ -4433,13 +4466,13 @@
         auto& behaviors = current_statement_->Behaviors();
         behaviors = sem::Behavior::kReturn;
 
-        const type::Type* value_ty = nullptr;
+        const core::type::Type* value_ty = nullptr;
         if (auto* value = stmt->value) {
             const auto* expr = Load(ValueExpression(value));
             if (!expr) {
                 return false;
             }
-            if (auto* ret_ty = current_function_->ReturnType(); !ret_ty->Is<type::Void>()) {
+            if (auto* ret_ty = current_function_->ReturnType(); !ret_ty->Is<core::type::Void>()) {
                 expr = Materialize(expr, ret_ty);
                 if (!expr) {
                     return false;
@@ -4449,7 +4482,7 @@
 
             value_ty = expr->Type();
         } else {
-            value_ty = builder_->create<type::Void>();
+            value_ty = builder_->create<core::type::Void>();
         }
 
         // Validate after processing the return value expression so that its type
@@ -4475,7 +4508,7 @@
 
         // Determine the common type across all selectors and the switch expression
         // This must materialize to an integer scalar (non-abstract).
-        Vector<const type::Type*, 8> types;
+        Vector<const core::type::Type*, 8> types;
         types.Push(cond_ty);
         for (auto* case_stmt : stmt->body) {
             for (auto* sel : case_stmt->selectors) {
@@ -4489,11 +4522,11 @@
                 types.Push(sem_expr->Type()->UnwrapRef());
             }
         }
-        auto* common_ty = type::Type::Common(types);
+        auto* common_ty = core::type::Type::Common(types);
         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<type::I32>();
+            common_ty = builder_->create<core::type::I32>();
         }
         cond = Materialize(cond, common_ty);
         if (!cond) {
@@ -4726,9 +4759,9 @@
 }
 
 bool Resolver::ApplyAddressSpaceUsageToType(core::AddressSpace address_space,
-                                            type::Type* ty,
+                                            core::type::Type* ty,
                                             const Source& usage) {
-    ty = const_cast<type::Type*>(ty->UnwrapRef());
+    ty = const_cast<core::type::Type*>(ty->UnwrapRef());
 
     if (auto* str = ty->As<sem::Struct>()) {
         if (str->AddressSpaceUsage().count(address_space)) {
@@ -4739,9 +4772,9 @@
 
         for (auto* member : str->Members()) {
             auto decl = member->Declaration();
-            if (decl &&
-                !ApplyAddressSpaceUsageToType(
-                    address_space, const_cast<type::Type*>(member->Type()), decl->type->source)) {
+            if (decl && !ApplyAddressSpaceUsageToType(address_space,
+                                                      const_cast<core::type::Type*>(member->Type()),
+                                                      decl->type->source)) {
                 StringStream err;
                 err << "while analyzing structure member " << sem_.TypeNameOf(str) << "."
                     << member->Name().Name();
@@ -4752,9 +4785,9 @@
         return true;
     }
 
-    if (auto* arr = ty->As<type::Array>()) {
+    if (auto* arr = ty->As<core::type::Array>()) {
         if (address_space != core::AddressSpace::kStorage) {
-            if (arr->Count()->Is<type::RuntimeArrayCount>()) {
+            if (arr->Count()->Is<core::type::RuntimeArrayCount>()) {
                 AddError("runtime-sized arrays can only be used in the <storage> address space",
                          usage);
                 return false;
@@ -4768,8 +4801,8 @@
                 return false;
             }
         }
-        return ApplyAddressSpaceUsageToType(address_space, const_cast<type::Type*>(arr->ElemType()),
-                                            usage);
+        return ApplyAddressSpaceUsageToType(address_space,
+                                            const_cast<core::type::Type*>(arr->ElemType()), usage);
     }
 
     if (core::IsHostShareable(address_space) && !validator_.IsHostShareable(ty)) {
diff --git a/src/tint/lang/wgsl/resolver/resolver.h b/src/tint/lang/wgsl/resolver/resolver.h
index fce71e5..4c9ac88 100644
--- a/src/tint/lang/wgsl/resolver/resolver.h
+++ b/src/tint/lang/wgsl/resolver/resolver.h
@@ -71,9 +71,9 @@
 class ValueConversion;
 class WhileStatement;
 }  // namespace tint::sem
-namespace tint::type {
+namespace tint::core::type {
 class Atomic;
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 namespace tint::resolver {
 
@@ -98,21 +98,23 @@
 
     /// @param type the given type
     /// @returns true if the given type is a plain type
-    bool IsPlain(const type::Type* type) const { return validator_.IsPlain(type); }
+    bool IsPlain(const core::type::Type* type) const { return validator_.IsPlain(type); }
 
     /// @param type the given type
     /// @returns true if the given type is a fixed-footprint type
-    bool IsFixedFootprint(const type::Type* type) const {
+    bool IsFixedFootprint(const core::type::Type* type) const {
         return validator_.IsFixedFootprint(type);
     }
 
     /// @param type the given type
     /// @returns true if the given type is storable
-    bool IsStorable(const type::Type* type) const { return validator_.IsStorable(type); }
+    bool IsStorable(const core::type::Type* type) const { return validator_.IsStorable(type); }
 
     /// @param type the given type
     /// @returns true if the given type is host-shareable
-    bool IsHostShareable(const type::Type* type) const { return validator_.IsHostShareable(type); }
+    bool IsHostShareable(const core::type::Type* type) const {
+        return validator_.IsHostShareable(type);
+    }
 
     /// @returns the validator for testing
     const Validator* GetValidatorForTesting() const { return &validator_; }
@@ -140,7 +142,7 @@
     sem::FunctionExpression* FunctionExpression(const ast::Expression* expr);
 
     /// @returns the resolved type from an expression, or nullptr on error
-    type::Type* Type(const ast::Expression* ast);
+    core::type::Type* Type(const ast::Expression* ast);
 
     /// @returns the call of Expression() cast to a
     /// sem::BuiltinEnumExpression<core::AddressSpace>. If the sem::Expression is not a
@@ -156,9 +158,10 @@
     sem::BuiltinEnumExpression<core::BuiltinValue>* BuiltinValueExpression(
         const ast::Expression* expr);
 
-    /// @returns the call of Expression() cast to a sem::BuiltinEnumExpression<type::TexelFormat>.
-    /// If the sem::Expression is not a sem::BuiltinEnumExpression<type::TexelFormat>, then an error
-    /// diagnostic is raised and nullptr is returned.
+    /// @returns the call of Expression() cast to a
+    /// sem::BuiltinEnumExpression<core::type::TexelFormat>. If the sem::Expression is not a
+    /// sem::BuiltinEnumExpression<core::type::TexelFormat>, then an error diagnostic is raised and
+    /// nullptr is returned.
     sem::BuiltinEnumExpression<core::TexelFormat>* TexelFormatExpression(
         const ast::Expression* expr);
 
@@ -241,7 +244,7 @@
     /// If `expr` is not of an abstract-numeric type, then Materialize() will just return `expr`.
     /// If `expr` is nullptr, then Materialize() will also return nullptr.
     const sem::ValueExpression* Materialize(const sem::ValueExpression* expr,
-                                            const type::Type* target_type = nullptr);
+                                            const core::type::Type* target_type = nullptr);
 
     /// For each argument in `args`:
     /// * Calls Materialize() passing the argument and the corresponding parameter type.
@@ -254,12 +257,12 @@
 
     /// @returns true if an argument of an abstract numeric type, passed to a parameter of type
     /// `parameter_ty` should be materialized.
-    bool ShouldMaterializeArgument(const type::Type* parameter_ty) const;
+    bool ShouldMaterializeArgument(const core::type::Type* parameter_ty) const;
 
     /// Converts `c` to `target_ty`
     /// @returns true on success, false on failure.
     bool Convert(const core::constant::Value*& c,
-                 const type::Type* target_ty,
+                 const core::type::Type* target_ty,
                  const Source& source);
 
     /// Transforms `args` to a vector of constants, and converts each constant to the call target's
@@ -276,9 +279,9 @@
     /// @param source the source of the expression requiring materialization
     /// @returns the concrete (materialized) type for the given type, or nullptr if the type is
     ///          already concrete.
-    const type::Type* ConcreteType(const type::Type* ty,
-                                   const type::Type* target_ty,
-                                   const Source& source);
+    const core::type::Type* ConcreteType(const core::type::Type* ty,
+                                         const core::type::Type* target_ty,
+                                         const Source& source);
 
     // Statement resolving methods
     // Each return true on success, false on failure.
@@ -287,7 +290,7 @@
     sem::Statement* BreakStatement(const ast::BreakStatement*);
     sem::Statement* BreakIfStatement(const ast::BreakIfStatement*);
     sem::Statement* CallStatement(const ast::CallStatement*);
-    sem::CaseStatement* CaseStatement(const ast::CaseStatement*, const type::Type*);
+    sem::CaseStatement* CaseStatement(const ast::CaseStatement*, const core::type::Type*);
     sem::Statement* CompoundAssignmentStatement(const ast::CompoundAssignmentStatement*);
     sem::Statement* ContinueStatement(const ast::ContinueStatement*);
     sem::Statement* ConstAssert(const ast::ConstAssert*);
@@ -378,12 +381,12 @@
 
     /// @param named_type the named type to resolve
     /// @returns the resolved semantic type
-    type::Type* TypeDecl(const ast::TypeDecl* named_type);
+    core::type::Type* TypeDecl(const ast::TypeDecl* named_type);
 
     /// Resolves and validates the expression used as the count parameter of an array.
     /// @param count_expr the expression used as the second template parameter to an array<>.
     /// @returns the number of elements in the array.
-    const type::ArrayCount* ArrayCount(const ast::Expression* count_expr);
+    const core::type::ArrayCount* ArrayCount(const ast::Expression* count_expr);
 
     /// Resolves and validates the attributes on an array.
     /// @param attributes the attributes on the array type.
@@ -391,7 +394,7 @@
     /// @param explicit_stride assigned the specified stride of the array in bytes.
     /// @returns true on success, false on failure
     bool ArrayAttributes(VectorRef<const ast::Attribute*> attributes,
-                         const type::Type* el_ty,
+                         const core::type::Type* el_ty,
                          uint32_t& explicit_stride);
 
     /// Builds and returns the semantic information for an array.
@@ -404,18 +407,18 @@
     /// @param el_ty the Array element type
     /// @param el_count the number of elements in the array.
     /// @param explicit_stride the explicit byte stride of the array. Zero means implicit stride.
-    type::Array* Array(const Source& array_source,
-                       const Source& el_source,
-                       const Source& count_source,
-                       const type::Type* el_ty,
-                       const type::ArrayCount* el_count,
-                       uint32_t explicit_stride);
+    core::type::Array* Array(const Source& array_source,
+                             const Source& el_source,
+                             const Source& count_source,
+                             const core::type::Type* el_ty,
+                             const core::type::ArrayCount* el_count,
+                             uint32_t explicit_stride);
 
     /// Builds and returns the semantic information for the alias `alias`.
     /// This method does not mark the ast::Alias node, nor attach the generated
     /// semantic information to the AST node.
     /// @returns the aliased type, or nullptr if an error is raised.
-    type::Type* Alias(const ast::Alias* alias);
+    core::type::Type* Alias(const ast::Alias* alias);
 
     /// Builds and returns the semantic information for the structure `str`.
     /// This method does not mark the ast::Struct node, nor attach the generated
@@ -482,7 +485,9 @@
     /// given type and address space. Used for generating sensible error
     /// messages.
     /// @returns true on success, false on error
-    bool ApplyAddressSpaceUsageToType(core::AddressSpace sc, type::Type* ty, const Source& usage);
+    bool ApplyAddressSpaceUsageToType(core::AddressSpace sc,
+                                      core::type::Type* ty,
+                                      const Source& usage);
 
     /// @param address_space the address space
     /// @returns the default access control for the given address space
@@ -551,24 +556,25 @@
     /// Adds the given note message to the diagnostics
     void AddNote(const std::string& msg, const Source& source) const;
 
-    /// @returns the type::Type for the builtin type @p builtin_ty with the identifier @p ident
+    /// @returns the core::type::Type for the builtin type @p builtin_ty with the identifier @p
+    /// ident
     /// @note: Will raise an ICE if @p symbol is not a builtin type.
-    type::Type* BuiltinType(core::Builtin builtin_ty, const ast::Identifier* ident);
+    core::type::Type* BuiltinType(core::Builtin builtin_ty, const ast::Identifier* ident);
 
     /// @returns the nesting depth of @ty as defined in
     /// https://gpuweb.github.io/gpuweb/wgsl/#composite-types
-    size_t NestDepth(const type::Type* ty) const;
+    size_t NestDepth(const core::type::Type* ty) const;
 
     // ArrayConstructorSig represents a unique array constructor signature.
     // It is a tuple of the array type, number of arguments provided and earliest evaluation stage.
-    using ArrayConstructorSig =
-        tint::UnorderedKeyWrapper<std::tuple<const type::Array*, size_t, core::EvaluationStage>>;
+    using ArrayConstructorSig = tint::UnorderedKeyWrapper<
+        std::tuple<const core::type::Array*, size_t, core::EvaluationStage>>;
 
     // StructConstructorSig represents a unique structure constructor signature.
     // It is a tuple of the structure type, number of arguments provided and earliest evaluation
     // stage.
-    using StructConstructorSig =
-        tint::UnorderedKeyWrapper<std::tuple<const type::Struct*, size_t, core::EvaluationStage>>;
+    using StructConstructorSig = tint::UnorderedKeyWrapper<
+        std::tuple<const core::type::Struct*, size_t, core::EvaluationStage>>;
 
     /// ExprEvalStageConstraint describes a constraint on when expressions can be evaluated.
     struct ExprEvalStageConstraint {
@@ -612,7 +618,7 @@
     Validator validator_;
     core::Extensions enabled_extensions_;
     Vector<sem::Function*, 8> entry_points_;
-    Hashmap<const type::Type*, const Source*, 8> atomic_composite_info_;
+    Hashmap<const core::type::Type*, const Source*, 8> atomic_composite_info_;
     tint::Bitset<0> marked_;
     ExprEvalStageConstraint expr_eval_stage_constraint_;
     std::unordered_map<const sem::Function*, AliasAnalysisInfo> alias_analysis_infos_;
@@ -628,7 +634,7 @@
     Hashmap<const ast::Expression*, const ast::BinaryExpression*, 8> logical_binary_lhs_to_parent_;
     Hashset<const ast::Expression*, 8> skip_const_eval_;
     IdentifierResolveHint identifier_resolve_hint_;
-    Hashmap<const type::Type*, size_t, 8> nest_depth_;
+    Hashmap<const core::type::Type*, size_t, 8> nest_depth_;
     Hashmap<std::pair<core::intrinsic::Table::Overload, core::Function>, sem::Builtin*, 64>
         builtins_;
     Hashmap<core::intrinsic::Table::Overload, sem::ValueConstructor*, 16> constructors_;
diff --git a/src/tint/lang/wgsl/resolver/resolver_helper_test.h b/src/tint/lang/wgsl/resolver/resolver_helper_test.h
index ec5bce6..9ed8395 100644
--- a/src/tint/lang/wgsl/resolver/resolver_helper_test.h
+++ b/src/tint/lang/wgsl/resolver/resolver_helper_test.h
@@ -116,7 +116,7 @@
     /// @param type a type
     /// @returns the name for `type` that closely resembles how it would be
     /// declared in WGSL.
-    std::string FriendlyName(const type::Type* type) { return type->FriendlyName(); }
+    std::string FriendlyName(const core::type::Type* type) { return type->FriendlyName(); }
 
   private:
     std::unique_ptr<Resolver> resolver_;
@@ -153,7 +153,7 @@
 using ast_type_func_ptr = ast::Type (*)(ProgramBuilder& b);
 using ast_expr_func_ptr = const ast::Expression* (*)(ProgramBuilder& b, VectorRef<Scalar> args);
 using ast_expr_from_double_func_ptr = const ast::Expression* (*)(ProgramBuilder& b, double v);
-using sem_type_func_ptr = const type::Type* (*)(ProgramBuilder& b);
+using sem_type_func_ptr = const core::type::Type* (*)(ProgramBuilder& b);
 using type_name_func_ptr = std::string (*)();
 
 struct UnspecializedElementType {};
@@ -174,7 +174,7 @@
     /// @return nullptr
     static inline ast::Type AST(ProgramBuilder&) { return {}; }
     /// @return nullptr
-    static inline const type::Type* Sem(ProgramBuilder&) { return nullptr; }
+    static inline const core::type::Type* Sem(ProgramBuilder&) { return nullptr; }
 };
 
 /// Helper for building bool types and expressions
@@ -191,7 +191,9 @@
     static inline 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<type::Bool>(); }
+    static inline const core::type::Type* Sem(ProgramBuilder& b) {
+        return b.create<core::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
@@ -222,7 +224,9 @@
     static inline 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<type::I32>(); }
+    static inline const core::type::Type* Sem(ProgramBuilder& b) {
+        return b.create<core::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
@@ -253,7 +257,9 @@
     static inline 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<type::U32>(); }
+    static inline const core::type::Type* Sem(ProgramBuilder& b) {
+        return b.create<core::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
@@ -284,7 +290,9 @@
     static inline 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<type::F32>(); }
+    static inline const core::type::Type* Sem(ProgramBuilder& b) {
+        return b.create<core::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
@@ -315,7 +323,9 @@
     static inline 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<type::F16>(); }
+    static inline const core::type::Type* Sem(ProgramBuilder& b) {
+        return b.create<core::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
@@ -345,8 +355,8 @@
     static inline ast::Type AST(ProgramBuilder&) { return {}; }
     /// @param b the ProgramBuilder
     /// @return the semantic abstract-float type
-    static inline const type::Type* Sem(ProgramBuilder& b) {
-        return b.create<type::AbstractFloat>();
+    static inline const core::type::Type* Sem(ProgramBuilder& b) {
+        return b.create<core::type::AbstractFloat>();
     }
     /// @param b the ProgramBuilder
     /// @param args args of size 1 with the abstract-float value to init with
@@ -377,7 +387,9 @@
     static inline ast::Type AST(ProgramBuilder&) { return {}; }
     /// @param b the ProgramBuilder
     /// @return the semantic abstract-int type
-    static inline const type::Type* Sem(ProgramBuilder& b) { return b.create<type::AbstractInt>(); }
+    static inline const core::type::Type* Sem(ProgramBuilder& b) {
+        return b.create<core::type::AbstractInt>();
+    }
     /// @param b the ProgramBuilder
     /// @param args args of size 1 with the abstract-int value to init with
     /// @return a new AST abstract-int literal value expression
@@ -414,8 +426,8 @@
     }
     /// @param b the ProgramBuilder
     /// @return the semantic vector type
-    static inline const type::Type* Sem(ProgramBuilder& b) {
-        return b.create<type::Vector>(DataType<T>::Sem(b), N);
+    static inline const core::type::Type* Sem(ProgramBuilder& b) {
+        return b.create<core::type::Vector>(DataType<T>::Sem(b), N);
     }
     /// @param b the ProgramBuilder
     /// @param args args of size 1 or N with values of type T to initialize with
@@ -466,9 +478,9 @@
     }
     /// @param b the ProgramBuilder
     /// @return the semantic matrix type
-    static inline const type::Type* Sem(ProgramBuilder& b) {
-        auto* column_type = b.create<type::Vector>(DataType<T>::Sem(b), M);
-        return b.create<type::Matrix>(column_type, N);
+    static inline const core::type::Type* Sem(ProgramBuilder& b) {
+        auto* column_type = b.create<core::type::Vector>(DataType<T>::Sem(b), M);
+        return b.create<core::type::Matrix>(column_type, N);
     }
     /// @param b the ProgramBuilder
     /// @param args args of size 1 or N*M with values of type T to initialize with
@@ -532,7 +544,7 @@
 
     /// @param b the ProgramBuilder
     /// @return the semantic aliased type
-    static inline const type::Type* Sem(ProgramBuilder& b) { return DataType<T>::Sem(b); }
+    static inline const core::type::Type* Sem(ProgramBuilder& b) { return DataType<T>::Sem(b); }
 
     /// @param b the ProgramBuilder
     /// @param args the value nested elements will be initialized with
@@ -585,9 +597,9 @@
 
     /// @param b the ProgramBuilder
     /// @return the semantic aliased type
-    static inline const type::Type* Sem(ProgramBuilder& b) {
-        return b.create<type::Pointer>(core::AddressSpace::kPrivate, DataType<T>::Sem(b),
-                                       core::Access::kReadWrite);
+    static inline const core::type::Type* Sem(ProgramBuilder& b) {
+        return b.create<core::type::Pointer>(core::AddressSpace::kPrivate, DataType<T>::Sem(b),
+                                             core::Access::kReadWrite);
     }
 
     /// @param b the ProgramBuilder
@@ -628,15 +640,15 @@
     }
     /// @param b the ProgramBuilder
     /// @return the semantic array type
-    static inline const type::Type* Sem(ProgramBuilder& b) {
+    static inline const core::type::Type* Sem(ProgramBuilder& b) {
         auto* el = DataType<T>::Sem(b);
-        const type::ArrayCount* count = nullptr;
+        const core::type::ArrayCount* count = nullptr;
         if (N == 0) {
-            count = b.create<type::RuntimeArrayCount>();
+            count = b.create<core::type::RuntimeArrayCount>();
         } else {
-            count = b.create<type::ConstantArrayCount>(N);
+            count = b.create<core::type::ConstantArrayCount>(N);
         }
-        return b.create<type::Array>(
+        return b.create<core::type::Array>(
             /* element */ el,
             /* count */ count,
             /* align */ el->Align(),
diff --git a/src/tint/lang/wgsl/resolver/resolver_test.cc b/src/tint/lang/wgsl/resolver/resolver_test.cc
index 2e5ef7d..10c36ba 100644
--- a/src/tint/lang/wgsl/resolver/resolver_test.cc
+++ b/src/tint/lang/wgsl/resolver/resolver_test.cc
@@ -83,8 +83,8 @@
     ASSERT_NE(TypeOf(lhs), nullptr);
     ASSERT_NE(TypeOf(rhs), nullptr);
 
-    EXPECT_TRUE(TypeOf(lhs)->UnwrapRef()->Is<type::F32>());
-    EXPECT_TRUE(TypeOf(rhs)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(lhs)->UnwrapRef()->Is<core::type::F32>());
+    EXPECT_TRUE(TypeOf(rhs)->Is<core::type::F32>());
     EXPECT_EQ(StmtOf(lhs), assign);
     EXPECT_EQ(StmtOf(rhs), assign);
 }
@@ -107,8 +107,8 @@
 
     ASSERT_NE(TypeOf(lhs), nullptr);
     ASSERT_NE(TypeOf(rhs), nullptr);
-    EXPECT_TRUE(TypeOf(lhs)->UnwrapRef()->Is<type::F32>());
-    EXPECT_TRUE(TypeOf(rhs)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(lhs)->UnwrapRef()->Is<core::type::F32>());
+    EXPECT_TRUE(TypeOf(rhs)->Is<core::type::F32>());
     EXPECT_EQ(StmtOf(lhs), assign);
     EXPECT_EQ(StmtOf(rhs), assign);
     EXPECT_EQ(BlockOf(assign), block);
@@ -140,8 +140,8 @@
 
     ASSERT_NE(TypeOf(lhs), nullptr);
     ASSERT_NE(TypeOf(rhs), nullptr);
-    EXPECT_TRUE(TypeOf(lhs)->UnwrapRef()->Is<type::F32>());
-    EXPECT_TRUE(TypeOf(rhs)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(lhs)->UnwrapRef()->Is<core::type::F32>());
+    EXPECT_TRUE(TypeOf(rhs)->Is<core::type::F32>());
     EXPECT_EQ(StmtOf(lhs), assign);
     EXPECT_EQ(StmtOf(rhs), assign);
     EXPECT_EQ(BlockOf(lhs), block);
@@ -175,11 +175,11 @@
     ASSERT_NE(TypeOf(else_rhs), nullptr);
     ASSERT_NE(TypeOf(lhs), nullptr);
     ASSERT_NE(TypeOf(rhs), nullptr);
-    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_TRUE(TypeOf(stmt->condition)->Is<core::type::Bool>());
+    EXPECT_TRUE(TypeOf(else_lhs)->UnwrapRef()->Is<core::type::F32>());
+    EXPECT_TRUE(TypeOf(else_rhs)->Is<core::type::F32>());
+    EXPECT_TRUE(TypeOf(lhs)->UnwrapRef()->Is<core::type::F32>());
+    EXPECT_TRUE(TypeOf(rhs)->Is<core::type::F32>());
     EXPECT_EQ(StmtOf(lhs), assign);
     EXPECT_EQ(StmtOf(rhs), assign);
     EXPECT_EQ(StmtOf(cond), stmt);
@@ -210,10 +210,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<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_TRUE(TypeOf(body_lhs)->UnwrapRef()->Is<core::type::F32>());
+    EXPECT_TRUE(TypeOf(body_rhs)->Is<core::type::F32>());
+    EXPECT_TRUE(TypeOf(continuing_lhs)->UnwrapRef()->Is<core::type::F32>());
+    EXPECT_TRUE(TypeOf(continuing_rhs)->Is<core::type::F32>());
     EXPECT_EQ(BlockOf(body_lhs), body);
     EXPECT_EQ(BlockOf(body_rhs), body);
     EXPECT_EQ(BlockOf(continuing_lhs), continuing);
@@ -230,7 +230,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(cond), nullptr);
-    EXPECT_TRUE(TypeOf(cond)->Is<type::I32>());
+    EXPECT_TRUE(TypeOf(cond)->Is<core::type::I32>());
 }
 
 TEST_F(ResolverTest, Stmt_Return_WithoutValue) {
@@ -254,9 +254,9 @@
     ASSERT_NE(TypeOf(lhs), nullptr);
     ASSERT_NE(TypeOf(rhs), nullptr);
 
-    EXPECT_TRUE(TypeOf(stmt->condition)->Is<type::I32>());
-    EXPECT_TRUE(TypeOf(lhs)->UnwrapRef()->Is<type::F32>());
-    EXPECT_TRUE(TypeOf(rhs)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(stmt->condition)->Is<core::type::I32>());
+    EXPECT_TRUE(TypeOf(lhs)->UnwrapRef()->Is<core::type::F32>());
+    EXPECT_TRUE(TypeOf(rhs)->Is<core::type::F32>());
     EXPECT_EQ(BlockOf(lhs), case_block);
     EXPECT_EQ(BlockOf(rhs), case_block);
 }
@@ -275,7 +275,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    EXPECT_TRUE(TypeOf(expr)->Is<type::Void>());
+    EXPECT_TRUE(TypeOf(expr)->Is<core::type::Void>());
     EXPECT_EQ(StmtOf(expr), call);
 }
 
@@ -289,7 +289,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(init), nullptr);
-    EXPECT_TRUE(TypeOf(init)->Is<type::I32>());
+    EXPECT_TRUE(TypeOf(init)->Is<core::type::I32>());
 }
 
 TEST_F(ResolverTest, Stmt_VariableDecl_Alias) {
@@ -303,7 +303,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(init), nullptr);
-    EXPECT_TRUE(TypeOf(init)->Is<type::I32>());
+    EXPECT_TRUE(TypeOf(init)->Is<core::type::I32>());
 }
 
 TEST_F(ResolverTest, Stmt_VariableDecl_ModuleScope) {
@@ -313,7 +313,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(init), nullptr);
-    EXPECT_TRUE(TypeOf(init)->Is<type::I32>());
+    EXPECT_TRUE(TypeOf(init)->Is<core::type::I32>());
     EXPECT_EQ(StmtOf(init), nullptr);
 }
 
@@ -353,13 +353,13 @@
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
     ASSERT_NE(TypeOf(foo_i32_init), nullptr);
-    EXPECT_TRUE(TypeOf(foo_i32_init)->Is<type::I32>());
+    EXPECT_TRUE(TypeOf(foo_i32_init)->Is<core::type::I32>());
     ASSERT_NE(TypeOf(foo_f32_init), nullptr);
-    EXPECT_TRUE(TypeOf(foo_f32_init)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(foo_f32_init)->Is<core::type::F32>());
     ASSERT_NE(TypeOf(bar_i32_init), nullptr);
-    EXPECT_TRUE(TypeOf(bar_i32_init)->UnwrapRef()->Is<type::I32>());
+    EXPECT_TRUE(TypeOf(bar_i32_init)->UnwrapRef()->Is<core::type::I32>());
     ASSERT_NE(TypeOf(bar_f32_init), nullptr);
-    EXPECT_TRUE(TypeOf(bar_f32_init)->UnwrapRef()->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(bar_f32_init)->UnwrapRef()->Is<core::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);
@@ -400,11 +400,11 @@
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
     ASSERT_NE(TypeOf(mod_init), nullptr);
-    EXPECT_TRUE(TypeOf(mod_init)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(mod_init)->Is<core::type::F32>());
     ASSERT_NE(TypeOf(fn_i32_init), nullptr);
-    EXPECT_TRUE(TypeOf(fn_i32_init)->Is<type::I32>());
+    EXPECT_TRUE(TypeOf(fn_i32_init)->Is<core::type::I32>());
     ASSERT_NE(TypeOf(fn_f32_init), nullptr);
-    EXPECT_TRUE(TypeOf(fn_f32_init)->UnwrapRef()->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(fn_f32_init)->UnwrapRef()->Is<core::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);
@@ -421,10 +421,10 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(a), nullptr);
-    auto* ref = TypeOf(a)->As<type::Reference>();
+    auto* ref = TypeOf(a)->As<core::type::Reference>();
     ASSERT_NE(ref, nullptr);
-    auto* ary = ref->StoreType()->As<type::Array>();
-    EXPECT_EQ(ary->Count(), create<type::ConstantArrayCount>(10u));
+    auto* ary = ref->StoreType()->As<core::type::Array>();
+    EXPECT_EQ(ary->Count(), create<core::type::ConstantArrayCount>(10u));
 }
 
 TEST_F(ResolverTest, ArraySize_SignedLiteral) {
@@ -434,10 +434,10 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(a), nullptr);
-    auto* ref = TypeOf(a)->As<type::Reference>();
+    auto* ref = TypeOf(a)->As<core::type::Reference>();
     ASSERT_NE(ref, nullptr);
-    auto* ary = ref->StoreType()->As<type::Array>();
-    EXPECT_EQ(ary->Count(), create<type::ConstantArrayCount>(10u));
+    auto* ary = ref->StoreType()->As<core::type::Array>();
+    EXPECT_EQ(ary->Count(), create<core::type::ConstantArrayCount>(10u));
 }
 
 TEST_F(ResolverTest, ArraySize_UnsignedConst) {
@@ -449,10 +449,10 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(a), nullptr);
-    auto* ref = TypeOf(a)->As<type::Reference>();
+    auto* ref = TypeOf(a)->As<core::type::Reference>();
     ASSERT_NE(ref, nullptr);
-    auto* ary = ref->StoreType()->As<type::Array>();
-    EXPECT_EQ(ary->Count(), create<type::ConstantArrayCount>(10u));
+    auto* ary = ref->StoreType()->As<core::type::Array>();
+    EXPECT_EQ(ary->Count(), create<core::type::ConstantArrayCount>(10u));
 }
 
 TEST_F(ResolverTest, ArraySize_SignedConst) {
@@ -464,10 +464,10 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(a), nullptr);
-    auto* ref = TypeOf(a)->As<type::Reference>();
+    auto* ref = TypeOf(a)->As<core::type::Reference>();
     ASSERT_NE(ref, nullptr);
-    auto* ary = ref->StoreType()->As<type::Array>();
-    EXPECT_EQ(ary->Count(), create<type::ConstantArrayCount>(10u));
+    auto* ary = ref->StoreType()->As<core::type::Array>();
+    EXPECT_EQ(ary->Count(), create<core::type::ConstantArrayCount>(10u));
 }
 
 TEST_F(ResolverTest, ArraySize_NamedOverride) {
@@ -479,9 +479,9 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(a), nullptr);
-    auto* ref = TypeOf(a)->As<type::Reference>();
+    auto* ref = TypeOf(a)->As<core::type::Reference>();
     ASSERT_NE(ref, nullptr);
-    auto* ary = ref->StoreType()->As<type::Array>();
+    auto* ary = ref->StoreType()->As<core::type::Array>();
     auto* sem_override = Sem().Get(override);
     ASSERT_NE(sem_override, nullptr);
     EXPECT_EQ(ary->Count(), create<sem::NamedOverrideArrayCount>(sem_override));
@@ -498,14 +498,14 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(a), nullptr);
-    auto* ref_a = TypeOf(a)->As<type::Reference>();
+    auto* ref_a = TypeOf(a)->As<core::type::Reference>();
     ASSERT_NE(ref_a, nullptr);
-    auto* ary_a = ref_a->StoreType()->As<type::Array>();
+    auto* ary_a = ref_a->StoreType()->As<core::type::Array>();
 
     ASSERT_NE(TypeOf(b), nullptr);
-    auto* ref_b = TypeOf(b)->As<type::Reference>();
+    auto* ref_b = TypeOf(b)->As<core::type::Reference>();
     ASSERT_NE(ref_b, nullptr);
-    auto* ary_b = ref_b->StoreType()->As<type::Array>();
+    auto* ary_b = ref_b->StoreType()->As<core::type::Array>();
 
     auto* sem_override = Sem().Get(override);
     ASSERT_NE(sem_override, nullptr);
@@ -524,9 +524,9 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(a), nullptr);
-    auto* ref = TypeOf(a)->As<type::Reference>();
+    auto* ref = TypeOf(a)->As<core::type::Reference>();
     ASSERT_NE(ref, nullptr);
-    auto* ary = ref->StoreType()->As<type::Array>();
+    auto* ary = ref->StoreType()->As<core::type::Array>();
     auto* sem_override = Sem().Get(override);
     ASSERT_NE(sem_override, nullptr);
     EXPECT_EQ(ary->Count(), create<sem::UnnamedOverrideArrayCount>(Sem().Get(cnt)));
@@ -545,14 +545,14 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(a), nullptr);
-    auto* ref_a = TypeOf(a)->As<type::Reference>();
+    auto* ref_a = TypeOf(a)->As<core::type::Reference>();
     ASSERT_NE(ref_a, nullptr);
-    auto* ary_a = ref_a->StoreType()->As<type::Array>();
+    auto* ary_a = ref_a->StoreType()->As<core::type::Array>();
 
     ASSERT_NE(TypeOf(b), nullptr);
-    auto* ref_b = TypeOf(b)->As<type::Reference>();
+    auto* ref_b = TypeOf(b)->As<core::type::Reference>();
     ASSERT_NE(ref_b, nullptr);
-    auto* ary_b = ref_b->StoreType()->As<type::Array>();
+    auto* ary_b = ref_b->StoreType()->As<core::type::Array>();
 
     auto* sem_override = Sem().Get(override);
     ASSERT_NE(sem_override, nullptr);
@@ -570,7 +570,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(bitcast), nullptr);
-    EXPECT_TRUE(TypeOf(bitcast)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(bitcast)->Is<core::type::F32>());
 }
 
 TEST_F(ResolverTest, Expr_Call) {
@@ -582,7 +582,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(call)->Is<core::type::F32>());
 }
 
 TEST_F(ResolverTest, Expr_Call_InBinaryOp) {
@@ -594,7 +594,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    EXPECT_TRUE(TypeOf(expr)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(expr)->Is<core::type::F32>());
 }
 
 TEST_F(ResolverTest, Expr_Call_WithParams) {
@@ -611,7 +611,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(param), nullptr);
-    EXPECT_TRUE(TypeOf(param)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(param)->Is<core::type::F32>());
 }
 
 TEST_F(ResolverTest, Expr_Call_Builtin) {
@@ -621,7 +621,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(call)->Is<core::type::F32>());
 }
 
 TEST_F(ResolverTest, Expr_Cast) {
@@ -633,7 +633,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(cast), nullptr);
-    EXPECT_TRUE(TypeOf(cast)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(cast)->Is<core::type::F32>());
 }
 
 TEST_F(ResolverTest, Expr_Initializer_Scalar) {
@@ -643,7 +643,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(s), nullptr);
-    EXPECT_TRUE(TypeOf(s)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(s)->Is<core::type::F32>());
 }
 
 TEST_F(ResolverTest, Expr_Initializer_Type_Vec2) {
@@ -653,9 +653,9 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 2u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 2u);
 }
 
 TEST_F(ResolverTest, Expr_Initializer_Type_Vec3) {
@@ -665,9 +665,9 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 3u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 3u);
 }
 
 TEST_F(ResolverTest, Expr_Initializer_Type_Vec4) {
@@ -677,9 +677,9 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
 }
 
 TEST_F(ResolverTest, Expr_Identifier_GlobalVariable) {
@@ -691,7 +691,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(ident), nullptr);
-    EXPECT_TRUE(TypeOf(ident)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(ident)->Is<core::type::F32>());
     EXPECT_TRUE(CheckVarUsers(my_var, Vector{ident}));
     ASSERT_NE(VarOf(ident), nullptr);
     EXPECT_EQ(VarOf(ident)->Declaration(), my_var);
@@ -706,7 +706,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(ident), nullptr);
-    EXPECT_TRUE(TypeOf(ident)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(ident)->Is<core::type::F32>());
     EXPECT_TRUE(CheckVarUsers(my_var, Vector{ident}));
     ASSERT_NE(VarOf(ident), nullptr);
     EXPECT_EQ(VarOf(ident)->Declaration(), my_var);
@@ -726,7 +726,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(my_var_a), nullptr);
-    EXPECT_TRUE(TypeOf(my_var_a)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(my_var_a)->Is<core::type::F32>());
     EXPECT_EQ(StmtOf(my_var_a), decl);
     EXPECT_TRUE(CheckVarUsers(var, Vector{my_var_a}));
     ASSERT_NE(VarOf(my_var_a), nullptr);
@@ -767,11 +767,11 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(my_var_a), nullptr);
-    ASSERT_TRUE(TypeOf(my_var_a)->Is<type::Reference>());
-    EXPECT_TRUE(TypeOf(my_var_a)->UnwrapRef()->Is<type::F32>());
+    ASSERT_TRUE(TypeOf(my_var_a)->Is<core::type::Reference>());
+    EXPECT_TRUE(TypeOf(my_var_a)->UnwrapRef()->Is<core::type::F32>());
     EXPECT_EQ(StmtOf(my_var_a), assign);
     ASSERT_NE(TypeOf(my_var_b), nullptr);
-    EXPECT_TRUE(TypeOf(my_var_b)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(my_var_b)->Is<core::type::F32>());
     EXPECT_EQ(StmtOf(my_var_b), assign);
     EXPECT_TRUE(CheckVarUsers(var, Vector{my_var_a, my_var_b}));
     ASSERT_NE(VarOf(my_var_a), nullptr);
@@ -796,12 +796,12 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(v), nullptr);
-    ASSERT_TRUE(TypeOf(v)->Is<type::Reference>());
-    EXPECT_TRUE(TypeOf(v)->UnwrapRef()->Is<type::F32>());
+    ASSERT_TRUE(TypeOf(v)->Is<core::type::Reference>());
+    EXPECT_TRUE(TypeOf(v)->UnwrapRef()->Is<core::type::F32>());
     EXPECT_EQ(StmtOf(v), p_decl);
     ASSERT_NE(TypeOf(p), nullptr);
-    ASSERT_TRUE(TypeOf(p)->Is<type::Pointer>());
-    EXPECT_TRUE(TypeOf(p)->UnwrapPtr()->Is<type::F32>());
+    ASSERT_TRUE(TypeOf(p)->Is<core::type::Pointer>());
+    EXPECT_TRUE(TypeOf(p)->UnwrapPtr()->Is<core::type::F32>());
     EXPECT_EQ(StmtOf(p), assign);
 }
 
@@ -817,7 +817,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(call), nullptr);
-    EXPECT_TRUE(TypeOf(call)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(call)->Is<core::type::F32>());
 }
 
 TEST_F(ResolverTest, Expr_Identifier_Unknown) {
@@ -845,13 +845,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<type::F32>());
-    EXPECT_TRUE(func_sem->Parameters()[1]->Type()->Is<type::I32>());
-    EXPECT_TRUE(func_sem->Parameters()[2]->Type()->Is<type::U32>());
+    EXPECT_TRUE(func_sem->Parameters()[0]->Type()->Is<core::type::F32>());
+    EXPECT_TRUE(func_sem->Parameters()[1]->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(func_sem->Parameters()[2]->Type()->Is<core::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<type::Void>());
+    EXPECT_TRUE(func_sem->ReturnType()->Is<core::type::Void>());
 }
 
 TEST_F(ResolverTest, Function_Parameters_Locations) {
@@ -919,7 +919,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<type::Void>());
+    EXPECT_TRUE(func_sem->ReturnType()->Is<core::type::Void>());
 
     const auto& vars = func_sem->TransitivelyReferencedGlobals();
     ASSERT_EQ(vars.Length(), 3u);
@@ -1011,7 +1011,7 @@
     ASSERT_NE(func_sem, nullptr);
 
     EXPECT_EQ(func_sem->TransitivelyReferencedGlobals().Length(), 0u);
-    EXPECT_TRUE(func_sem->ReturnType()->Is<type::Void>());
+    EXPECT_TRUE(func_sem->ReturnType()->Is<core::type::Void>());
 }
 
 TEST_F(ResolverTest, Function_NotRegisterFunctionConstant) {
@@ -1026,7 +1026,7 @@
     ASSERT_NE(func_sem, nullptr);
 
     EXPECT_EQ(func_sem->TransitivelyReferencedGlobals().Length(), 0u);
-    EXPECT_TRUE(func_sem->ReturnType()->Is<type::Void>());
+    EXPECT_TRUE(func_sem->ReturnType()->Is<core::type::Void>());
 }
 
 TEST_F(ResolverTest, Function_NotRegisterFunctionParams) {
@@ -1037,7 +1037,7 @@
     ASSERT_NE(func_sem, nullptr);
 
     EXPECT_EQ(func_sem->TransitivelyReferencedGlobals().Length(), 0u);
-    EXPECT_TRUE(func_sem->ReturnType()->Is<type::Void>());
+    EXPECT_TRUE(func_sem->ReturnType()->Is<core::type::Void>());
 }
 
 TEST_F(ResolverTest, Function_CallSites) {
@@ -1239,10 +1239,10 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(mem), nullptr);
-    EXPECT_TRUE(TypeOf(mem)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(mem)->Is<core::type::F32>());
     auto* sma = Sem().Get(mem)->UnwrapLoad()->As<sem::StructMemberAccess>();
     ASSERT_NE(sma, nullptr);
-    EXPECT_TRUE(sma->Member()->Type()->Is<type::F32>());
+    EXPECT_TRUE(sma->Member()->Type()->Is<core::type::F32>());
     EXPECT_EQ(sma->Object()->Declaration(), mem->object);
     EXPECT_EQ(sma->Member()->Index(), 1u);
     EXPECT_EQ(sma->Member()->Name().Name(), "second_member");
@@ -1260,11 +1260,11 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(mem), nullptr);
-    EXPECT_TRUE(TypeOf(mem)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(mem)->Is<core::type::F32>());
     auto* sma = Sem().Get(mem)->UnwrapLoad()->As<sem::StructMemberAccess>();
     ASSERT_NE(sma, nullptr);
     EXPECT_EQ(sma->Object()->Declaration(), mem->object);
-    EXPECT_TRUE(sma->Member()->Type()->Is<type::F32>());
+    EXPECT_TRUE(sma->Member()->Type()->Is<core::type::F32>());
     EXPECT_EQ(sma->Member()->Index(), 1u);
 }
 
@@ -1277,9 +1277,9 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(mem), nullptr);
-    ASSERT_TRUE(TypeOf(mem)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(mem)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(mem)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(mem)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(mem)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(mem)->As<core::type::Vector>()->Width(), 4u);
     auto* sma = Sem().Get(mem)->As<sem::Swizzle>();
     ASSERT_NE(sma, nullptr);
     EXPECT_EQ(sma->Object()->Declaration(), mem->object);
@@ -1295,7 +1295,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(mem), nullptr);
-    ASSERT_TRUE(TypeOf(mem)->Is<type::F32>());
+    ASSERT_TRUE(TypeOf(mem)->Is<core::type::F32>());
     auto* sma = Sem().Get(mem)->UnwrapLoad()->As<sem::Swizzle>();
     ASSERT_NE(sma, nullptr);
     EXPECT_EQ(sma->Object()->Declaration(), mem->object);
@@ -1329,9 +1329,9 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(mem), nullptr);
-    ASSERT_TRUE(TypeOf(mem)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(mem)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(mem)->As<type::Vector>()->Width(), 2u);
+    ASSERT_TRUE(TypeOf(mem)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(mem)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(mem)->As<core::type::Vector>()->Width(), 2u);
     ASSERT_TRUE(Sem().Get(mem)->Is<sem::Swizzle>());
 }
 
@@ -1347,7 +1347,7 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    EXPECT_TRUE(TypeOf(expr)->Is<type::F32>());
+    EXPECT_TRUE(TypeOf(expr)->Is<core::type::F32>());
 }
 
 namespace ExprBinaryTest {
@@ -1747,18 +1747,18 @@
 
     ast::Type lhs_type;
     ast::Type rhs_type;
-    const type::Type* result_type = nullptr;
+    const core::type::Type* result_type = nullptr;
     bool is_valid_expr;
 
     if (vec_by_mat) {
         lhs_type = ty.vec<f32>(vec_size);
         rhs_type = ty.mat<f32>(mat_cols, mat_rows);
-        result_type = create<type::Vector>(create<type::F32>(), mat_cols);
+        result_type = create<core::type::Vector>(create<core::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<type::Vector>(create<type::F32>(), mat_rows);
+        result_type = create<core::type::Vector>(create<core::type::F32>(), mat_rows);
         is_valid_expr = vec_size == mat_cols;
     }
 
@@ -1795,9 +1795,9 @@
     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<type::F32>();
-    auto* col = create<type::Vector>(f32, lhs_mat_rows);
-    auto* result_type = create<type::Matrix>(col, rhs_mat_cols);
+    auto* f32 = create<core::type::F32>();
+    auto* col = create<core::type::Vector>(f32, lhs_mat_rows);
+    auto* result_type = create<core::type::Matrix>(col, rhs_mat_cols);
 
     GlobalVar("lhs", lhs_type, core::AddressSpace::kPrivate);
     GlobalVar("rhs", rhs_type, core::AddressSpace::kPrivate);
@@ -1840,15 +1840,15 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(der), nullptr);
-    ASSERT_TRUE(TypeOf(der)->Is<type::Vector>());
+    ASSERT_TRUE(TypeOf(der)->Is<core::type::Vector>());
     if (op == core::UnaryOp::kNot) {
-        EXPECT_TRUE(TypeOf(der)->As<type::Vector>()->type()->Is<type::Bool>());
+        EXPECT_TRUE(TypeOf(der)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
     } else if (op == core::UnaryOp::kNegation || op == core::UnaryOp::kComplement) {
-        EXPECT_TRUE(TypeOf(der)->As<type::Vector>()->type()->Is<type::I32>());
+        EXPECT_TRUE(TypeOf(der)->As<core::type::Vector>()->type()->Is<core::type::I32>());
     } else {
-        EXPECT_TRUE(TypeOf(der)->As<type::Vector>()->type()->Is<type::F32>());
+        EXPECT_TRUE(TypeOf(der)->As<core::type::Vector>()->type()->Is<core::type::F32>());
     }
-    EXPECT_EQ(TypeOf(der)->As<type::Vector>()->Width(), 4u);
+    EXPECT_EQ(TypeOf(der)->As<core::type::Vector>()->Width(), 4u);
 }
 INSTANTIATE_TEST_SUITE_P(ResolverTest,
                          UnaryOpExpressionTest,
@@ -1868,7 +1868,7 @@
 }
 
 TEST_F(ResolverTest, AddressSpace_SetForSampler) {
-    auto t = ty.sampler(type::SamplerKind::kSampler);
+    auto t = ty.sampler(core::type::SamplerKind::kSampler);
     auto* var = GlobalVar("var", t, Binding(0_a), Group(0_a));
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1877,7 +1877,7 @@
 }
 
 TEST_F(ResolverTest, AddressSpace_SetForTexture) {
-    auto t = ty.sampled_texture(type::TextureDimension::k1d, ty.f32());
+    auto t = ty.sampled_texture(core::type::TextureDimension::k1d, ty.f32());
     auto* var = GlobalVar("var", t, Binding(0_a), Group(0_a));
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1910,8 +1910,10 @@
 TEST_F(ResolverTest, BindingPoint_SetForResources) {
     // @group(1) @binding(2) var s1 : sampler;
     // @group(3) @binding(4) var s2 : sampler;
-    auto* s1 = GlobalVar(Sym(), ty.sampler(type::SamplerKind::kSampler), Group(1_a), Binding(2_a));
-    auto* s2 = GlobalVar(Sym(), ty.sampler(type::SamplerKind::kSampler), Group(3_a), Binding(4_a));
+    auto* s1 =
+        GlobalVar(Sym(), ty.sampler(core::type::SamplerKind::kSampler), Group(1_a), Binding(2_a));
+    auto* s2 =
+        GlobalVar(Sym(), ty.sampler(core::type::SamplerKind::kSampler), Group(3_a), Binding(4_a));
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 
@@ -2115,9 +2117,9 @@
 }
 
 TEST_F(ResolverTest, TextureSampler_TextureSample) {
-    GlobalVar("t", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Group(1_a),
+    GlobalVar("t", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()), Group(1_a),
               Binding(1_a));
-    GlobalVar("s", ty.sampler(type::SamplerKind::kSampler), Group(1_a), Binding(2_a));
+    GlobalVar("s", ty.sampler(core::type::SamplerKind::kSampler), Group(1_a), Binding(2_a));
 
     auto* call = Call("textureSample", "t", "s", Call<vec2<f32>>(1_f, 2_f));
     const ast::Function* f =
@@ -2134,9 +2136,9 @@
 }
 
 TEST_F(ResolverTest, TextureSampler_TextureSampleInFunction) {
-    GlobalVar("t", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Group(1_a),
+    GlobalVar("t", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()), Group(1_a),
               Binding(1_a));
-    GlobalVar("s", ty.sampler(type::SamplerKind::kSampler), Group(1_a), Binding(2_a));
+    GlobalVar("s", ty.sampler(core::type::SamplerKind::kSampler), Group(1_a), Binding(2_a));
 
     auto* inner_call = Assign(Phony(), Call("textureSample", "t", "s", Call<vec2<f32>>(1_f, 2_f)));
     const ast::Function* inner_func =
@@ -2160,9 +2162,9 @@
 }
 
 TEST_F(ResolverTest, TextureSampler_TextureSampleFunctionDiamondSameVariables) {
-    GlobalVar("t", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Group(1_a),
+    GlobalVar("t", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()), Group(1_a),
               Binding(1_a));
-    GlobalVar("s", ty.sampler(type::SamplerKind::kSampler), Group(1_a), Binding(2_a));
+    GlobalVar("s", ty.sampler(core::type::SamplerKind::kSampler), Group(1_a), Binding(2_a));
 
     auto* inner_call_1 =
         Assign(Phony(), Call("textureSample", "t", "s", Call<vec2<f32>>(1_f, 2_f)));
@@ -2197,11 +2199,11 @@
 }
 
 TEST_F(ResolverTest, TextureSampler_TextureSampleFunctionDiamondDifferentVariables) {
-    GlobalVar("t1", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Group(1_a),
+    GlobalVar("t1", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()), Group(1_a),
               Binding(1_a));
-    GlobalVar("t2", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Group(1_a),
+    GlobalVar("t2", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()), Group(1_a),
               Binding(2_a));
-    GlobalVar("s", ty.sampler(type::SamplerKind::kSampler), Group(1_a), Binding(3_a));
+    GlobalVar("s", ty.sampler(core::type::SamplerKind::kSampler), Group(1_a), Binding(3_a));
 
     auto* inner_call_1 =
         Assign(Phony(), Call("textureSample", "t1", "s", Call<vec2<f32>>(1_f, 2_f)));
@@ -2238,7 +2240,7 @@
 }
 
 TEST_F(ResolverTest, TextureSampler_TextureDimensions) {
-    GlobalVar("t", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Group(1_a),
+    GlobalVar("t", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()), Group(1_a),
               Binding(2_a));
 
     auto* call = Call("textureDimensions", "t");
@@ -2266,8 +2268,8 @@
     // fn helper(sl: ptr<function, sampler>, tl: ptr<function, texture_2d<f32>>) -> vec4<f32> {
     //     return textureSampleLevel(*tl, *sl, c, 0.0);
     // }
-    GlobalVar("s", ty.sampler(type::SamplerKind::kSampler), Group(0_a), Binding(0_a));
-    GlobalVar("t", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Group(0_a),
+    GlobalVar("s", ty.sampler(core::type::SamplerKind::kSampler), Group(0_a), Binding(0_a));
+    GlobalVar("t", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()), Group(0_a),
               Binding(1_a));
     GlobalVar("c", ty.vec2<f32>(), core::AddressSpace::kUniform, Group(0_a), Binding(2_a));
 
@@ -2284,9 +2286,9 @@
 
     Func("helper",
          Vector{
-             Param("sl", ty.ptr<function>(ty.sampler(type::SamplerKind::kSampler))),
-             Param("tl",
-                   ty.ptr<function>(ty.sampled_texture(type::TextureDimension::k2d, ty.f32()))),
+             Param("sl", ty.ptr<function>(ty.sampler(core::type::SamplerKind::kSampler))),
+             Param("tl", ty.ptr<function>(
+                             ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()))),
          },
          ty.vec4<f32>(),
          Vector{
diff --git a/src/tint/lang/wgsl/resolver/root_identifier_test.cc b/src/tint/lang/wgsl/resolver/root_identifier_test.cc
index a178c54..cae41a8 100644
--- a/src/tint/lang/wgsl/resolver/root_identifier_test.cc
+++ b/src/tint/lang/wgsl/resolver/root_identifier_test.cc
@@ -72,7 +72,7 @@
 }
 
 TEST_F(ResolverRootIdentifierTest, GlobalTextureVar) {
-    auto* a = GlobalVar("a", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()),
+    auto* a = GlobalVar("a", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()),
                         core::AddressSpace::kUndefined, Group(0_a), Binding(0_a));
     auto* expr = Expr(a);
     WrapInFunction(Call("textureDimensions", expr));
diff --git a/src/tint/lang/wgsl/resolver/sem_helper.cc b/src/tint/lang/wgsl/resolver/sem_helper.cc
index c31fb2e..ce4c0d6 100644
--- a/src/tint/lang/wgsl/resolver/sem_helper.cc
+++ b/src/tint/lang/wgsl/resolver/sem_helper.cc
@@ -27,17 +27,17 @@
 
 SemHelper::~SemHelper() = default;
 
-std::string SemHelper::TypeNameOf(const type::Type* ty) const {
+std::string SemHelper::TypeNameOf(const core::type::Type* ty) const {
     return RawTypeNameOf(ty->UnwrapRef());
 }
 
-std::string SemHelper::RawTypeNameOf(const type::Type* ty) const {
+std::string SemHelper::RawTypeNameOf(const core::type::Type* ty) const {
     return ty->FriendlyName();
 }
 
-type::Type* SemHelper::TypeOf(const ast::Expression* expr) const {
+core::type::Type* SemHelper::TypeOf(const ast::Expression* expr) const {
     auto* sem = GetVal(expr);
-    return sem ? const_cast<type::Type*>(sem->Type()) : nullptr;
+    return sem ? const_cast<core::type::Type*>(sem->Type()) : nullptr;
 }
 
 std::string SemHelper::Describe(const sem::Expression* expr) const {
diff --git a/src/tint/lang/wgsl/resolver/sem_helper.h b/src/tint/lang/wgsl/resolver/sem_helper.h
index 532f5dd..4dfbe64 100644
--- a/src/tint/lang/wgsl/resolver/sem_helper.h
+++ b/src/tint/lang/wgsl/resolver/sem_helper.h
@@ -137,8 +137,8 @@
 
     /// @param expr the semantic node
     /// @returns nullptr if @p expr is nullptr, or @p expr cast to
-    /// sem::BuiltinEnumExpression<type::TexelFormat> if the cast is successful, otherwise an error
-    /// diagnostic is raised.
+    /// sem::BuiltinEnumExpression<core::type::TexelFormat> if the cast is successful, otherwise an
+    /// error diagnostic is raised.
     sem::BuiltinEnumExpression<core::TexelFormat>* AsTexelFormat(sem::Expression* expr) const {
         if (TINT_LIKELY(expr)) {
             auto* enum_expr = expr->As<sem::BuiltinEnumExpression<core::TexelFormat>>();
@@ -199,15 +199,15 @@
 
     /// @returns the resolved type of the ast::Expression @p expr
     /// @param expr the expression
-    type::Type* TypeOf(const ast::Expression* expr) const;
+    core::type::Type* TypeOf(const ast::Expression* expr) const;
 
     /// @returns the type name of the given semantic type, unwrapping references.
     /// @param ty the type to look up
-    std::string TypeNameOf(const type::Type* ty) const;
+    std::string TypeNameOf(const core::type::Type* ty) const;
 
     /// @returns the type name of the given semantic type, without unwrapping references.
     /// @param ty the type to look up
-    std::string RawTypeNameOf(const type::Type* ty) const;
+    std::string RawTypeNameOf(const core::type::Type* ty) const;
 
     /// Raises an error diagnostic that the expression @p got was expected to be a
     /// sem::ValueExpression, but the expression evaluated to something different.
diff --git a/src/tint/lang/wgsl/resolver/side_effects_test.cc b/src/tint/lang/wgsl/resolver/side_effects_test.cc
index 8437c43..777896f 100644
--- a/src/tint/lang/wgsl/resolver/side_effects_test.cc
+++ b/src/tint/lang/wgsl/resolver/side_effects_test.cc
@@ -186,22 +186,22 @@
     GlobalVar("a", ty.atomic(ty.i32()), tint::core::AddressSpace::kStorage,
               tint::core::Access::kReadWrite, Group(0_a), Binding(AInt(next_binding++)));
     if (c.pipeline_stage != ast::PipelineStage::kCompute) {
-        GlobalVar("t2d", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Group(0_a),
-                  Binding(AInt(next_binding++)));
-        GlobalVar("tdepth2d", ty.depth_texture(type::TextureDimension::k2d), Group(0_a),
-                  Binding(AInt(next_binding++)));
-        GlobalVar("t2d_arr", ty.sampled_texture(type::TextureDimension::k2dArray, ty.f32()),
+        GlobalVar("t2d", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()),
                   Group(0_a), Binding(AInt(next_binding++)));
-        GlobalVar("t2d_multi", ty.multisampled_texture(type::TextureDimension::k2d, ty.f32()),
+        GlobalVar("tdepth2d", ty.depth_texture(core::type::TextureDimension::k2d), Group(0_a),
+                  Binding(AInt(next_binding++)));
+        GlobalVar("t2d_arr", ty.sampled_texture(core::type::TextureDimension::k2dArray, ty.f32()),
+                  Group(0_a), Binding(AInt(next_binding++)));
+        GlobalVar("t2d_multi", ty.multisampled_texture(core::type::TextureDimension::k2d, ty.f32()),
                   Group(0_a), Binding(AInt(next_binding++)));
         GlobalVar(
             "tstorage2d",
-            ty.storage_texture(type::TextureDimension::k2d, tint::core::TexelFormat::kR32Float,
-                               tint::core::Access::kWrite),
+            ty.storage_texture(core::type::TextureDimension::k2d,
+                               tint::core::TexelFormat::kR32Float, tint::core::Access::kWrite),
             Group(0_a), Binding(AInt(next_binding++)));
-        GlobalVar("s2d", ty.sampler(type::SamplerKind::kSampler), Group(0_a),
+        GlobalVar("s2d", ty.sampler(core::type::SamplerKind::kSampler), Group(0_a),
                   Binding(AInt(next_binding++)));
-        GlobalVar("scomp", ty.sampler(type::SamplerKind::kComparisonSampler), Group(0_a),
+        GlobalVar("scomp", ty.sampler(core::type::SamplerKind::kComparisonSampler), Group(0_a),
                   Binding(AInt(next_binding++)));
     }
 
diff --git a/src/tint/lang/wgsl/resolver/struct_address_space_use_test.cc b/src/tint/lang/wgsl/resolver/struct_address_space_use_test.cc
index f713466..d90b466 100644
--- a/src/tint/lang/wgsl/resolver/struct_address_space_use_test.cc
+++ b/src/tint/lang/wgsl/resolver/struct_address_space_use_test.cc
@@ -32,7 +32,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_TRUE(sem->AddressSpaceUsage().empty());
 }
@@ -44,7 +44,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_THAT(sem->AddressSpaceUsage(), UnorderedElementsAre(core::AddressSpace::kUndefined));
 }
@@ -56,7 +56,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_THAT(sem->AddressSpaceUsage(), UnorderedElementsAre(core::AddressSpace::kUndefined));
 }
@@ -68,7 +68,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_THAT(sem->AddressSpaceUsage(), UnorderedElementsAre(core::AddressSpace::kPrivate));
 }
@@ -80,7 +80,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_THAT(sem->AddressSpaceUsage(), UnorderedElementsAre(core::AddressSpace::kPrivate));
 }
@@ -92,7 +92,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_THAT(sem->AddressSpaceUsage(), UnorderedElementsAre(core::AddressSpace::kPrivate));
 }
@@ -104,7 +104,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_THAT(sem->AddressSpaceUsage(), UnorderedElementsAre(core::AddressSpace::kPrivate));
 }
@@ -116,7 +116,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_THAT(sem->AddressSpaceUsage(), UnorderedElementsAre(core::AddressSpace::kFunction));
 }
@@ -128,7 +128,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_THAT(sem->AddressSpaceUsage(), UnorderedElementsAre(core::AddressSpace::kFunction));
 }
@@ -140,7 +140,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_THAT(sem->AddressSpaceUsage(), UnorderedElementsAre(core::AddressSpace::kFunction));
 }
@@ -152,7 +152,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_THAT(sem->AddressSpaceUsage(), UnorderedElementsAre(core::AddressSpace::kFunction));
 }
@@ -166,7 +166,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_THAT(sem->AddressSpaceUsage(),
                 UnorderedElementsAre(core::AddressSpace::kUniform, core::AddressSpace::kStorage,
diff --git a/src/tint/lang/wgsl/resolver/struct_pipeline_stage_use_test.cc b/src/tint/lang/wgsl/resolver/struct_pipeline_stage_use_test.cc
index 8ef618b..d40b767 100644
--- a/src/tint/lang/wgsl/resolver/struct_pipeline_stage_use_test.cc
+++ b/src/tint/lang/wgsl/resolver/struct_pipeline_stage_use_test.cc
@@ -34,7 +34,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_TRUE(sem->PipelineStageUses().empty());
 }
@@ -46,7 +46,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_TRUE(sem->PipelineStageUses().empty());
 }
@@ -58,7 +58,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_TRUE(sem->PipelineStageUses().empty());
 }
@@ -72,10 +72,10 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_THAT(sem->PipelineStageUses(),
-                UnorderedElementsAre(type::PipelineStageUsage::kVertexInput));
+                UnorderedElementsAre(core::type::PipelineStageUsage::kVertexInput));
 }
 
 TEST_F(ResolverPipelineStageUseTest, StructUsedAsVertexShaderReturnType) {
@@ -87,10 +87,10 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_THAT(sem->PipelineStageUses(),
-                UnorderedElementsAre(type::PipelineStageUsage::kVertexOutput));
+                UnorderedElementsAre(core::type::PipelineStageUsage::kVertexOutput));
 }
 
 TEST_F(ResolverPipelineStageUseTest, StructUsedAsFragmentShaderParam) {
@@ -101,10 +101,10 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_THAT(sem->PipelineStageUses(),
-                UnorderedElementsAre(type::PipelineStageUsage::kFragmentInput));
+                UnorderedElementsAre(core::type::PipelineStageUsage::kFragmentInput));
 }
 
 TEST_F(ResolverPipelineStageUseTest, StructUsedAsFragmentShaderReturnType) {
@@ -115,10 +115,10 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_THAT(sem->PipelineStageUses(),
-                UnorderedElementsAre(type::PipelineStageUsage::kFragmentOutput));
+                UnorderedElementsAre(core::type::PipelineStageUsage::kFragmentOutput));
 }
 
 TEST_F(ResolverPipelineStageUseTest, StructUsedAsComputeShaderParam) {
@@ -131,10 +131,10 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_THAT(sem->PipelineStageUses(),
-                UnorderedElementsAre(type::PipelineStageUsage::kComputeInput));
+                UnorderedElementsAre(core::type::PipelineStageUsage::kComputeInput));
 }
 
 TEST_F(ResolverPipelineStageUseTest, StructUsedMultipleStages) {
@@ -149,11 +149,11 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_THAT(sem->PipelineStageUses(),
-                UnorderedElementsAre(type::PipelineStageUsage::kVertexOutput,
-                                     type::PipelineStageUsage::kFragmentInput));
+                UnorderedElementsAre(core::type::PipelineStageUsage::kVertexOutput,
+                                     core::type::PipelineStageUsage::kFragmentInput));
 }
 
 TEST_F(ResolverPipelineStageUseTest, StructUsedAsShaderParamViaAlias) {
@@ -165,10 +165,10 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_THAT(sem->PipelineStageUses(),
-                UnorderedElementsAre(type::PipelineStageUsage::kFragmentInput));
+                UnorderedElementsAre(core::type::PipelineStageUsage::kFragmentInput));
 }
 
 TEST_F(ResolverPipelineStageUseTest, StructUsedAsShaderParamLocationSet) {
@@ -179,7 +179,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     ASSERT_EQ(1u, sem->Members().Length());
     EXPECT_EQ(3u, sem->Members()[0]->Attributes().location);
@@ -194,10 +194,10 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     EXPECT_THAT(sem->PipelineStageUses(),
-                UnorderedElementsAre(type::PipelineStageUsage::kFragmentOutput));
+                UnorderedElementsAre(core::type::PipelineStageUsage::kFragmentOutput));
 }
 
 TEST_F(ResolverPipelineStageUseTest, StructUsedAsShaderReturnTypeLocationSet) {
@@ -208,7 +208,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    auto* sem = TypeOf(s)->As<type::Struct>();
+    auto* sem = TypeOf(s)->As<core::type::Struct>();
     ASSERT_NE(sem, nullptr);
     ASSERT_EQ(1u, sem->Members().Length());
     EXPECT_EQ(3u, sem->Members()[0]->Attributes().location);
diff --git a/src/tint/lang/wgsl/resolver/type_validation_test.cc b/src/tint/lang/wgsl/resolver/type_validation_test.cc
index da96651..0132b9b 100644
--- a/src/tint/lang/wgsl/resolver/type_validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/type_validation_test.cc
@@ -836,7 +836,7 @@
 }
 
 TEST_F(ResolverTypeValidationTest, ArrayOfNonStorableType) {
-    auto tex_ty = ty.sampled_texture(Source{{12, 34}}, type::TextureDimension::k2d, ty.f32());
+    auto tex_ty = ty.sampled_texture(Source{{12, 34}}, core::type::TextureDimension::k2d, ty.f32());
     GlobalVar("arr", ty.array(tex_ty, 4_i), core::AddressSpace::kPrivate);
 
     EXPECT_FALSE(r()->Resolve());
@@ -912,7 +912,7 @@
 
 namespace SampledTextureTests {
 
-using SampledTextureDimensionTest = ResolverTestWithParam<type::TextureDimension>;
+using SampledTextureDimensionTest = ResolverTestWithParam<core::type::TextureDimension>;
 TEST_P(SampledTextureDimensionTest, All) {
     auto& params = GetParam();
     GlobalVar(Source{{12, 34}}, "a", ty.sampled_texture(params, ty.i32()), Group(0_a),
@@ -923,14 +923,14 @@
 INSTANTIATE_TEST_SUITE_P(ResolverTypeValidationTest,
                          SampledTextureDimensionTest,
                          testing::Values(  //
-                             type::TextureDimension::k1d,
-                             type::TextureDimension::k2d,
-                             type::TextureDimension::k2dArray,
-                             type::TextureDimension::k3d,
-                             type::TextureDimension::kCube,
-                             type::TextureDimension::kCubeArray));
+                             core::type::TextureDimension::k1d,
+                             core::type::TextureDimension::k2d,
+                             core::type::TextureDimension::k2dArray,
+                             core::type::TextureDimension::k3d,
+                             core::type::TextureDimension::kCube,
+                             core::type::TextureDimension::kCubeArray));
 
-using MultisampledTextureDimensionTest = ResolverTestWithParam<type::TextureDimension>;
+using MultisampledTextureDimensionTest = ResolverTestWithParam<core::type::TextureDimension>;
 TEST_P(MultisampledTextureDimensionTest, All) {
     auto& params = GetParam();
     GlobalVar("a", ty.multisampled_texture(Source{{12, 34}}, params, ty.i32()), Group(0_a),
@@ -940,7 +940,7 @@
 }
 INSTANTIATE_TEST_SUITE_P(ResolverTypeValidationTest,
                          MultisampledTextureDimensionTest,
-                         testing::Values(type::TextureDimension::k2d));
+                         testing::Values(core::type::TextureDimension::k2d));
 
 struct TypeParams {
     builder::ast_type_func_ptr type_func;
@@ -978,10 +978,10 @@
 TEST_P(SampledTextureTypeTest, All) {
     auto& params = GetParam();
     Enable(core::Extension::kF16);
-    GlobalVar(
-        "a",
-        ty.sampled_texture(Source{{12, 34}}, type::TextureDimension::k2d, params.type_func(*this)),
-        Group(0_a), Binding(0_a));
+    GlobalVar("a",
+              ty.sampled_texture(Source{{12, 34}}, core::type::TextureDimension::k2d,
+                                 params.type_func(*this)),
+              Group(0_a), Binding(0_a));
 
     if (params.is_valid) {
         EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -999,7 +999,7 @@
     auto& params = GetParam();
     Enable(core::Extension::kF16);
     GlobalVar("a",
-              ty.multisampled_texture(Source{{12, 34}}, type::TextureDimension::k2d,
+              ty.multisampled_texture(Source{{12, 34}}, core::type::TextureDimension::k2d,
                                       params.type_func(*this)),
               Group(0_a), Binding(0_a));
 
@@ -1088,20 +1088,20 @@
     // @group(0) @binding(3)
     // var d : texture_storage_3d<*, write>;
 
-    auto st_a = ty.storage_texture(Source{{12, 34}}, type::TextureDimension::k1d, params.format,
-                                   core::Access::kWrite);
+    auto st_a = ty.storage_texture(Source{{12, 34}}, core::type::TextureDimension::k1d,
+                                   params.format, core::Access::kWrite);
     GlobalVar("a", st_a, Group(0_a), Binding(0_a));
 
     ast::Type st_b =
-        ty.storage_texture(type::TextureDimension::k2d, params.format, core::Access::kWrite);
+        ty.storage_texture(core::type::TextureDimension::k2d, params.format, core::Access::kWrite);
     GlobalVar("b", st_b, Group(0_a), Binding(1_a));
 
-    ast::Type st_c =
-        ty.storage_texture(type::TextureDimension::k2dArray, params.format, core::Access::kWrite);
+    ast::Type st_c = ty.storage_texture(core::type::TextureDimension::k2dArray, params.format,
+                                        core::Access::kWrite);
     GlobalVar("c", st_c, Group(0_a), Binding(2_a));
 
     ast::Type st_d =
-        ty.storage_texture(type::TextureDimension::k3d, params.format, core::Access::kWrite);
+        ty.storage_texture(core::type::TextureDimension::k3d, params.format, core::Access::kWrite);
     GlobalVar("d", st_d, Group(0_a), Binding(3_a));
 
     if (params.is_valid) {
@@ -1147,7 +1147,7 @@
     // @group(0) @binding(0)
     // var a : texture_storage_1d<r32uint, read_write>;
 
-    auto st = ty.storage_texture(Source{{12, 34}}, type::TextureDimension::k1d,
+    auto st = ty.storage_texture(Source{{12, 34}}, core::type::TextureDimension::k1d,
                                  core::TexelFormat::kR32Uint, core::Access::kReadWrite);
 
     GlobalVar("a", st, Group(0_a), Binding(0_a));
@@ -1161,7 +1161,7 @@
     // @group(0) @binding(0)
     // var a : texture_storage_1d<r32uint, read>;
 
-    auto st = ty.storage_texture(Source{{12, 34}}, type::TextureDimension::k1d,
+    auto st = ty.storage_texture(Source{{12, 34}}, core::type::TextureDimension::k1d,
                                  core::TexelFormat::kR32Uint, core::Access::kRead);
 
     GlobalVar("a", st, Group(0_a), Binding(0_a));
@@ -1175,7 +1175,7 @@
     // @group(0) @binding(0)
     // var a : texture_storage_1d<r32uint, write>;
 
-    auto st = ty.storage_texture(type::TextureDimension::k1d, core::TexelFormat::kR32Uint,
+    auto st = ty.storage_texture(core::type::TextureDimension::k1d, core::TexelFormat::kR32Uint,
                                  core::Access::kWrite);
 
     GlobalVar("a", st, Group(0_a), Binding(0_a));
diff --git a/src/tint/lang/wgsl/resolver/uniformity.cc b/src/tint/lang/wgsl/resolver/uniformity.cc
index ced3391..8ed869b 100644
--- a/src/tint/lang/wgsl/resolver/uniformity.cc
+++ b/src/tint/lang/wgsl/resolver/uniformity.cc
@@ -201,7 +201,7 @@
             parameters[i].sem = sem;
 
             parameters[i].value = CreateNode({"param_", param_name});
-            if (sem->Type()->Is<type::Pointer>()) {
+            if (sem->Type()->Is<core::type::Pointer>()) {
                 // Create extra nodes for a pointer parameter's initial contents and its contents
                 // when the function returns.
                 parameters[i].ptr_input_contents =
@@ -442,7 +442,7 @@
         auto get_param_tag = [&](UniqueVector<Node*, 4>& reachable, size_t index) {
             auto* param = sem_.Get(func->params[index]);
             auto& param_info = current_function_->parameters[index];
-            if (param->Type()->Is<type::Pointer>()) {
+            if (param->Type()->Is<core::type::Pointer>()) {
                 // For pointers, we distinguish between requiring uniformity of the contents versus
                 // the pointer itself.
                 if (reachable.Contains(param_info.ptr_input_contents)) {
@@ -1134,7 +1134,7 @@
                     node = v;
 
                     // Store if lhs is a partial pointer
-                    if (sem_var->Type()->Is<type::Pointer>()) {
+                    if (sem_var->Type()->Is<core::type::Pointer>()) {
                         auto* init = sem_.Get(decl->variable->initializer);
                         if (auto* unary_init = init->Declaration()->As<ast::UnaryOpExpression>()) {
                             auto* e = UnwrapIndirectAndAddressOfChain(unary_init);
@@ -1221,7 +1221,7 @@
                     node->AddEdge(cf);
 
                     auto* current_value = current_function_->variables.Get(param);
-                    if (param->Type()->Is<type::Pointer>()) {
+                    if (param->Type()->Is<core::type::Pointer>()) {
                         if (load_rule) {
                             // We are loading from the pointer, so add an edge to its contents.
                             node->AddEdge(current_value);
@@ -1254,7 +1254,7 @@
                 node->AddEdge(cf);
 
                 auto* local_value = current_function_->variables.Get(local);
-                if (local->Type()->Is<type::Pointer>()) {
+                if (local->Type()->Is<core::type::Pointer>()) {
                     if (load_rule) {
                         // We are loading from the pointer, so add an edge to its contents.
                         auto* root = var_user->RootIdentifier();
@@ -1276,7 +1276,7 @@
                         // the pointer value itself.
                         node->AddEdge(local_value);
                     }
-                } else if (local->Type()->Is<type::Reference>()) {
+                } else if (local->Type()->Is<core::type::Reference>()) {
                     if (load_rule) {
                         // We are loading from the reference, so add an edge to its contents.
                         node->AddEdge(local_value);
@@ -1505,7 +1505,7 @@
             // For pointer arguments, create an additional node to represent the contents of that
             // pointer prior to the function call.
             auto* sem_arg = sem_.GetVal(call->args[i]);
-            if (sem_arg->Type()->Is<type::Pointer>()) {
+            if (sem_arg->Type()->Is<core::type::Pointer>()) {
                 auto* arg_contents =
                     CreateNode({name, "_ptrarg_", std::to_string(i), "_contents"}, call);
                 arg_contents->type = Node::kFunctionCallArgumentContents;
@@ -1632,7 +1632,7 @@
                 // Capture the effects of other call parameters on the contents of this parameter
                 // after the call returns.
                 auto* sem_arg = sem_.GetVal(call->args[i]);
-                if (sem_arg->Type()->Is<type::Pointer>()) {
+                if (sem_arg->Type()->Is<core::type::Pointer>()) {
                     auto* ptr_result =
                         CreateNode({name, "_ptrarg_", std::to_string(i), "_result"}, call);
                     ptr_result->type = Node::kFunctionCallPointerArgumentResult;
diff --git a/src/tint/lang/wgsl/resolver/validation_test.cc b/src/tint/lang/wgsl/resolver/validation_test.cc
index a3355f8..75e9e80 100644
--- a/src/tint/lang/wgsl/resolver/validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/validation_test.cc
@@ -295,7 +295,7 @@
 }
 
 TEST_F(ResolverValidationTest, AddressSpace_SamplerExplicitAddressSpace) {
-    auto t = ty.sampler(type::SamplerKind::kSampler);
+    auto t = ty.sampler(core::type::SamplerKind::kSampler);
     GlobalVar(Source{{12, 34}}, "var", t, core::AddressSpace::kPrivate, Binding(0_a), Group(0_a));
 
     EXPECT_FALSE(r()->Resolve());
@@ -305,7 +305,7 @@
 }
 
 TEST_F(ResolverValidationTest, AddressSpace_TextureExplicitAddressSpace) {
-    auto t = ty.sampled_texture(type::TextureDimension::k1d, ty.f32());
+    auto t = ty.sampled_texture(core::type::TextureDimension::k1d, ty.f32());
     GlobalVar(Source{{12, 34}}, "var", t, core::AddressSpace::kFunction, Binding(0_a), Group(0_a));
 
     EXPECT_FALSE(r()->Resolve()) << r()->error();
diff --git a/src/tint/lang/wgsl/resolver/validator.cc b/src/tint/lang/wgsl/resolver/validator.cc
index c91d2fc..5e39cad 100644
--- a/src/tint/lang/wgsl/resolver/validator.cc
+++ b/src/tint/lang/wgsl/resolver/validator.cc
@@ -81,12 +81,12 @@
 constexpr size_t kMaxFunctionParameters = 255;
 constexpr size_t kMaxSwitchCaseSelectors = 16383;
 
-bool IsValidStorageTextureDimension(type::TextureDimension dim) {
+bool IsValidStorageTextureDimension(core::type::TextureDimension dim) {
     switch (dim) {
-        case type::TextureDimension::k1d:
-        case type::TextureDimension::k2d:
-        case type::TextureDimension::k2dArray:
-        case type::TextureDimension::k3d:
+        case core::type::TextureDimension::k1d:
+        case core::type::TextureDimension::k2d:
+        case core::type::TextureDimension::k2dArray:
+        case core::type::TextureDimension::k3d:
             return true;
         default:
             return false;
@@ -144,11 +144,12 @@
 
 }  // namespace
 
-Validator::Validator(ProgramBuilder* builder,
-                     SemHelper& sem,
-                     const core::Extensions& enabled_extensions,
-                     const Hashmap<const type::Type*, const Source*, 8>& atomic_composite_info,
-                     Hashset<TypeAndAddressSpace, 8>& valid_type_storage_layouts)
+Validator::Validator(
+    ProgramBuilder* builder,
+    SemHelper& sem,
+    const core::Extensions& enabled_extensions,
+    const Hashmap<const core::type::Type*, const Source*, 8>& atomic_composite_info,
+    Hashset<TypeAndAddressSpace, 8>& valid_type_storage_layouts)
     : symbols_(builder->Symbols()),
       diagnostics_(builder->Diagnostics()),
       sem_(sem),
@@ -195,23 +196,23 @@
 }
 
 // https://gpuweb.github.io/gpuweb/wgsl/#plain-types-section
-bool Validator::IsPlain(const type::Type* type) const {
-    return type->IsAnyOf<type::Scalar, type::Atomic, type::Vector, type::Matrix, type::Array,
-                         type::Struct>();
+bool Validator::IsPlain(const core::type::Type* type) const {
+    return type->IsAnyOf<core::type::Scalar, core::type::Atomic, core::type::Vector,
+                         core::type::Matrix, core::type::Array, core::type::Struct>();
 }
 
 // https://gpuweb.github.io/gpuweb/wgsl/#fixed-footprint-types
-bool Validator::IsFixedFootprint(const type::Type* type) const {
+bool Validator::IsFixedFootprint(const core::type::Type* type) const {
     return Switch(
-        type,                                       //
-        [&](const type::Vector*) { return true; },  //
-        [&](const type::Matrix*) { return true; },  //
-        [&](const type::Atomic*) { return true; },
-        [&](const type::Array* arr) {
-            return !arr->Count()->Is<type::RuntimeArrayCount>() &&
+        type,                                             //
+        [&](const core::type::Vector*) { return true; },  //
+        [&](const core::type::Matrix*) { return true; },  //
+        [&](const core::type::Atomic*) { return true; },
+        [&](const core::type::Array* arr) {
+            return !arr->Count()->Is<core::type::RuntimeArrayCount>() &&
                    IsFixedFootprint(arr->ElemType());
         },
-        [&](const type::Struct* str) {
+        [&](const core::type::Struct* str) {
             for (auto* member : str->Members()) {
                 if (!IsFixedFootprint(member->Type())) {
                     return false;
@@ -219,20 +220,20 @@
             }
             return true;
         },
-        [&](Default) { return type->Is<type::Scalar>(); });
+        [&](Default) { return type->Is<core::type::Scalar>(); });
 }
 
 // https://gpuweb.github.io/gpuweb/wgsl.html#host-shareable-types
-bool Validator::IsHostShareable(const type::Type* type) const {
-    if (type->IsAnyOf<type::I32, type::U32, type::F32, type::F16>()) {
+bool Validator::IsHostShareable(const core::type::Type* type) const {
+    if (type->IsAnyOf<core::type::I32, core::type::U32, core::type::F32, core::type::F16>()) {
         return true;
     }
     return Switch(
         type,  //
-        [&](const type::Vector* vec) { return IsHostShareable(vec->type()); },
-        [&](const type::Matrix* mat) { return IsHostShareable(mat->type()); },
-        [&](const type::Array* arr) { return IsHostShareable(arr->ElemType()); },
-        [&](const type::Struct* str) {
+        [&](const core::type::Vector* vec) { return IsHostShareable(vec->type()); },
+        [&](const core::type::Matrix* mat) { return IsHostShareable(mat->type()); },
+        [&](const core::type::Array* arr) { return IsHostShareable(arr->ElemType()); },
+        [&](const core::type::Struct* str) {
             for (auto* member : str->Members()) {
                 if (!IsHostShareable(member->Type())) {
                     return false;
@@ -240,12 +241,12 @@
             }
             return true;
         },
-        [&](const type::Atomic* atomic) { return IsHostShareable(atomic->Type()); });
+        [&](const core::type::Atomic* atomic) { return IsHostShareable(atomic->Type()); });
 }
 
 // https://gpuweb.github.io/gpuweb/wgsl.html#storable-types
-bool Validator::IsStorable(const type::Type* type) const {
-    return IsPlain(type) || type->IsAnyOf<type::Texture, type::Sampler>();
+bool Validator::IsStorable(const core::type::Type* type) const {
+    return IsPlain(type) || type->IsAnyOf<core::type::Texture, core::type::Sampler>();
 }
 
 const ast::Statement* Validator::ClosestContinuing(bool stop_at_loop,
@@ -274,17 +275,17 @@
     return nullptr;
 }
 
-bool Validator::Atomic(const ast::TemplatedIdentifier* a, const type::Atomic* s) const {
+bool Validator::Atomic(const ast::TemplatedIdentifier* a, const core::type::Atomic* s) const {
     // https://gpuweb.github.io/gpuweb/wgsl/#atomic-types
     // T must be either u32 or i32.
-    if (!s->Type()->IsAnyOf<type::U32, type::I32>()) {
+    if (!s->Type()->IsAnyOf<core::type::U32, core::type::I32>()) {
         AddError("atomic only supports i32 or u32 types", a->arguments[0]->source);
         return false;
     }
     return true;
 }
 
-bool Validator::Pointer(const ast::TemplatedIdentifier* a, const type::Pointer* s) const {
+bool Validator::Pointer(const ast::TemplatedIdentifier* a, const core::type::Pointer* s) const {
     if (s->AddressSpace() == core::AddressSpace::kUndefined) {
         AddError("ptr missing address space", a->source);
         return false;
@@ -306,7 +307,7 @@
                                        a->source);
 }
 
-bool Validator::StorageTexture(const type::StorageTexture* t, const Source& source) const {
+bool Validator::StorageTexture(const core::type::StorageTexture* t, const Source& source) const {
     switch (t->access()) {
         case core::Access::kWrite:
             break;
@@ -333,8 +334,8 @@
     return true;
 }
 
-bool Validator::SampledTexture(const type::SampledTexture* t, const Source& source) const {
-    if (!t->type()->UnwrapRef()->IsAnyOf<type::F32, type::I32, type::U32>()) {
+bool Validator::SampledTexture(const core::type::SampledTexture* t, const Source& source) const {
+    if (!t->type()->UnwrapRef()->IsAnyOf<core::type::F32, core::type::I32, core::type::U32>()) {
         AddError("texture_2d<type>: type must be f32, i32 or u32", source);
         return false;
     }
@@ -342,14 +343,14 @@
     return true;
 }
 
-bool Validator::MultisampledTexture(const type::MultisampledTexture* t,
+bool Validator::MultisampledTexture(const core::type::MultisampledTexture* t,
                                     const Source& source) const {
-    if (t->dim() != type::TextureDimension::k2d) {
+    if (t->dim() != core::type::TextureDimension::k2d) {
         AddError("only 2d multisampled textures are supported", source);
         return false;
     }
 
-    if (!t->type()->UnwrapRef()->IsAnyOf<type::F32, type::I32, type::U32>()) {
+    if (!t->type()->UnwrapRef()->IsAnyOf<core::type::F32, core::type::I32, core::type::U32>()) {
         AddError("texture_multisampled_2d<type>: type must be f32, i32 or u32", source);
         return false;
     }
@@ -357,10 +358,10 @@
     return true;
 }
 
-bool Validator::Materialize(const type::Type* to,
-                            const type::Type* from,
+bool Validator::Materialize(const core::type::Type* to,
+                            const core::type::Type* from,
                             const Source& source) const {
-    if (type::Type::ConversionRank(from, to) == type::Type::kNoConversion) {
+    if (core::type::Type::ConversionRank(from, to) == core::type::Type::kNoConversion) {
         AddError("cannot convert value of type '" + sem_.TypeNameOf(from) + "' to type '" +
                      sem_.TypeNameOf(to) + "'",
                  source);
@@ -370,7 +371,7 @@
 }
 
 bool Validator::VariableInitializer(const ast::Variable* v,
-                                    const type::Type* storage_ty,
+                                    const core::type::Type* storage_ty,
                                     const sem::ValueExpression* initializer) const {
     auto* initializer_ty = initializer->Type();
     auto* value_type = initializer_ty->UnwrapRef();  // Implicit load of RHS
@@ -387,21 +388,21 @@
     return true;
 }
 
-bool Validator::AddressSpaceLayout(const type::Type* store_ty,
+bool Validator::AddressSpaceLayout(const core::type::Type* store_ty,
                                    core::AddressSpace address_space,
                                    Source source) const {
     // https://gpuweb.github.io/gpuweb/wgsl/#storage-class-layout-constraints
 
-    auto is_uniform_struct_or_array = [address_space](const type::Type* ty) {
+    auto is_uniform_struct_or_array = [address_space](const core::type::Type* ty) {
         return address_space == core::AddressSpace::kUniform &&
-               ty->IsAnyOf<type::Array, type::Struct>();
+               ty->IsAnyOf<core::type::Array, core::type::Struct>();
     };
 
-    auto is_uniform_struct = [address_space](const type::Type* ty) {
-        return address_space == core::AddressSpace::kUniform && ty->Is<type::Struct>();
+    auto is_uniform_struct = [address_space](const core::type::Type* ty) {
+        return address_space == core::AddressSpace::kUniform && ty->Is<core::type::Struct>();
     };
 
-    auto required_alignment_of = [&](const type::Type* ty) {
+    auto required_alignment_of = [&](const core::type::Type* ty) {
         uint32_t actual_align = ty->Align();
         uint32_t required_align = actual_align;
         if (is_uniform_struct_or_array(ty)) {
@@ -410,7 +411,7 @@
         return required_align;
     };
 
-    auto member_name_of = [](const type::StructMember* sm) { return sm->Name().Name(); };
+    auto member_name_of = [](const core::type::StructMember* sm) { return sm->Name().Name(); };
 
     // Only validate the [type + address space] once
     if (!valid_type_storage_layouts_.Add(TypeAndAddressSpace{store_ty, address_space})) {
@@ -429,7 +430,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<type::F16>(store_ty->DeepestElement()) &&
+    if (Is<core::type::F16>(store_ty->DeepestElement()) &&
         address_space == core::AddressSpace::kPushConstant) {
         AddError("using f16 types in 'push_constant' address space is not implemented yet", source);
         return false;
@@ -501,7 +502,7 @@
     }
 
     // For uniform buffer array members, validate that array elements are aligned to 16 bytes
-    if (auto* arr = store_ty->As<type::Array>()) {
+    if (auto* arr = store_ty->As<core::type::Array>()) {
         // Recurse into the element type.
         // TODO(crbug.com/tint/1388): Ideally we'd pass the source for nested element type here, but
         // we can't easily get that from the semantic node. We should consider recursing through the
@@ -518,9 +519,9 @@
                 // Since WGSL has no stride attribute, try to provide a useful hint for how the
                 // shader author can resolve the issue.
                 std::string hint;
-                if (arr->ElemType()->Is<type::Scalar>()) {
+                if (arr->ElemType()->Is<core::type::Scalar>()) {
                     hint = "Consider using a vector or struct as the element type instead.";
-                } else if (auto* vec = arr->ElemType()->As<type::Vector>();
+                } else if (auto* vec = arr->ElemType()->As<core::type::Vector>();
                            vec && vec->type()->Size() == 4) {
                     hint = "Consider using a vec4 instead.";
                 } else if (arr->ElemType()->Is<sem::Struct>()) {
@@ -714,7 +715,7 @@
     auto* decl = v->Declaration();
     auto* storage_ty = v->Type()->UnwrapRef();
 
-    if (!(storage_ty->IsConstructible() || storage_ty->Is<type::Pointer>())) {
+    if (!(storage_ty->IsConstructible() || storage_ty->Is<core::type::Pointer>())) {
         AddError(sem_.TypeNameOf(storage_ty) + " cannot be used as the type of a 'let'",
                  decl->source);
         return false;
@@ -747,7 +748,7 @@
         }
     }
 
-    if (!storage_ty->Is<type::Scalar>()) {
+    if (!storage_ty->Is<core::type::Scalar>()) {
         AddError(sem_.TypeNameOf(storage_ty) + " cannot be used as the type of a 'override'",
                  decl->source);
         return false;
@@ -767,7 +768,7 @@
         return true;
     }
 
-    if (auto* ref = var->Type()->As<type::Pointer>()) {
+    if (auto* ref = var->Type()->As<core::type::Pointer>()) {
         if (IsValidationEnabled(decl->attributes, ast::DisabledValidation::kIgnoreAddressSpace)) {
             bool ok = false;
 
@@ -801,7 +802,8 @@
             AddError("type of function parameter must be constructible", decl->type->source);
             return false;
         }
-    } else if (!var->Type()->IsAnyOf<type::Texture, type::Sampler, type::Pointer>()) {
+    } else if (!var->Type()
+                    ->IsAnyOf<core::type::Texture, core::type::Sampler, core::type::Pointer>()) {
         AddError("type of function parameter cannot be " + sem_.TypeNameOf(var->Type()),
                  decl->source);
         return false;
@@ -811,7 +813,7 @@
 }
 
 bool Validator::BuiltinAttribute(const ast::BuiltinAttribute* attr,
-                                 const type::Type* storage_ty,
+                                 const core::type::Type* storage_ty,
                                  ast::PipelineStage stage,
                                  const bool is_input) const {
     auto* type = storage_ty->UnwrapRef();
@@ -827,7 +829,7 @@
                   (is_output && stage == ast::PipelineStage::kVertex))) {
                 is_stage_mismatch = true;
             }
-            if (!(type->is_float_vector() && type->As<type::Vector>()->Width() == 4)) {
+            if (!(type->is_float_vector() && type->As<core::type::Vector>()->Width() == 4)) {
                 StringStream err;
                 err << "store type of @builtin(" << builtin << ") must be 'vec4<f32>'";
                 AddError(err.str(), attr->source);
@@ -842,7 +844,8 @@
                 !(stage == ast::PipelineStage::kCompute && is_input)) {
                 is_stage_mismatch = true;
             }
-            if (!(type->is_unsigned_integer_vector() && type->As<type::Vector>()->Width() == 3)) {
+            if (!(type->is_unsigned_integer_vector() &&
+                  type->As<core::type::Vector>()->Width() == 3)) {
                 StringStream err;
                 err << "store type of @builtin(" << builtin << ") must be 'vec3<u32>'";
                 AddError(err.str(), attr->source);
@@ -854,7 +857,7 @@
                 !(stage == ast::PipelineStage::kFragment && !is_input)) {
                 is_stage_mismatch = true;
             }
-            if (!type->Is<type::F32>()) {
+            if (!type->Is<core::type::F32>()) {
                 StringStream err;
                 err << "store type of @builtin(" << builtin << ") must be 'f32'";
                 AddError(err.str(), attr->source);
@@ -866,7 +869,7 @@
                 !(stage == ast::PipelineStage::kFragment && is_input)) {
                 is_stage_mismatch = true;
             }
-            if (!type->Is<type::Bool>()) {
+            if (!type->Is<core::type::Bool>()) {
                 StringStream err;
                 err << "store type of @builtin(" << builtin << ") must be 'bool'";
                 AddError(err.str(), attr->source);
@@ -878,7 +881,7 @@
                 !(stage == ast::PipelineStage::kCompute && is_input)) {
                 is_stage_mismatch = true;
             }
-            if (!type->Is<type::U32>()) {
+            if (!type->Is<core::type::U32>()) {
                 StringStream err;
                 err << "store type of @builtin(" << builtin << ") must be 'u32'";
                 AddError(err.str(), attr->source);
@@ -891,7 +894,7 @@
                 !(stage == ast::PipelineStage::kVertex && is_input)) {
                 is_stage_mismatch = true;
             }
-            if (!type->Is<type::U32>()) {
+            if (!type->Is<core::type::U32>()) {
                 StringStream err;
                 err << "store type of @builtin(" << builtin << ") must be 'u32'";
                 AddError(err.str(), attr->source);
@@ -902,7 +905,7 @@
             if (stage != ast::PipelineStage::kNone && !(stage == ast::PipelineStage::kFragment)) {
                 is_stage_mismatch = true;
             }
-            if (!type->Is<type::U32>()) {
+            if (!type->Is<core::type::U32>()) {
                 StringStream err;
                 err << "store type of @builtin(" << builtin << ") must be 'u32'";
                 AddError(err.str(), attr->source);
@@ -914,7 +917,7 @@
                 !(stage == ast::PipelineStage::kFragment && is_input)) {
                 is_stage_mismatch = true;
             }
-            if (!type->Is<type::U32>()) {
+            if (!type->Is<core::type::U32>()) {
                 StringStream err;
                 err << "store type of @builtin(" << builtin << ") must be 'u32'";
                 AddError(err.str(), attr->source);
@@ -930,7 +933,7 @@
                 AddError(err.str(), attr->source);
                 return false;
             }
-            if (!type->Is<type::U32>()) {
+            if (!type->Is<core::type::U32>()) {
                 StringStream err;
                 err << "store type of @builtin(" << builtin << ") must be 'u32'";
                 AddError(err.str(), attr->source);
@@ -959,7 +962,7 @@
 }
 
 bool Validator::InterpolateAttribute(const ast::InterpolateAttribute* attr,
-                                     const type::Type* storage_ty) const {
+                                     const core::type::Type* storage_ty) const {
     auto* type = storage_ty->UnwrapRef();
 
     auto i_type = sem_.AsInterpolationType(sem_.Get(attr->type));
@@ -995,7 +998,7 @@
                 return true;
             },
             [&](const ast::MustUseAttribute*) {
-                if (func->ReturnType()->Is<type::Void>()) {
+                if (func->ReturnType()->Is<core::type::Void>()) {
                     AddError("@must_use can only be applied to functions that return a value",
                              attr->source);
                     return false;
@@ -1015,7 +1018,7 @@
         return false;
     }
 
-    if (!func->ReturnType()->Is<type::Void>()) {
+    if (!func->ReturnType()->Is<core::type::Void>()) {
         if (!func->ReturnType()->IsConstructible()) {
             AddError("function return type must be a constructible type",
                      decl->return_type->source);
@@ -1071,7 +1074,7 @@
 
     // Inner lambda that is applied to a type and all of its members.
     auto validate_entry_point_attributes_inner = [&](VectorRef<const ast::Attribute*> attrs,
-                                                     const type::Type* ty, Source source,
+                                                     const core::type::Type* ty, Source source,
                                                      ParamOrRetType param_or_ret,
                                                      bool is_struct_member,
                                                      std::optional<uint32_t> location,
@@ -1156,12 +1159,12 @@
         }
 
         if (IsValidationEnabled(attrs, ast::DisabledValidation::kEntryPointParameter)) {
-            if (is_struct_member && ty->Is<type::Struct>()) {
+            if (is_struct_member && ty->Is<core::type::Struct>()) {
                 AddError("nested structures cannot be used for entry point IO", source);
                 return false;
             }
 
-            if (!ty->Is<type::Struct>() && !pipeline_io_attribute) {
+            if (!ty->Is<core::type::Struct>() && !pipeline_io_attribute) {
                 std::string err = "missing entry point IO attribute";
                 if (!is_struct_member) {
                     err += (param_or_ret == ParamOrRetType::kParameter ? " on parameter"
@@ -1258,7 +1261,7 @@
 
     // Outer lambda for validating the entry point attributes for a type.
     auto validate_entry_point_attributes = [&](VectorRef<const ast::Attribute*> attrs,
-                                               const type::Type* ty, Source source,
+                                               const core::type::Type* ty, Source source,
                                                ParamOrRetType param_or_ret,
                                                std::optional<uint32_t> location,
                                                std::optional<uint32_t> index) {
@@ -1298,7 +1301,7 @@
     builtins.Clear();
     locationsAndIndexes.Clear();
 
-    if (!func->ReturnType()->Is<type::Void>()) {
+    if (!func->ReturnType()->Is<core::type::Void>()) {
         if (!validate_entry_point_attributes(decl->return_type_attributes, func->ReturnType(),
                                              decl->source, ParamOrRetType::kReturnType,
                                              func->ReturnLocation(), func->ReturnIndex())) {
@@ -1420,7 +1423,7 @@
     return true;
 }
 
-bool Validator::Bitcast(const ast::BitcastExpression* cast, const type::Type* to) const {
+bool Validator::Bitcast(const ast::BitcastExpression* cast, const core::type::Type* to) const {
     auto* from = sem_.TypeOf(cast->expr)->UnwrapRef();
     if (!from->is_numeric_scalar_or_vector()) {
         AddError("'" + sem_.TypeNameOf(from) + "' cannot be bitcast", cast->expr->source);
@@ -1529,7 +1532,7 @@
     }
     if (auto* cond = stmt->Condition()) {
         auto* cond_ty = cond->Type()->UnwrapRef();
-        if (!cond_ty->Is<type::Bool>()) {
+        if (!cond_ty->Is<core::type::Bool>()) {
             AddError("for-loop condition must be bool, got " + sem_.TypeNameOf(cond_ty),
                      stmt->Condition()->Declaration()->source);
             return false;
@@ -1545,7 +1548,7 @@
     }
     if (auto* cond = stmt->Condition()) {
         auto* cond_ty = cond->Type()->UnwrapRef();
-        if (!cond_ty->Is<type::Bool>()) {
+        if (!cond_ty->Is<core::type::Bool>()) {
             AddError("while condition must be bool, got " + sem_.TypeNameOf(cond_ty),
                      stmt->Condition()->Declaration()->source);
             return false;
@@ -1557,7 +1560,7 @@
 bool Validator::BreakIfStatement(const sem::BreakIfStatement* stmt,
                                  sem::Statement* current_statement) const {
     auto* cond_ty = stmt->Condition()->Type()->UnwrapRef();
-    if (!cond_ty->Is<type::Bool>()) {
+    if (!cond_ty->Is<core::type::Bool>()) {
         AddError("break-if statement condition must be bool, got " + sem_.TypeNameOf(cond_ty),
                  stmt->Condition()->Declaration()->source);
         return false;
@@ -1584,7 +1587,7 @@
 
 bool Validator::IfStatement(const sem::IfStatement* stmt) const {
     auto* cond_ty = stmt->Condition()->Type()->UnwrapRef();
-    if (!cond_ty->Is<type::Bool>()) {
+    if (!cond_ty->Is<core::type::Bool>()) {
         AddError("if statement condition must be bool, got " + sem_.TypeNameOf(cond_ty),
                  stmt->Condition()->Declaration()->source);
         return false;
@@ -1593,7 +1596,7 @@
 }
 
 bool Validator::BuiltinCall(const sem::Call* call) const {
-    if (call->Type()->Is<type::Void>()) {
+    if (call->Type()->Is<core::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
@@ -1637,7 +1640,7 @@
         std::string name{core::ToString(usage)};
         auto* arg = call->Arguments()[index];
         if (auto values = arg->ConstantValue()) {
-            if (auto* vector = values->Type()->As<type::Vector>()) {
+            if (auto* vector = values->Type()->As<core::type::Vector>()) {
                 for (size_t i = 0; i < vector->Width(); i++) {
                     auto value = values->Index(i)->ValueAs<AInt>();
                     if (value < min || value > max) {
@@ -1678,11 +1681,11 @@
 
     TINT_ASSERT(call->Arguments().Length() > 0);
     auto* arg = call->Arguments()[0];
-    auto* ptr = arg->Type()->As<type::Pointer>();
+    auto* ptr = arg->Type()->As<core::type::Pointer>();
     TINT_ASSERT(ptr != nullptr);
     auto* ty = ptr->StoreType();
 
-    if (ty->Is<type::Atomic>() || atomic_composite_info_.Contains(ty)) {
+    if (ty->Is<core::type::Atomic>() || atomic_composite_info_.Contains(ty)) {
         AddError(
             "workgroupUniformLoad must not be called with an argument that contains an atomic type",
             arg->Declaration()->source);
@@ -1764,7 +1767,7 @@
             return false;
         }
 
-        if (param_type->Is<type::Pointer>() &&
+        if (param_type->Is<core::type::Pointer>() &&
             !enabled_extensions_.Contains(
                 core::Extension::kChromiumExperimentalFullPtrParameters)) {
             // https://gpuweb.github.io/gpuweb/wgsl/#function-restriction
@@ -1772,12 +1775,12 @@
             // view as its root identifier.
             // We can validate this by just comparing the store type of the argument with that of
             // its root identifier, as these will match iff the memory view is the same.
-            auto* arg_store_type = arg_type->As<type::Pointer>()->StoreType();
+            auto* arg_store_type = arg_type->As<core::type::Pointer>()->StoreType();
             auto* root = call->Arguments()[i]->RootIdentifier();
-            auto* root_ptr_ty = root->Type()->As<type::Pointer>();
-            auto* root_ref_ty = root->Type()->As<type::Reference>();
+            auto* root_ptr_ty = root->Type()->As<core::type::Pointer>();
+            auto* root_ref_ty = root->Type()->As<core::type::Reference>();
             TINT_ASSERT(root_ptr_ty || root_ref_ty);
-            const type::Type* root_store_type;
+            const core::type::Type* root_store_type;
             if (root_ptr_ty) {
                 root_store_type = root_ptr_ty->StoreType();
             } else {
@@ -1795,7 +1798,7 @@
         }
     }
 
-    if (call->Type()->Is<type::Void>()) {
+    if (call->Type()->Is<core::type::Void>()) {
         bool is_call_statement = false;
         if (auto* call_stmt = As<ast::CallStatement>(call->Stmt()->Declaration())) {
             if (call_stmt->expr == call->Declaration()) {
@@ -1815,7 +1818,7 @@
 }
 
 bool Validator::StructureInitializer(const ast::CallExpression* ctor,
-                                     const type::Struct* struct_type) const {
+                                     const core::type::Struct* struct_type) const {
     if (!struct_type->IsConstructible()) {
         AddError("structure constructor has non-constructible type", ctor->source);
         return false;
@@ -1847,12 +1850,13 @@
 }
 
 bool Validator::ArrayConstructor(const ast::CallExpression* ctor,
-                                 const type::Array* array_type) const {
+                                 const core::type::Array* array_type) const {
     auto& values = ctor->args;
     auto* elem_ty = array_type->ElemType();
     for (auto* value : values) {
         auto* value_ty = sem_.TypeOf(value)->UnwrapRef();
-        if (type::Type::ConversionRank(value_ty, elem_ty) == type::Type::kNoConversion) {
+        if (core::type::Type::ConversionRank(value_ty, elem_ty) ==
+            core::type::Type::kNoConversion) {
             AddError("'" + sem_.TypeNameOf(value_ty) +
                          "' cannot be used to construct an array of '" + sem_.TypeNameOf(elem_ty) +
                          "'",
@@ -1862,7 +1866,7 @@
     }
 
     auto* c = array_type->Count();
-    if (c->Is<type::RuntimeArrayCount>()) {
+    if (c->Is<core::type::RuntimeArrayCount>()) {
         AddError("cannot construct a runtime-sized array", ctor->source);
         return false;
     }
@@ -1877,12 +1881,12 @@
         return false;
     }
 
-    if (TINT_UNLIKELY(!c->Is<type::ConstantArrayCount>())) {
+    if (TINT_UNLIKELY(!c->Is<core::type::ConstantArrayCount>())) {
         TINT_ICE() << "Invalid ArrayCount found";
         return false;
     }
 
-    const auto count = c->As<type::ConstantArrayCount>()->value;
+    const auto count = c->As<core::type::ConstantArrayCount>()->value;
     if (!values.IsEmpty() && (values.Length() != count)) {
         std::string fm = values.Length() < count ? "few" : "many";
         AddError("array constructor has too " + fm + " elements: expected " +
@@ -1893,15 +1897,15 @@
     return true;
 }
 
-bool Validator::Vector(const type::Type* el_ty, const Source& source) const {
-    if (!el_ty->Is<type::Scalar>()) {
+bool Validator::Vector(const core::type::Type* el_ty, const Source& source) const {
+    if (!el_ty->Is<core::type::Scalar>()) {
         AddError("vector element type must be 'bool', 'f32', 'f16', 'i32' or 'u32'", source);
         return false;
     }
     return true;
 }
 
-bool Validator::Matrix(const type::Type* el_ty, const Source& source) const {
+bool Validator::Matrix(const core::type::Type* el_ty, const Source& source) const {
     if (!el_ty->is_float_scalar()) {
         AddError("matrix element type must be 'f32' or 'f16'", source);
         return false;
@@ -2070,7 +2074,7 @@
     return true;
 }
 
-bool Validator::Array(const type::Array* arr, const Source& el_source) const {
+bool Validator::Array(const core::type::Array* arr, const Source& el_source) const {
     auto* el_ty = arr->ElemType();
 
     if (!IsPlain(el_ty)) {
@@ -2123,8 +2127,8 @@
 
     Hashset<std::pair<uint32_t, uint32_t>, 8> locationsAndIndexes;
     for (auto* member : str->Members()) {
-        if (auto* r = member->Type()->As<type::Array>()) {
-            if (r->Count()->Is<type::RuntimeArrayCount>()) {
+        if (auto* r = member->Type()->As<core::type::Array>()) {
+            if (r->Count()->Is<core::type::RuntimeArrayCount>()) {
                 if (member != str->Members().Back()) {
                     AddError("runtime arrays may only appear as the last member of a struct",
                              member->Declaration()->source);
@@ -2259,7 +2263,7 @@
 }
 
 bool Validator::LocationAttribute(const ast::LocationAttribute* loc_attr,
-                                  const type::Type* type,
+                                  const core::type::Type* type,
                                   ast::PipelineStage stage,
                                   const Source& source,
                                   const bool is_input) const {
@@ -2309,8 +2313,8 @@
 }
 
 bool Validator::Return(const ast::ReturnStatement* ret,
-                       const type::Type* func_type,
-                       const type::Type* ret_type,
+                       const core::type::Type* func_type,
+                       const core::type::Type* ret_type,
                        sem::Statement* current_statement) const {
     if (func_type->UnwrapRef() != ret_type) {
         AddError("return statement type must match its function return type, returned '" +
@@ -2376,7 +2380,7 @@
             auto value = selector->Value()->ValueAs<u32>();
             if (auto added = selectors.Add(value, selector->Declaration()->source); !added) {
                 AddError("duplicate switch case '" +
-                             (decl_ty->IsAnyOf<type::I32, type::AbstractNumeric>()
+                             (decl_ty->IsAnyOf<core::type::I32, core::type::AbstractNumeric>()
                                   ? std::to_string(i32(value))
                                   : std::to_string(value)) +
                              "'",
@@ -2396,7 +2400,7 @@
     return true;
 }
 
-bool Validator::Assignment(const ast::Statement* a, const type::Type* rhs_ty) const {
+bool Validator::Assignment(const ast::Statement* a, const core::type::Type* rhs_ty) const {
     const ast::Expression* lhs;
     const ast::Expression* rhs;
     if (auto* assign = a->As<ast::AssignmentStatement>()) {
@@ -2414,7 +2418,8 @@
         // https://www.w3.org/TR/WGSL/#phony-assignment-section
         auto* ty = rhs_ty->UnwrapRef();
         if (!ty->IsConstructible() &&
-            !ty->IsAnyOf<type::Pointer, type::Texture, type::Sampler, type::AbstractNumeric>()) {
+            !ty->IsAnyOf<core::type::Pointer, core::type::Texture, core::type::Sampler,
+                         core::type::AbstractNumeric>()) {
             AddError("cannot assign '" + sem_.TypeNameOf(rhs_ty) +
                          "' to '_'. '_' can only be assigned a constructible, pointer, texture or "
                          "sampler type",
@@ -2428,7 +2433,7 @@
     auto const* lhs_sem = sem_.GetVal(lhs);
     auto const* lhs_ty = lhs_sem->Type();
 
-    auto* lhs_ref = lhs_ty->As<type::Reference>();
+    auto* lhs_ref = lhs_ty->As<core::type::Reference>();
     if (!lhs_ref) {
         // LHS is not a reference, so it has no storage.
         AddError("cannot assign to " + sem_.Describe(lhs_sem), lhs->source);
@@ -2511,7 +2516,7 @@
     }
 
     auto const* lhs_ty = sem_.TypeOf(lhs);
-    auto* lhs_ref = lhs_ty->As<type::Reference>();
+    auto* lhs_ref = lhs_ty->As<core::type::Reference>();
     if (!lhs_ref) {
         // LHS is not a reference, so it has no storage.
         AddError("cannot modify value of type '" + sem_.TypeNameOf(lhs_ty) + "'", lhs->source);
@@ -2595,8 +2600,8 @@
     return !IsValidationDisabled(attributes, validation);
 }
 
-bool Validator::IsArrayWithOverrideCount(const type::Type* ty) const {
-    if (auto* arr = ty->UnwrapRef()->As<type::Array>()) {
+bool Validator::IsArrayWithOverrideCount(const core::type::Type* ty) const {
+    if (auto* arr = ty->UnwrapRef()->As<core::type::Array>()) {
         if (arr->Count()->IsAnyOf<sem::NamedOverrideArrayCount, sem::UnnamedOverrideArrayCount>()) {
             return true;
         }
@@ -2611,12 +2616,12 @@
         source);
 }
 
-std::string Validator::VectorPretty(uint32_t size, const type::Type* element_type) const {
-    type::Vector vec_type(element_type, size);
+std::string Validator::VectorPretty(uint32_t size, const core::type::Type* element_type) const {
+    core::type::Vector vec_type(element_type, size);
     return vec_type.FriendlyName();
 }
 
-bool Validator::CheckTypeAccessAddressSpace(const type::Type* store_ty,
+bool Validator::CheckTypeAccessAddressSpace(const core::type::Type* store_ty,
                                             core::Access access,
                                             core::AddressSpace address_space,
                                             VectorRef<const tint::ast::Attribute*> attributes,
@@ -2667,15 +2672,15 @@
 
     return Switch(
         store_ty,  //
-        [&](const type::Atomic*) {
+        [&](const core::type::Atomic*) {
             if (auto* err = atomic_error()) {
                 AddError(err, source);
                 return false;
             }
             return true;
         },
-        [&](const type::Struct*) { return check_sub_atomics(); },  //
-        [&](const type::Array*) { return check_sub_atomics(); },   //
+        [&](const core::type::Struct*) { return check_sub_atomics(); },  //
+        [&](const core::type::Array*) { return check_sub_atomics(); },   //
         [&](Default) { return true; });
 }
 
diff --git a/src/tint/lang/wgsl/resolver/validator.h b/src/tint/lang/wgsl/resolver/validator.h
index dfd4f56..40c6cfb 100644
--- a/src/tint/lang/wgsl/resolver/validator.h
+++ b/src/tint/lang/wgsl/resolver/validator.h
@@ -63,16 +63,16 @@
 class SwitchStatement;
 class WhileStatement;
 }  // namespace tint::sem
-namespace tint::type {
+namespace tint::core::type {
 class Atomic;
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 namespace tint::resolver {
 
 /// TypeAndAddressSpace is a pair of type and address space
 struct TypeAndAddressSpace {
     /// The type
-    const type::Type* type;
+    const core::type::Type* type;
     /// The address space
     core::AddressSpace address_space;
 
@@ -102,7 +102,7 @@
     Validator(ProgramBuilder* builder,
               SemHelper& helper,
               const core::Extensions& enabled_extensions,
-              const Hashmap<const type::Type*, const Source*, 8>& atomic_composite_info,
+              const Hashmap<const core::type::Type*, const Source*, 8>& atomic_composite_info,
               Hashset<TypeAndAddressSpace, 8>& valid_type_storage_layouts);
     ~Validator();
 
@@ -135,19 +135,19 @@
 
     /// @param type the given type
     /// @returns true if the given type is a plain type
-    bool IsPlain(const type::Type* type) const;
+    bool IsPlain(const core::type::Type* type) const;
 
     /// @param type the given type
     /// @returns true if the given type is a fixed-footprint type
-    bool IsFixedFootprint(const type::Type* type) const;
+    bool IsFixedFootprint(const core::type::Type* type) const;
 
     /// @param type the given type
     /// @returns true if the given type is storable
-    bool IsStorable(const type::Type* type) const;
+    bool IsStorable(const core::type::Type* type) const;
 
     /// @param type the given type
     /// @returns true if the given type is host-shareable
-    bool IsHostShareable(const type::Type* type) const;
+    bool IsHostShareable(const core::type::Type* type) const;
 
     /// Validates pipeline stages
     /// @param entry_points the entry points to the module
@@ -169,7 +169,7 @@
     /// @param el_source the source of the array element, or the array if the array does not have a
     ///        locally-declared element AST node.
     /// @returns true on success, false otherwise.
-    bool Array(const type::Array* arr, const Source& el_source) const;
+    bool Array(const core::type::Array* arr, const Source& el_source) const;
 
     /// Validates an array stride attribute
     /// @param attr the stride attribute to validate
@@ -184,25 +184,25 @@
     /// @param a the atomic ast node
     /// @param s the atomic sem node
     /// @returns true on success, false otherwise.
-    bool Atomic(const ast::TemplatedIdentifier* a, const type::Atomic* s) const;
+    bool Atomic(const ast::TemplatedIdentifier* a, const core::type::Atomic* s) const;
 
     /// Validates a pointer type
     /// @param a the pointer ast node
     /// @param s the pointer sem node
     /// @returns true on success, false otherwise.
-    bool Pointer(const ast::TemplatedIdentifier* a, const type::Pointer* s) const;
+    bool Pointer(const ast::TemplatedIdentifier* a, const core::type::Pointer* s) const;
 
     /// Validates an assignment
     /// @param a the assignment statement
     /// @param rhs_ty the type of the right hand side
     /// @returns true on success, false otherwise.
-    bool Assignment(const ast::Statement* a, const type::Type* rhs_ty) const;
+    bool Assignment(const ast::Statement* a, const core::type::Type* rhs_ty) const;
 
     /// Validates a bitcase
     /// @param cast the bitcast expression
     /// @param to the destination type
     /// @returns true on success, false otherwise
-    bool Bitcast(const ast::BitcastExpression* cast, const type::Type* to) const;
+    bool Bitcast(const ast::BitcastExpression* cast, const core::type::Type* to) const;
 
     /// Validates a break statement
     /// @param stmt the break statement to validate
@@ -217,7 +217,7 @@
     /// @param is_input true if this is an input attribute
     /// @returns true on success, false otherwise.
     bool BuiltinAttribute(const ast::BuiltinAttribute* attr,
-                          const type::Type* storage_type,
+                          const core::type::Type* storage_type,
                           ast::PipelineStage stage,
                           const bool is_input) const;
 
@@ -299,7 +299,7 @@
     /// @param storage_type the storage type of the attached variable
     /// @returns true on succes, false otherwise
     bool InterpolateAttribute(const ast::InterpolateAttribute* attr,
-                              const type::Type* storage_type) const;
+                              const core::type::Type* storage_type) const;
 
     /// Validates a builtin call
     /// @param call the builtin call to validate
@@ -319,7 +319,7 @@
     /// @param is_input true if this is an input variable
     /// @returns true on success, false otherwise.
     bool LocationAttribute(const ast::LocationAttribute* loc_attr,
-                           const type::Type* type,
+                           const core::type::Type* type,
                            ast::PipelineStage stage,
                            const Source& source,
                            const bool is_input = false) const;
@@ -340,13 +340,15 @@
     /// @param from the abstract numeric type
     /// @param source the source of the materialization
     /// @returns true on success, false otherwise
-    bool Materialize(const type::Type* to, const type::Type* from, const Source& source) const;
+    bool Materialize(const core::type::Type* to,
+                     const core::type::Type* from,
+                     const Source& source) const;
 
     /// Validates a matrix
     /// @param el_ty the matrix element type to validate
     /// @param source the source of the matrix
     /// @returns true on success, false otherwise
-    bool Matrix(const type::Type* el_ty, const Source& source) const;
+    bool Matrix(const core::type::Type* el_ty, const Source& source) const;
 
     /// Validates a function parameter
     /// @param var the variable to validate
@@ -360,8 +362,8 @@
     /// @param current_statement the current statement being resolved
     /// @returns true on success, false otherwise
     bool Return(const ast::ReturnStatement* ret,
-                const type::Type* func_type,
-                const type::Type* ret_type,
+                const core::type::Type* func_type,
+                const core::type::Type* ret_type,
                 sem::Statement* current_statement) const;
 
     /// Validates a list of statements
@@ -373,19 +375,19 @@
     /// @param t the texture to validate
     /// @param source the source of the texture
     /// @returns true on success, false otherwise
-    bool StorageTexture(const type::StorageTexture* t, const Source& source) const;
+    bool StorageTexture(const core::type::StorageTexture* t, const Source& source) const;
 
     /// Validates a sampled texture
     /// @param t the texture to validate
     /// @param source the source of the texture
     /// @returns true on success, false otherwise
-    bool SampledTexture(const type::SampledTexture* t, const Source& source) const;
+    bool SampledTexture(const core::type::SampledTexture* t, const Source& source) const;
 
     /// Validates a multisampled texture
     /// @param t the texture to validate
     /// @param source the source of the texture
     /// @returns true on success, false otherwise
-    bool MultisampledTexture(const type::MultisampledTexture* t, const Source& source) const;
+    bool MultisampledTexture(const core::type::MultisampledTexture* t, const Source& source) const;
 
     /// Validates a structure
     /// @param str the structure to validate
@@ -398,7 +400,7 @@
     /// @param struct_type the type of the structure
     /// @returns true on success, false otherwise
     bool StructureInitializer(const ast::CallExpression* ctor,
-                              const type::Struct* struct_type) const;
+                              const core::type::Struct* struct_type) const;
 
     /// Validates a switch statement
     /// @param s the switch to validate
@@ -433,20 +435,20 @@
     /// @param initializer the RHS initializer expression
     /// @returns true on succes, false otherwise
     bool VariableInitializer(const ast::Variable* v,
-                             const type::Type* storage_type,
+                             const core::type::Type* storage_type,
                              const sem::ValueExpression* initializer) const;
 
     /// Validates a vector
     /// @param el_ty the vector element type to validate
     /// @param source the source of the vector
     /// @returns true on success, false otherwise
-    bool Vector(const type::Type* el_ty, const Source& source) const;
+    bool Vector(const core::type::Type* el_ty, const Source& source) const;
 
     /// Validates an array constructor
     /// @param ctor the call expresion to validate
     /// @param arr_type the type of the array
     /// @returns true on success, false otherwise
-    bool ArrayConstructor(const ast::CallExpression* ctor, const type::Array* arr_type) const;
+    bool ArrayConstructor(const ast::CallExpression* ctor, const core::type::Array* arr_type) const;
 
     /// Validates a texture builtin function
     /// @param call the builtin call to validate
@@ -485,7 +487,9 @@
     /// @param sc the address space
     /// @param source the source of the type
     /// @returns true on success, false otherwise
-    bool AddressSpaceLayout(const type::Type* type, core::AddressSpace sc, Source source) const;
+    bool AddressSpaceLayout(const core::type::Type* type,
+                            core::AddressSpace sc,
+                            Source source) const;
 
     /// @returns true if the attribute list contains a
     /// ast::DisableValidationAttribute with the validation mode equal to
@@ -507,7 +511,7 @@
     /// @param ty the type to check
     /// @returns true if @p ty is an array with an `override` expression element count, otherwise
     ///          false.
-    bool IsArrayWithOverrideCount(const type::Type* ty) const;
+    bool IsArrayWithOverrideCount(const core::type::Type* ty) const;
 
     /// Raises an error about an array type using an `override` expression element count, outside
     /// the single allowed use of a `var<workgroup>`.
@@ -529,7 +533,7 @@
     /// @param size the vector dimension
     /// @param element_type scalar vector sub-element type
     /// @return pretty string representation
-    std::string VectorPretty(uint32_t size, const type::Type* element_type) const;
+    std::string VectorPretty(uint32_t size, const core::type::Type* element_type) const;
 
     /// Raises an error if combination of @p store_ty, @p access and @p address_space are not valid
     /// for a `var` or `ptr` declaration.
@@ -538,7 +542,7 @@
     /// @param address_space the var or pointer address space
     /// @param source the source for the error
     /// @returns true on success, false if an error was raised.
-    bool CheckTypeAccessAddressSpace(const type::Type* store_ty,
+    bool CheckTypeAccessAddressSpace(const core::type::Type* store_ty,
                                      core::Access access,
                                      core::AddressSpace address_space,
                                      VectorRef<const tint::ast::Attribute*> attributes,
@@ -548,7 +552,7 @@
     SemHelper& sem_;
     DiagnosticFilterStack diagnostic_filters_;
     const core::Extensions& enabled_extensions_;
-    const Hashmap<const type::Type*, const Source*, 8>& atomic_composite_info_;
+    const Hashmap<const core::type::Type*, const Source*, 8>& atomic_composite_info_;
     Hashset<TypeAndAddressSpace, 8>& valid_type_storage_layouts_;
 };
 
diff --git a/src/tint/lang/wgsl/resolver/validator_is_storeable_test.cc b/src/tint/lang/wgsl/resolver/validator_is_storeable_test.cc
index 29dc947..8674a75 100644
--- a/src/tint/lang/wgsl/resolver/validator_is_storeable_test.cc
+++ b/src/tint/lang/wgsl/resolver/validator_is_storeable_test.cc
@@ -24,79 +24,79 @@
 using ValidatorIsStorableTest = ResolverTest;
 
 TEST_F(ValidatorIsStorableTest, Void) {
-    EXPECT_FALSE(v()->IsStorable(create<type::Void>()));
+    EXPECT_FALSE(v()->IsStorable(create<core::type::Void>()));
 }
 
 TEST_F(ValidatorIsStorableTest, Scalar) {
-    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>()));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Bool>()));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::I32>()));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::U32>()));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::F32>()));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::F16>()));
 }
 
 TEST_F(ValidatorIsStorableTest, Vector) {
-    EXPECT_TRUE(v()->IsStorable(create<type::Vector>(create<type::I32>(), 2u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Vector>(create<type::I32>(), 3u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Vector>(create<type::I32>(), 4u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Vector>(create<type::U32>(), 2u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Vector>(create<type::U32>(), 3u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Vector>(create<type::U32>(), 4u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Vector>(create<type::F32>(), 2u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Vector>(create<type::F32>(), 3u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Vector>(create<type::F32>(), 4u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Vector>(create<type::F16>(), 2u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Vector>(create<type::F16>(), 3u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Vector>(create<type::F16>(), 4u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Vector>(create<core::type::I32>(), 2u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Vector>(create<core::type::I32>(), 3u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Vector>(create<core::type::I32>(), 4u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Vector>(create<core::type::U32>(), 2u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Vector>(create<core::type::U32>(), 3u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Vector>(create<core::type::U32>(), 4u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Vector>(create<core::type::F32>(), 2u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Vector>(create<core::type::F32>(), 3u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Vector>(create<core::type::F32>(), 4u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Vector>(create<core::type::F16>(), 2u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Vector>(create<core::type::F16>(), 3u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Vector>(create<core::type::F16>(), 4u)));
 }
 
 TEST_F(ValidatorIsStorableTest, Matrix) {
-    auto* vec2_f32 = create<type::Vector>(create<type::F32>(), 2u);
-    auto* vec3_f32 = create<type::Vector>(create<type::F32>(), 3u);
-    auto* vec4_f32 = create<type::Vector>(create<type::F32>(), 4u);
-    auto* vec2_f16 = create<type::Vector>(create<type::F16>(), 2u);
-    auto* vec3_f16 = create<type::Vector>(create<type::F16>(), 3u);
-    auto* vec4_f16 = create<type::Vector>(create<type::F16>(), 4u);
-    EXPECT_TRUE(v()->IsStorable(create<type::Matrix>(vec2_f32, 2u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Matrix>(vec2_f32, 3u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Matrix>(vec2_f32, 4u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Matrix>(vec3_f32, 2u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Matrix>(vec3_f32, 3u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Matrix>(vec3_f32, 4u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Matrix>(vec4_f32, 2u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Matrix>(vec4_f32, 3u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Matrix>(vec4_f32, 4u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Matrix>(vec2_f16, 2u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Matrix>(vec2_f16, 3u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Matrix>(vec2_f16, 4u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Matrix>(vec3_f16, 2u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Matrix>(vec3_f16, 3u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Matrix>(vec3_f16, 4u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Matrix>(vec4_f16, 2u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Matrix>(vec4_f16, 3u)));
-    EXPECT_TRUE(v()->IsStorable(create<type::Matrix>(vec4_f16, 4u)));
+    auto* vec2_f32 = create<core::type::Vector>(create<core::type::F32>(), 2u);
+    auto* vec3_f32 = create<core::type::Vector>(create<core::type::F32>(), 3u);
+    auto* vec4_f32 = create<core::type::Vector>(create<core::type::F32>(), 4u);
+    auto* vec2_f16 = create<core::type::Vector>(create<core::type::F16>(), 2u);
+    auto* vec3_f16 = create<core::type::Vector>(create<core::type::F16>(), 3u);
+    auto* vec4_f16 = create<core::type::Vector>(create<core::type::F16>(), 4u);
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Matrix>(vec2_f32, 2u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Matrix>(vec2_f32, 3u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Matrix>(vec2_f32, 4u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Matrix>(vec3_f32, 2u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Matrix>(vec3_f32, 3u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Matrix>(vec3_f32, 4u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Matrix>(vec4_f32, 2u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Matrix>(vec4_f32, 3u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Matrix>(vec4_f32, 4u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Matrix>(vec2_f16, 2u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Matrix>(vec2_f16, 3u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Matrix>(vec2_f16, 4u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Matrix>(vec3_f16, 2u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Matrix>(vec3_f16, 3u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Matrix>(vec3_f16, 4u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Matrix>(vec4_f16, 2u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Matrix>(vec4_f16, 3u)));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Matrix>(vec4_f16, 4u)));
 }
 
 TEST_F(ValidatorIsStorableTest, Pointer) {
-    auto* ptr = create<type::Pointer>(core::AddressSpace::kPrivate, create<type::I32>(),
-                                      core::Access::kReadWrite);
+    auto* ptr = create<core::type::Pointer>(core::AddressSpace::kPrivate, create<core::type::I32>(),
+                                            core::Access::kReadWrite);
     EXPECT_FALSE(v()->IsStorable(ptr));
 }
 
 TEST_F(ValidatorIsStorableTest, Atomic) {
-    EXPECT_TRUE(v()->IsStorable(create<type::Atomic>(create<type::I32>())));
-    EXPECT_TRUE(v()->IsStorable(create<type::Atomic>(create<type::U32>())));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Atomic>(create<core::type::I32>())));
+    EXPECT_TRUE(v()->IsStorable(create<core::type::Atomic>(create<core::type::U32>())));
 }
 
 TEST_F(ValidatorIsStorableTest, ArraySizedOfStorable) {
-    auto* arr = create<type::Array>(create<type::I32>(), create<type::ConstantArrayCount>(5u), 4u,
-                                    20u, 4u, 4u);
+    auto* arr = create<core::type::Array>(
+        create<core::type::I32>(), create<core::type::ConstantArrayCount>(5u), 4u, 20u, 4u, 4u);
     EXPECT_TRUE(v()->IsStorable(arr));
 }
 
 TEST_F(ValidatorIsStorableTest, ArrayUnsizedOfStorable) {
-    auto* arr =
-        create<type::Array>(create<type::I32>(), create<type::RuntimeArrayCount>(), 4u, 4u, 4u, 4u);
+    auto* arr = create<core::type::Array>(create<core::type::I32>(),
+                                          create<core::type::RuntimeArrayCount>(), 4u, 4u, 4u, 4u);
     EXPECT_TRUE(v()->IsStorable(arr));
 }
 
diff --git a/src/tint/lang/wgsl/resolver/value_constructor_validation_test.cc b/src/tint/lang/wgsl/resolver/value_constructor_validation_test.cc
index 3ed7125..7e74e69 100644
--- a/src/tint/lang/wgsl/resolver/value_constructor_validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/value_constructor_validation_test.cc
@@ -61,13 +61,13 @@
     WrapInFunction(a, b, Assign(a_ident, "a"), Assign(b_ident, "b"));
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
-    ASSERT_TRUE(TypeOf(a_ident)->Is<type::Reference>());
-    EXPECT_TRUE(TypeOf(a_ident)->As<type::Reference>()->StoreType()->Is<type::I32>());
-    EXPECT_EQ(TypeOf(a_ident)->As<type::Reference>()->AddressSpace(),
+    ASSERT_TRUE(TypeOf(a_ident)->Is<core::type::Reference>());
+    EXPECT_TRUE(TypeOf(a_ident)->As<core::type::Reference>()->StoreType()->Is<core::type::I32>());
+    EXPECT_EQ(TypeOf(a_ident)->As<core::type::Reference>()->AddressSpace(),
               core::AddressSpace::kFunction);
-    ASSERT_TRUE(TypeOf(b_ident)->Is<type::Reference>());
-    EXPECT_TRUE(TypeOf(b_ident)->As<type::Reference>()->StoreType()->Is<type::I32>());
-    EXPECT_EQ(TypeOf(b_ident)->As<type::Reference>()->AddressSpace(),
+    ASSERT_TRUE(TypeOf(b_ident)->Is<core::type::Reference>());
+    EXPECT_TRUE(TypeOf(b_ident)->As<core::type::Reference>()->StoreType()->Is<core::type::I32>());
+    EXPECT_EQ(TypeOf(b_ident)->As<core::type::Reference>()->AddressSpace(),
               core::AddressSpace::kFunction);
 }
 
@@ -91,7 +91,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* got = TypeOf(a_ident);
-    auto* expected = create<type::Reference>(
+    auto* expected = create<core::type::Reference>(
         core::AddressSpace::kFunction, params.create_rhs_sem_type(*this), core::Access::kReadWrite);
     ASSERT_EQ(got, expected) << "got:      " << FriendlyName(got) << "\n"
                              << "expected: " << FriendlyName(expected) << "\n";
@@ -145,7 +145,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* got = TypeOf(a_ident);
-    auto* expected = create<type::Reference>(
+    auto* expected = create<core::type::Reference>(
         core::AddressSpace::kFunction, params.create_rhs_sem_type(*this), core::Access::kReadWrite);
     ASSERT_EQ(got, expected) << "got:      " << FriendlyName(got) << "\n"
                              << "expected: " << FriendlyName(expected) << "\n";
@@ -193,7 +193,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* got = TypeOf(a_ident);
-    auto* expected = create<type::Reference>(
+    auto* expected = create<core::type::Reference>(
         core::AddressSpace::kFunction, params.create_rhs_sem_type(*this), core::Access::kReadWrite);
     ASSERT_EQ(got, expected) << "got:      " << FriendlyName(got) << "\n"
                              << "expected: " << FriendlyName(expected) << "\n";
@@ -489,7 +489,7 @@
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
-    EXPECT_TRUE(call->Type()->Is<type::Array>());
+    EXPECT_TRUE(call->Type()->Is<core::type::Array>());
     auto* ctor = call->Target()->As<sem::ValueConstructor>();
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
@@ -505,14 +505,14 @@
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
-    EXPECT_TRUE(call->Type()->Is<type::Array>());
+    EXPECT_TRUE(call->Type()->Is<core::type::Array>());
     auto* ctor = call->Target()->As<sem::ValueConstructor>();
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    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>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::U32>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferredArray_U32U32U32) {
@@ -524,14 +524,14 @@
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
-    EXPECT_TRUE(call->Type()->Is<type::Array>());
+    EXPECT_TRUE(call->Type()->Is<core::type::Array>());
     auto* ctor = call->Target()->As<sem::ValueConstructor>();
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    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>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::U32>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Array_U32AIU32) {
@@ -543,14 +543,14 @@
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
-    EXPECT_TRUE(call->Type()->Is<type::Array>());
+    EXPECT_TRUE(call->Type()->Is<core::type::Array>());
     auto* ctor = call->Target()->As<sem::ValueConstructor>();
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    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>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::U32>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferredArray_U32AIU32) {
@@ -562,14 +562,14 @@
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
-    EXPECT_TRUE(call->Type()->Is<type::Array>());
+    EXPECT_TRUE(call->Type()->Is<core::type::Array>());
     auto* ctor = call->Target()->As<sem::ValueConstructor>();
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    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>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::U32>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, ArrayU32_AIAIAI) {
@@ -581,14 +581,14 @@
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
-    EXPECT_TRUE(call->Type()->Is<type::Array>());
+    EXPECT_TRUE(call->Type()->Is<core::type::Array>());
     auto* ctor = call->Target()->As<sem::ValueConstructor>();
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    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>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::U32>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferredArray_AIAIAI) {
@@ -600,14 +600,14 @@
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
-    EXPECT_TRUE(call->Type()->Is<type::Array>());
+    EXPECT_TRUE(call->Type()->Is<core::type::Array>());
     auto* ctor = call->Target()->As<sem::ValueConstructor>();
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 3u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::AbstractInt>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::AbstractInt>());
-    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::AbstractInt>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::AbstractInt>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::AbstractInt>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::AbstractInt>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferredArrayU32_VecI32_VecAI) {
@@ -621,15 +621,17 @@
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
-    EXPECT_TRUE(call->Type()->Is<type::Array>());
+    EXPECT_TRUE(call->Type()->Is<core::type::Array>());
     auto* ctor = call->Target()->As<sem::ValueConstructor>();
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
-    ASSERT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->As<type::Vector>()->type()->Is<type::I32>());
-    ASSERT_TRUE(ctor->Parameters()[1]->Type()->Is<type::Vector>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->As<type::Vector>()->type()->Is<type::I32>());
+    ASSERT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(
+        ctor->Parameters()[0]->Type()->As<core::type::Vector>()->type()->Is<core::type::I32>());
+    ASSERT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(
+        ctor->Parameters()[1]->Type()->As<core::type::Vector>()->type()->Is<core::type::I32>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferredArrayU32_VecAI_VecF32) {
@@ -643,15 +645,17 @@
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
-    EXPECT_TRUE(call->Type()->Is<type::Array>());
+    EXPECT_TRUE(call->Type()->Is<core::type::Array>());
     auto* ctor = call->Target()->As<sem::ValueConstructor>();
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
-    ASSERT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->As<type::Vector>()->type()->Is<type::F32>());
-    ASSERT_TRUE(ctor->Parameters()[1]->Type()->Is<type::Vector>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->As<type::Vector>()->type()->Is<type::F32>());
+    ASSERT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(
+        ctor->Parameters()[0]->Type()->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    ASSERT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(
+        ctor->Parameters()[1]->Type()->As<core::type::Vector>()->type()->Is<core::type::F32>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, ArrayArgumentTypeMismatch_U32F32) {
@@ -892,7 +896,7 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    ASSERT_TRUE(TypeOf(expr)->Is<type::I32>());
+    ASSERT_TRUE(TypeOf(expr)->Is<core::type::I32>());
 
     auto* call = Sem().Get<sem::Call>(expr);
     ASSERT_NE(call, nullptr);
@@ -900,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<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::I32>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, U32_Success) {
@@ -910,7 +914,7 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    ASSERT_TRUE(TypeOf(expr)->Is<type::U32>());
+    ASSERT_TRUE(TypeOf(expr)->Is<core::type::U32>());
 
     auto* call = Sem().Get<sem::Call>(expr);
     ASSERT_NE(call, nullptr);
@@ -918,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<type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::U32>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, F32_Success) {
@@ -928,7 +932,7 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    ASSERT_TRUE(TypeOf(expr)->Is<type::F32>());
+    ASSERT_TRUE(TypeOf(expr)->Is<core::type::F32>());
 
     auto* call = Sem().Get<sem::Call>(expr);
     ASSERT_NE(call, nullptr);
@@ -936,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<type::F32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::F32>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, F16_Success) {
@@ -948,7 +952,7 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    ASSERT_TRUE(TypeOf(expr)->Is<type::F16>());
+    ASSERT_TRUE(TypeOf(expr)->Is<core::type::F16>());
 
     auto* call = Sem().Get<sem::Call>(expr);
     ASSERT_NE(call, nullptr);
@@ -956,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<type::F16>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::F16>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Convert_f32_to_i32_Success) {
@@ -966,7 +970,7 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    ASSERT_TRUE(TypeOf(expr)->Is<type::I32>());
+    ASSERT_TRUE(TypeOf(expr)->Is<core::type::I32>());
 
     auto* call = Sem().Get<sem::Call>(expr);
     ASSERT_NE(call, nullptr);
@@ -974,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<type::F32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::F32>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Convert_i32_to_u32_Success) {
@@ -984,7 +988,7 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    ASSERT_TRUE(TypeOf(expr)->Is<type::U32>());
+    ASSERT_TRUE(TypeOf(expr)->Is<core::type::U32>());
 
     auto* call = Sem().Get<sem::Call>(expr);
     ASSERT_NE(call, nullptr);
@@ -992,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<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::I32>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Convert_u32_to_f16_Success) {
@@ -1004,7 +1008,7 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    ASSERT_TRUE(TypeOf(expr)->Is<type::F16>());
+    ASSERT_TRUE(TypeOf(expr)->Is<core::type::F16>());
 
     auto* call = Sem().Get<sem::Call>(expr);
     ASSERT_NE(call, nullptr);
@@ -1012,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<type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::U32>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Convert_f16_to_f32_Success) {
@@ -1024,7 +1028,7 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(expr), nullptr);
-    ASSERT_TRUE(TypeOf(expr)->Is<type::F32>());
+    ASSERT_TRUE(TypeOf(expr)->Is<core::type::F32>());
 
     auto* call = Sem().Get<sem::Call>(expr);
     ASSERT_NE(call, nullptr);
@@ -1032,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<type::F16>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::F16>());
 }
 
 }  // namespace ScalarConstructor
@@ -1137,9 +1141,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 2u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 2u);
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
@@ -1156,9 +1160,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 2u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 2u);
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
@@ -1166,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<type::F32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::F32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::F32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::F32>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2F16_Success_Scalar) {
@@ -1179,9 +1183,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F16>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 2u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F16>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 2u);
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
@@ -1189,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<type::F16>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::F16>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::F16>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::F16>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2U32_Success_Scalar) {
@@ -1200,9 +1204,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::U32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 2u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::U32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 2u);
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
@@ -1210,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<type::U32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::U32>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2I32_Success_Scalar) {
@@ -1221,9 +1225,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::I32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 2u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::I32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 2u);
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
@@ -1231,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<type::I32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::I32>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2Bool_Success_Scalar) {
@@ -1242,9 +1246,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::Bool>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 2u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 2u);
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
@@ -1252,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<type::Bool>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::Bool>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Bool>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::Bool>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2_Success_Identity) {
@@ -1263,9 +1267,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 2u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 2u);
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
@@ -1273,7 +1277,7 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 1u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Vector>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2_Success_Vec2TypeConversion) {
@@ -1283,9 +1287,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 2u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 2u);
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
@@ -1293,7 +1297,7 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 1u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Vector>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3F32_Error_ScalarArgumentTypeMismatch) {
@@ -1412,9 +1416,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 3u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 3u);
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
@@ -1431,9 +1435,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 3u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 3u);
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
@@ -1441,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<type::F32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::F32>());
-    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::F32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::F32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::F32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::F32>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3F16_Success_Scalar) {
@@ -1455,9 +1459,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F16>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 3u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F16>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 3u);
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
@@ -1465,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<type::F16>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::F16>());
-    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::F16>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::F16>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::F16>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::F16>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3U32_Success_Scalar) {
@@ -1477,9 +1481,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::U32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 3u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::U32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 3u);
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
@@ -1487,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<type::U32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::U32>());
-    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::U32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::U32>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3I32_Success_Scalar) {
@@ -1499,9 +1503,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::I32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 3u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::I32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 3u);
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
@@ -1509,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<type::I32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::I32>());
-    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::I32>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::I32>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3Bool_Success_Scalar) {
@@ -1521,9 +1525,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::Bool>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 3u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 3u);
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
@@ -1531,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<type::Bool>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::Bool>());
-    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<type::Bool>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Bool>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::Bool>());
+    EXPECT_TRUE(ctor->Parameters()[2]->Type()->Is<core::type::Bool>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3_Success_Vec2AndScalar) {
@@ -1543,9 +1547,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 3u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 3u);
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
@@ -1553,8 +1557,8 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::F32>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Vector>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::F32>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3_Success_ScalarAndVec2) {
@@ -1564,9 +1568,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 3u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 3u);
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
@@ -1574,8 +1578,8 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 2u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::F32>());
-    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<type::Vector>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::F32>());
+    EXPECT_TRUE(ctor->Parameters()[1]->Type()->Is<core::type::Vector>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3_Success_Identity) {
@@ -1585,9 +1589,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 3u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 3u);
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
@@ -1595,7 +1599,7 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 1u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Vector>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3_Success_Vec3TypeConversion) {
@@ -1605,9 +1609,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 3u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 3u);
 
     auto* call = Sem().Get<sem::Call>(tc);
     ASSERT_NE(call, nullptr);
@@ -1615,7 +1619,7 @@
     ASSERT_NE(ctor, nullptr);
     EXPECT_EQ(call->Type(), ctor->ReturnType());
     ASSERT_EQ(ctor->Parameters().Length(), 1u);
-    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<type::Vector>());
+    EXPECT_TRUE(ctor->Parameters()[0]->Type()->Is<core::type::Vector>());
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4F32_Error_ScalarArgumentTypeMismatch) {
@@ -1778,9 +1782,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4F32_Success_Scalar) {
@@ -1790,9 +1794,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4F16_Success_Scalar) {
@@ -1804,9 +1808,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F16>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F16>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4U32_Success_Scalar) {
@@ -1816,9 +1820,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::U32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::U32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4I32_Success_Scalar) {
@@ -1828,9 +1832,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::I32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::I32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4Bool_Success_Scalar) {
@@ -1840,9 +1844,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::Bool>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_Vec2ScalarScalar) {
@@ -1852,9 +1856,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_ScalarVec2Scalar) {
@@ -1864,9 +1868,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_ScalarScalarVec2) {
@@ -1876,9 +1880,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_Vec2AndVec2) {
@@ -1888,9 +1892,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_Vec3AndScalar) {
@@ -1900,9 +1904,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_ScalarAndVec3) {
@@ -1912,9 +1916,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_Identity) {
@@ -1924,9 +1928,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_Vec4TypeConversion) {
@@ -1936,9 +1940,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, NestedVectorConstructors_InnerError) {
@@ -1958,9 +1962,9 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     ASSERT_NE(TypeOf(tc), nullptr);
-    ASSERT_TRUE(TypeOf(tc)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(tc)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_EQ(TypeOf(tc)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(tc)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(tc)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_EQ(TypeOf(tc)->As<core::type::Vector>()->Width(), 4u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vector_Alias_Argument_Error) {
@@ -2043,21 +2047,21 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(vec2_bool)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec2_i32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec2_u32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec2_f32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec2_f16)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(vec2_bool)->As<type::Vector>()->type()->Is<type::Bool>());
-    EXPECT_TRUE(TypeOf(vec2_i32)->As<type::Vector>()->type()->Is<type::I32>());
-    EXPECT_TRUE(TypeOf(vec2_u32)->As<type::Vector>()->type()->Is<type::U32>());
-    EXPECT_TRUE(TypeOf(vec2_f32)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_TRUE(TypeOf(vec2_f16)->As<type::Vector>()->type()->Is<type::F16>());
-    EXPECT_EQ(TypeOf(vec2_bool)->As<type::Vector>()->Width(), 2u);
-    EXPECT_EQ(TypeOf(vec2_i32)->As<type::Vector>()->Width(), 2u);
-    EXPECT_EQ(TypeOf(vec2_u32)->As<type::Vector>()->Width(), 2u);
-    EXPECT_EQ(TypeOf(vec2_f32)->As<type::Vector>()->Width(), 2u);
-    EXPECT_EQ(TypeOf(vec2_f16)->As<type::Vector>()->Width(), 2u);
+    ASSERT_TRUE(TypeOf(vec2_bool)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec2_i32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec2_u32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec2_f32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec2_f16)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(vec2_bool)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
+    EXPECT_TRUE(TypeOf(vec2_i32)->As<core::type::Vector>()->type()->Is<core::type::I32>());
+    EXPECT_TRUE(TypeOf(vec2_u32)->As<core::type::Vector>()->type()->Is<core::type::U32>());
+    EXPECT_TRUE(TypeOf(vec2_f32)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_TRUE(TypeOf(vec2_f16)->As<core::type::Vector>()->type()->Is<core::type::F16>());
+    EXPECT_EQ(TypeOf(vec2_bool)->As<core::type::Vector>()->Width(), 2u);
+    EXPECT_EQ(TypeOf(vec2_i32)->As<core::type::Vector>()->Width(), 2u);
+    EXPECT_EQ(TypeOf(vec2_u32)->As<core::type::Vector>()->Width(), 2u);
+    EXPECT_EQ(TypeOf(vec2_f32)->As<core::type::Vector>()->Width(), 2u);
+    EXPECT_EQ(TypeOf(vec2_f16)->As<core::type::Vector>()->Width(), 2u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferVec2ElementTypeFromVec2) {
@@ -2072,21 +2076,21 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(vec2_bool)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec2_i32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec2_u32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec2_f32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec2_f16)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(vec2_bool)->As<type::Vector>()->type()->Is<type::Bool>());
-    EXPECT_TRUE(TypeOf(vec2_i32)->As<type::Vector>()->type()->Is<type::I32>());
-    EXPECT_TRUE(TypeOf(vec2_u32)->As<type::Vector>()->type()->Is<type::U32>());
-    EXPECT_TRUE(TypeOf(vec2_f32)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_TRUE(TypeOf(vec2_f16)->As<type::Vector>()->type()->Is<type::F16>());
-    EXPECT_EQ(TypeOf(vec2_bool)->As<type::Vector>()->Width(), 2u);
-    EXPECT_EQ(TypeOf(vec2_i32)->As<type::Vector>()->Width(), 2u);
-    EXPECT_EQ(TypeOf(vec2_u32)->As<type::Vector>()->Width(), 2u);
-    EXPECT_EQ(TypeOf(vec2_f32)->As<type::Vector>()->Width(), 2u);
-    EXPECT_EQ(TypeOf(vec2_f16)->As<type::Vector>()->Width(), 2u);
+    ASSERT_TRUE(TypeOf(vec2_bool)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec2_i32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec2_u32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec2_f32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec2_f16)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(vec2_bool)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
+    EXPECT_TRUE(TypeOf(vec2_i32)->As<core::type::Vector>()->type()->Is<core::type::I32>());
+    EXPECT_TRUE(TypeOf(vec2_u32)->As<core::type::Vector>()->type()->Is<core::type::U32>());
+    EXPECT_TRUE(TypeOf(vec2_f32)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_TRUE(TypeOf(vec2_f16)->As<core::type::Vector>()->type()->Is<core::type::F16>());
+    EXPECT_EQ(TypeOf(vec2_bool)->As<core::type::Vector>()->Width(), 2u);
+    EXPECT_EQ(TypeOf(vec2_i32)->As<core::type::Vector>()->Width(), 2u);
+    EXPECT_EQ(TypeOf(vec2_u32)->As<core::type::Vector>()->Width(), 2u);
+    EXPECT_EQ(TypeOf(vec2_f32)->As<core::type::Vector>()->Width(), 2u);
+    EXPECT_EQ(TypeOf(vec2_f16)->As<core::type::Vector>()->Width(), 2u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferVec3ElementTypeFromScalars) {
@@ -2101,21 +2105,21 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(vec3_bool)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec3_i32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec3_u32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec3_f32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec3_f16)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(vec3_bool)->As<type::Vector>()->type()->Is<type::Bool>());
-    EXPECT_TRUE(TypeOf(vec3_i32)->As<type::Vector>()->type()->Is<type::I32>());
-    EXPECT_TRUE(TypeOf(vec3_u32)->As<type::Vector>()->type()->Is<type::U32>());
-    EXPECT_TRUE(TypeOf(vec3_f32)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_TRUE(TypeOf(vec3_f16)->As<type::Vector>()->type()->Is<type::F16>());
-    EXPECT_EQ(TypeOf(vec3_bool)->As<type::Vector>()->Width(), 3u);
-    EXPECT_EQ(TypeOf(vec3_i32)->As<type::Vector>()->Width(), 3u);
-    EXPECT_EQ(TypeOf(vec3_u32)->As<type::Vector>()->Width(), 3u);
-    EXPECT_EQ(TypeOf(vec3_f32)->As<type::Vector>()->Width(), 3u);
-    EXPECT_EQ(TypeOf(vec3_f16)->As<type::Vector>()->Width(), 3u);
+    ASSERT_TRUE(TypeOf(vec3_bool)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec3_i32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec3_u32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec3_f32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec3_f16)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(vec3_bool)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
+    EXPECT_TRUE(TypeOf(vec3_i32)->As<core::type::Vector>()->type()->Is<core::type::I32>());
+    EXPECT_TRUE(TypeOf(vec3_u32)->As<core::type::Vector>()->type()->Is<core::type::U32>());
+    EXPECT_TRUE(TypeOf(vec3_f32)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_TRUE(TypeOf(vec3_f16)->As<core::type::Vector>()->type()->Is<core::type::F16>());
+    EXPECT_EQ(TypeOf(vec3_bool)->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_EQ(TypeOf(vec3_i32)->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_EQ(TypeOf(vec3_u32)->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_EQ(TypeOf(vec3_f32)->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_EQ(TypeOf(vec3_f16)->As<core::type::Vector>()->Width(), 3u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferVec3ElementTypeFromVec3) {
@@ -2130,21 +2134,21 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(vec3_bool)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec3_i32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec3_u32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec3_f32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec3_f16)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(vec3_bool)->As<type::Vector>()->type()->Is<type::Bool>());
-    EXPECT_TRUE(TypeOf(vec3_i32)->As<type::Vector>()->type()->Is<type::I32>());
-    EXPECT_TRUE(TypeOf(vec3_u32)->As<type::Vector>()->type()->Is<type::U32>());
-    EXPECT_TRUE(TypeOf(vec3_f32)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_TRUE(TypeOf(vec3_f16)->As<type::Vector>()->type()->Is<type::F16>());
-    EXPECT_EQ(TypeOf(vec3_bool)->As<type::Vector>()->Width(), 3u);
-    EXPECT_EQ(TypeOf(vec3_i32)->As<type::Vector>()->Width(), 3u);
-    EXPECT_EQ(TypeOf(vec3_u32)->As<type::Vector>()->Width(), 3u);
-    EXPECT_EQ(TypeOf(vec3_f32)->As<type::Vector>()->Width(), 3u);
-    EXPECT_EQ(TypeOf(vec3_f16)->As<type::Vector>()->Width(), 3u);
+    ASSERT_TRUE(TypeOf(vec3_bool)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec3_i32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec3_u32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec3_f32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec3_f16)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(vec3_bool)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
+    EXPECT_TRUE(TypeOf(vec3_i32)->As<core::type::Vector>()->type()->Is<core::type::I32>());
+    EXPECT_TRUE(TypeOf(vec3_u32)->As<core::type::Vector>()->type()->Is<core::type::U32>());
+    EXPECT_TRUE(TypeOf(vec3_f32)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_TRUE(TypeOf(vec3_f16)->As<core::type::Vector>()->type()->Is<core::type::F16>());
+    EXPECT_EQ(TypeOf(vec3_bool)->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_EQ(TypeOf(vec3_i32)->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_EQ(TypeOf(vec3_u32)->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_EQ(TypeOf(vec3_f32)->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_EQ(TypeOf(vec3_f16)->As<core::type::Vector>()->Width(), 3u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferVec3ElementTypeFromScalarAndVec2) {
@@ -2159,21 +2163,21 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(vec3_bool)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec3_i32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec3_u32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec3_f32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec3_f16)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(vec3_bool)->As<type::Vector>()->type()->Is<type::Bool>());
-    EXPECT_TRUE(TypeOf(vec3_i32)->As<type::Vector>()->type()->Is<type::I32>());
-    EXPECT_TRUE(TypeOf(vec3_u32)->As<type::Vector>()->type()->Is<type::U32>());
-    EXPECT_TRUE(TypeOf(vec3_f32)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_TRUE(TypeOf(vec3_f16)->As<type::Vector>()->type()->Is<type::F16>());
-    EXPECT_EQ(TypeOf(vec3_bool)->As<type::Vector>()->Width(), 3u);
-    EXPECT_EQ(TypeOf(vec3_i32)->As<type::Vector>()->Width(), 3u);
-    EXPECT_EQ(TypeOf(vec3_u32)->As<type::Vector>()->Width(), 3u);
-    EXPECT_EQ(TypeOf(vec3_f32)->As<type::Vector>()->Width(), 3u);
-    EXPECT_EQ(TypeOf(vec3_f16)->As<type::Vector>()->Width(), 3u);
+    ASSERT_TRUE(TypeOf(vec3_bool)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec3_i32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec3_u32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec3_f32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec3_f16)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(vec3_bool)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
+    EXPECT_TRUE(TypeOf(vec3_i32)->As<core::type::Vector>()->type()->Is<core::type::I32>());
+    EXPECT_TRUE(TypeOf(vec3_u32)->As<core::type::Vector>()->type()->Is<core::type::U32>());
+    EXPECT_TRUE(TypeOf(vec3_f32)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_TRUE(TypeOf(vec3_f16)->As<core::type::Vector>()->type()->Is<core::type::F16>());
+    EXPECT_EQ(TypeOf(vec3_bool)->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_EQ(TypeOf(vec3_i32)->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_EQ(TypeOf(vec3_u32)->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_EQ(TypeOf(vec3_f32)->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_EQ(TypeOf(vec3_f16)->As<core::type::Vector>()->Width(), 3u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferVec4ElementTypeFromScalars) {
@@ -2188,21 +2192,21 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(vec4_bool)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec4_i32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec4_u32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec4_f32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec4_f16)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(vec4_bool)->As<type::Vector>()->type()->Is<type::Bool>());
-    EXPECT_TRUE(TypeOf(vec4_i32)->As<type::Vector>()->type()->Is<type::I32>());
-    EXPECT_TRUE(TypeOf(vec4_u32)->As<type::Vector>()->type()->Is<type::U32>());
-    EXPECT_TRUE(TypeOf(vec4_f32)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_TRUE(TypeOf(vec4_f16)->As<type::Vector>()->type()->Is<type::F16>());
-    EXPECT_EQ(TypeOf(vec4_bool)->As<type::Vector>()->Width(), 4u);
-    EXPECT_EQ(TypeOf(vec4_i32)->As<type::Vector>()->Width(), 4u);
-    EXPECT_EQ(TypeOf(vec4_u32)->As<type::Vector>()->Width(), 4u);
-    EXPECT_EQ(TypeOf(vec4_f32)->As<type::Vector>()->Width(), 4u);
-    EXPECT_EQ(TypeOf(vec4_f16)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(vec4_bool)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec4_i32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec4_u32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec4_f32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec4_f16)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(vec4_bool)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
+    EXPECT_TRUE(TypeOf(vec4_i32)->As<core::type::Vector>()->type()->Is<core::type::I32>());
+    EXPECT_TRUE(TypeOf(vec4_u32)->As<core::type::Vector>()->type()->Is<core::type::U32>());
+    EXPECT_TRUE(TypeOf(vec4_f32)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_TRUE(TypeOf(vec4_f16)->As<core::type::Vector>()->type()->Is<core::type::F16>());
+    EXPECT_EQ(TypeOf(vec4_bool)->As<core::type::Vector>()->Width(), 4u);
+    EXPECT_EQ(TypeOf(vec4_i32)->As<core::type::Vector>()->Width(), 4u);
+    EXPECT_EQ(TypeOf(vec4_u32)->As<core::type::Vector>()->Width(), 4u);
+    EXPECT_EQ(TypeOf(vec4_f32)->As<core::type::Vector>()->Width(), 4u);
+    EXPECT_EQ(TypeOf(vec4_f16)->As<core::type::Vector>()->Width(), 4u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferVec4ElementTypeFromVec4) {
@@ -2217,21 +2221,21 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(vec4_bool)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec4_i32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec4_u32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec4_f32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec4_f16)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(vec4_bool)->As<type::Vector>()->type()->Is<type::Bool>());
-    EXPECT_TRUE(TypeOf(vec4_i32)->As<type::Vector>()->type()->Is<type::I32>());
-    EXPECT_TRUE(TypeOf(vec4_u32)->As<type::Vector>()->type()->Is<type::U32>());
-    EXPECT_TRUE(TypeOf(vec4_f32)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_TRUE(TypeOf(vec4_f16)->As<type::Vector>()->type()->Is<type::F16>());
-    EXPECT_EQ(TypeOf(vec4_bool)->As<type::Vector>()->Width(), 4u);
-    EXPECT_EQ(TypeOf(vec4_i32)->As<type::Vector>()->Width(), 4u);
-    EXPECT_EQ(TypeOf(vec4_u32)->As<type::Vector>()->Width(), 4u);
-    EXPECT_EQ(TypeOf(vec4_f32)->As<type::Vector>()->Width(), 4u);
-    EXPECT_EQ(TypeOf(vec4_f16)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(vec4_bool)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec4_i32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec4_u32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec4_f32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec4_f16)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(vec4_bool)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
+    EXPECT_TRUE(TypeOf(vec4_i32)->As<core::type::Vector>()->type()->Is<core::type::I32>());
+    EXPECT_TRUE(TypeOf(vec4_u32)->As<core::type::Vector>()->type()->Is<core::type::U32>());
+    EXPECT_TRUE(TypeOf(vec4_f32)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_TRUE(TypeOf(vec4_f16)->As<core::type::Vector>()->type()->Is<core::type::F16>());
+    EXPECT_EQ(TypeOf(vec4_bool)->As<core::type::Vector>()->Width(), 4u);
+    EXPECT_EQ(TypeOf(vec4_i32)->As<core::type::Vector>()->Width(), 4u);
+    EXPECT_EQ(TypeOf(vec4_u32)->As<core::type::Vector>()->Width(), 4u);
+    EXPECT_EQ(TypeOf(vec4_f32)->As<core::type::Vector>()->Width(), 4u);
+    EXPECT_EQ(TypeOf(vec4_f16)->As<core::type::Vector>()->Width(), 4u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferVec4ElementTypeFromScalarAndVec3) {
@@ -2246,21 +2250,21 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(vec4_bool)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec4_i32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec4_u32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec4_f32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec4_f16)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(vec4_bool)->As<type::Vector>()->type()->Is<type::Bool>());
-    EXPECT_TRUE(TypeOf(vec4_i32)->As<type::Vector>()->type()->Is<type::I32>());
-    EXPECT_TRUE(TypeOf(vec4_u32)->As<type::Vector>()->type()->Is<type::U32>());
-    EXPECT_TRUE(TypeOf(vec4_f32)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_TRUE(TypeOf(vec4_f16)->As<type::Vector>()->type()->Is<type::F16>());
-    EXPECT_EQ(TypeOf(vec4_bool)->As<type::Vector>()->Width(), 4u);
-    EXPECT_EQ(TypeOf(vec4_i32)->As<type::Vector>()->Width(), 4u);
-    EXPECT_EQ(TypeOf(vec4_u32)->As<type::Vector>()->Width(), 4u);
-    EXPECT_EQ(TypeOf(vec4_f32)->As<type::Vector>()->Width(), 4u);
-    EXPECT_EQ(TypeOf(vec4_f16)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(vec4_bool)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec4_i32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec4_u32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec4_f32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec4_f16)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(vec4_bool)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
+    EXPECT_TRUE(TypeOf(vec4_i32)->As<core::type::Vector>()->type()->Is<core::type::I32>());
+    EXPECT_TRUE(TypeOf(vec4_u32)->As<core::type::Vector>()->type()->Is<core::type::U32>());
+    EXPECT_TRUE(TypeOf(vec4_f32)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_TRUE(TypeOf(vec4_f16)->As<core::type::Vector>()->type()->Is<core::type::F16>());
+    EXPECT_EQ(TypeOf(vec4_bool)->As<core::type::Vector>()->Width(), 4u);
+    EXPECT_EQ(TypeOf(vec4_i32)->As<core::type::Vector>()->Width(), 4u);
+    EXPECT_EQ(TypeOf(vec4_u32)->As<core::type::Vector>()->Width(), 4u);
+    EXPECT_EQ(TypeOf(vec4_f32)->As<core::type::Vector>()->Width(), 4u);
+    EXPECT_EQ(TypeOf(vec4_f16)->As<core::type::Vector>()->Width(), 4u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferVec4ElementTypeFromVec2AndVec2) {
@@ -2276,21 +2280,21 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(vec4_bool)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec4_i32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec4_u32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec4_f32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(vec4_f16)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(vec4_bool)->As<type::Vector>()->type()->Is<type::Bool>());
-    EXPECT_TRUE(TypeOf(vec4_i32)->As<type::Vector>()->type()->Is<type::I32>());
-    EXPECT_TRUE(TypeOf(vec4_u32)->As<type::Vector>()->type()->Is<type::U32>());
-    EXPECT_TRUE(TypeOf(vec4_f32)->As<type::Vector>()->type()->Is<type::F32>());
-    EXPECT_TRUE(TypeOf(vec4_f16)->As<type::Vector>()->type()->Is<type::F16>());
-    EXPECT_EQ(TypeOf(vec4_bool)->As<type::Vector>()->Width(), 4u);
-    EXPECT_EQ(TypeOf(vec4_i32)->As<type::Vector>()->Width(), 4u);
-    EXPECT_EQ(TypeOf(vec4_u32)->As<type::Vector>()->Width(), 4u);
-    EXPECT_EQ(TypeOf(vec4_f32)->As<type::Vector>()->Width(), 4u);
-    EXPECT_EQ(TypeOf(vec4_f16)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(vec4_bool)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec4_i32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec4_u32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec4_f32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(vec4_f16)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(vec4_bool)->As<core::type::Vector>()->type()->Is<core::type::Bool>());
+    EXPECT_TRUE(TypeOf(vec4_i32)->As<core::type::Vector>()->type()->Is<core::type::I32>());
+    EXPECT_TRUE(TypeOf(vec4_u32)->As<core::type::Vector>()->type()->Is<core::type::U32>());
+    EXPECT_TRUE(TypeOf(vec4_f32)->As<core::type::Vector>()->type()->Is<core::type::F32>());
+    EXPECT_TRUE(TypeOf(vec4_f16)->As<core::type::Vector>()->type()->Is<core::type::F16>());
+    EXPECT_EQ(TypeOf(vec4_bool)->As<core::type::Vector>()->Width(), 4u);
+    EXPECT_EQ(TypeOf(vec4_i32)->As<core::type::Vector>()->Width(), 4u);
+    EXPECT_EQ(TypeOf(vec4_u32)->As<core::type::Vector>()->Width(), 4u);
+    EXPECT_EQ(TypeOf(vec4_f32)->As<core::type::Vector>()->Width(), 4u);
+    EXPECT_EQ(TypeOf(vec4_f16)->As<core::type::Vector>()->Width(), 4u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferVecNoArgs) {
@@ -2304,15 +2308,15 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(v2)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(v3)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(v4)->Is<type::Vector>());
-    EXPECT_TRUE(TypeOf(v2)->As<type::Vector>()->type()->Is<type::AbstractInt>());
-    EXPECT_TRUE(TypeOf(v3)->As<type::Vector>()->type()->Is<type::AbstractInt>());
-    EXPECT_TRUE(TypeOf(v4)->As<type::Vector>()->type()->Is<type::AbstractInt>());
-    EXPECT_EQ(TypeOf(v2)->As<type::Vector>()->Width(), 2u);
-    EXPECT_EQ(TypeOf(v3)->As<type::Vector>()->Width(), 3u);
-    EXPECT_EQ(TypeOf(v4)->As<type::Vector>()->Width(), 4u);
+    ASSERT_TRUE(TypeOf(v2)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(v3)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(v4)->Is<core::type::Vector>());
+    EXPECT_TRUE(TypeOf(v2)->As<core::type::Vector>()->type()->Is<core::type::AbstractInt>());
+    EXPECT_TRUE(TypeOf(v3)->As<core::type::Vector>()->type()->Is<core::type::AbstractInt>());
+    EXPECT_TRUE(TypeOf(v4)->As<core::type::Vector>()->type()->Is<core::type::AbstractInt>());
+    EXPECT_EQ(TypeOf(v2)->As<core::type::Vector>()->Width(), 2u);
+    EXPECT_EQ(TypeOf(v3)->As<core::type::Vector>()->Width(), 3u);
+    EXPECT_EQ(TypeOf(v4)->As<core::type::Vector>()->Width(), 4u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, CannotInferVec2ElementTypeFromScalarsMismatch) {
@@ -3151,7 +3155,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, NonConstructibleType_Sampler) {
     WrapInFunction(
-        Assign(Phony(), Call(Source{{12, 34}}, ty.sampler(type::SamplerKind::kSampler))));
+        Assign(Phony(), Call(Source{{12, 34}}, ty.sampler(core::type::SamplerKind::kSampler))));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(), "12:34 error: type is not constructible");
diff --git a/src/tint/lang/wgsl/resolver/variable_test.cc b/src/tint/lang/wgsl/resolver/variable_test.cc
index 837b296..34c96e9 100644
--- a/src/tint/lang/wgsl/resolver/variable_test.cc
+++ b/src/tint/lang/wgsl/resolver/variable_test.cc
@@ -69,21 +69,21 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     // `var` declarations are always of reference type
-    ASSERT_TRUE(TypeOf(i)->Is<type::Reference>());
-    ASSERT_TRUE(TypeOf(u)->Is<type::Reference>());
-    ASSERT_TRUE(TypeOf(f)->Is<type::Reference>());
-    ASSERT_TRUE(TypeOf(h)->Is<type::Reference>());
-    ASSERT_TRUE(TypeOf(b)->Is<type::Reference>());
-    ASSERT_TRUE(TypeOf(s)->Is<type::Reference>());
-    ASSERT_TRUE(TypeOf(a)->Is<type::Reference>());
+    ASSERT_TRUE(TypeOf(i)->Is<core::type::Reference>());
+    ASSERT_TRUE(TypeOf(u)->Is<core::type::Reference>());
+    ASSERT_TRUE(TypeOf(f)->Is<core::type::Reference>());
+    ASSERT_TRUE(TypeOf(h)->Is<core::type::Reference>());
+    ASSERT_TRUE(TypeOf(b)->Is<core::type::Reference>());
+    ASSERT_TRUE(TypeOf(s)->Is<core::type::Reference>());
+    ASSERT_TRUE(TypeOf(a)->Is<core::type::Reference>());
 
-    EXPECT_TRUE(TypeOf(i)->As<type::Reference>()->StoreType()->Is<type::I32>());
-    EXPECT_TRUE(TypeOf(u)->As<type::Reference>()->StoreType()->Is<type::U32>());
-    EXPECT_TRUE(TypeOf(f)->As<type::Reference>()->StoreType()->Is<type::F32>());
-    EXPECT_TRUE(TypeOf(h)->As<type::Reference>()->StoreType()->Is<type::F16>());
-    EXPECT_TRUE(TypeOf(b)->As<type::Reference>()->StoreType()->Is<type::Bool>());
-    EXPECT_TRUE(TypeOf(s)->As<type::Reference>()->StoreType()->Is<type::Struct>());
-    EXPECT_TRUE(TypeOf(a)->As<type::Reference>()->StoreType()->Is<type::Struct>());
+    EXPECT_TRUE(TypeOf(i)->As<core::type::Reference>()->StoreType()->Is<core::type::I32>());
+    EXPECT_TRUE(TypeOf(u)->As<core::type::Reference>()->StoreType()->Is<core::type::U32>());
+    EXPECT_TRUE(TypeOf(f)->As<core::type::Reference>()->StoreType()->Is<core::type::F32>());
+    EXPECT_TRUE(TypeOf(h)->As<core::type::Reference>()->StoreType()->Is<core::type::F16>());
+    EXPECT_TRUE(TypeOf(b)->As<core::type::Reference>()->StoreType()->Is<core::type::Bool>());
+    EXPECT_TRUE(TypeOf(s)->As<core::type::Reference>()->StoreType()->Is<core::type::Struct>());
+    EXPECT_TRUE(TypeOf(a)->As<core::type::Reference>()->StoreType()->Is<core::type::Struct>());
 
     EXPECT_EQ(Sem().Get(i)->Initializer(), nullptr);
     EXPECT_EQ(Sem().Get(u)->Initializer(), nullptr);
@@ -142,28 +142,28 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     // `var` declarations are always of reference type
-    ASSERT_TRUE(TypeOf(i)->Is<type::Reference>());
-    ASSERT_TRUE(TypeOf(u)->Is<type::Reference>());
-    ASSERT_TRUE(TypeOf(f)->Is<type::Reference>());
-    ASSERT_TRUE(TypeOf(h)->Is<type::Reference>());
-    ASSERT_TRUE(TypeOf(b)->Is<type::Reference>());
-    ASSERT_TRUE(TypeOf(s)->Is<type::Reference>());
-    ASSERT_TRUE(TypeOf(a)->Is<type::Reference>());
+    ASSERT_TRUE(TypeOf(i)->Is<core::type::Reference>());
+    ASSERT_TRUE(TypeOf(u)->Is<core::type::Reference>());
+    ASSERT_TRUE(TypeOf(f)->Is<core::type::Reference>());
+    ASSERT_TRUE(TypeOf(h)->Is<core::type::Reference>());
+    ASSERT_TRUE(TypeOf(b)->Is<core::type::Reference>());
+    ASSERT_TRUE(TypeOf(s)->Is<core::type::Reference>());
+    ASSERT_TRUE(TypeOf(a)->Is<core::type::Reference>());
 
-    EXPECT_EQ(TypeOf(i)->As<type::Reference>()->Access(), core::Access::kReadWrite);
-    EXPECT_EQ(TypeOf(u)->As<type::Reference>()->Access(), core::Access::kReadWrite);
-    EXPECT_EQ(TypeOf(f)->As<type::Reference>()->Access(), core::Access::kReadWrite);
-    EXPECT_EQ(TypeOf(b)->As<type::Reference>()->Access(), core::Access::kReadWrite);
-    EXPECT_EQ(TypeOf(s)->As<type::Reference>()->Access(), core::Access::kReadWrite);
-    EXPECT_EQ(TypeOf(a)->As<type::Reference>()->Access(), core::Access::kReadWrite);
+    EXPECT_EQ(TypeOf(i)->As<core::type::Reference>()->Access(), core::Access::kReadWrite);
+    EXPECT_EQ(TypeOf(u)->As<core::type::Reference>()->Access(), core::Access::kReadWrite);
+    EXPECT_EQ(TypeOf(f)->As<core::type::Reference>()->Access(), core::Access::kReadWrite);
+    EXPECT_EQ(TypeOf(b)->As<core::type::Reference>()->Access(), core::Access::kReadWrite);
+    EXPECT_EQ(TypeOf(s)->As<core::type::Reference>()->Access(), core::Access::kReadWrite);
+    EXPECT_EQ(TypeOf(a)->As<core::type::Reference>()->Access(), core::Access::kReadWrite);
 
-    EXPECT_TRUE(TypeOf(i)->As<type::Reference>()->StoreType()->Is<type::I32>());
-    EXPECT_TRUE(TypeOf(u)->As<type::Reference>()->StoreType()->Is<type::U32>());
-    EXPECT_TRUE(TypeOf(f)->As<type::Reference>()->StoreType()->Is<type::F32>());
-    EXPECT_TRUE(TypeOf(h)->As<type::Reference>()->StoreType()->Is<type::F16>());
-    EXPECT_TRUE(TypeOf(b)->As<type::Reference>()->StoreType()->Is<type::Bool>());
-    EXPECT_TRUE(TypeOf(s)->As<type::Reference>()->StoreType()->Is<type::Struct>());
-    EXPECT_TRUE(TypeOf(a)->As<type::Reference>()->StoreType()->Is<type::Struct>());
+    EXPECT_TRUE(TypeOf(i)->As<core::type::Reference>()->StoreType()->Is<core::type::I32>());
+    EXPECT_TRUE(TypeOf(u)->As<core::type::Reference>()->StoreType()->Is<core::type::U32>());
+    EXPECT_TRUE(TypeOf(f)->As<core::type::Reference>()->StoreType()->Is<core::type::F32>());
+    EXPECT_TRUE(TypeOf(h)->As<core::type::Reference>()->StoreType()->Is<core::type::F16>());
+    EXPECT_TRUE(TypeOf(b)->As<core::type::Reference>()->StoreType()->Is<core::type::Bool>());
+    EXPECT_TRUE(TypeOf(s)->As<core::type::Reference>()->StoreType()->Is<core::type::Struct>());
+    EXPECT_TRUE(TypeOf(a)->As<core::type::Reference>()->StoreType()->Is<core::type::Struct>());
 
     EXPECT_EQ(Sem().Get(i)->Initializer()->Declaration(), i_c);
     EXPECT_EQ(Sem().Get(u)->Initializer()->Declaration(), u_c);
@@ -440,15 +440,15 @@
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
     // `let` declarations are always of the storage type
-    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<type::Struct>());
-    ASSERT_TRUE(TypeOf(a)->Is<type::Struct>());
-    ASSERT_TRUE(TypeOf(p)->Is<type::Pointer>());
-    ASSERT_TRUE(TypeOf(p)->As<type::Pointer>()->StoreType()->Is<type::I32>());
+    ASSERT_TRUE(TypeOf(i)->Is<core::type::I32>());
+    ASSERT_TRUE(TypeOf(u)->Is<core::type::U32>());
+    ASSERT_TRUE(TypeOf(f)->Is<core::type::F32>());
+    ASSERT_TRUE(TypeOf(h)->Is<core::type::F16>());
+    ASSERT_TRUE(TypeOf(b)->Is<core::type::Bool>());
+    ASSERT_TRUE(TypeOf(s)->Is<core::type::Struct>());
+    ASSERT_TRUE(TypeOf(a)->Is<core::type::Struct>());
+    ASSERT_TRUE(TypeOf(p)->Is<core::type::Pointer>());
+    ASSERT_TRUE(TypeOf(p)->As<core::type::Pointer>()->StoreType()->Is<core::type::I32>());
 
     EXPECT_EQ(Sem().Get(i)->Initializer()->Declaration(), i_c);
     EXPECT_EQ(Sem().Get(u)->Initializer()->Declaration(), u_c);
@@ -483,11 +483,11 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(expr)->Is<type::Reference>());
-    ASSERT_TRUE(TypeOf(ptr)->Is<type::Pointer>());
+    ASSERT_TRUE(TypeOf(expr)->Is<core::type::Reference>());
+    ASSERT_TRUE(TypeOf(ptr)->Is<core::type::Pointer>());
 
-    EXPECT_EQ(TypeOf(expr)->As<type::Reference>()->Access(), core::Access::kReadWrite);
-    EXPECT_EQ(TypeOf(ptr)->As<type::Pointer>()->Access(), core::Access::kReadWrite);
+    EXPECT_EQ(TypeOf(expr)->As<core::type::Reference>()->Access(), core::Access::kReadWrite);
+    EXPECT_EQ(TypeOf(ptr)->As<core::type::Pointer>()->Access(), core::Access::kReadWrite);
 }
 
 TEST_F(ResolverVariableTest, LocalLet_ShadowsAlias) {
@@ -918,14 +918,14 @@
     EXPECT_EQ(Sem().Get(c_mf32)->Declaration(), c_mf32);
     EXPECT_EQ(Sem().Get(c_s)->Declaration(), c_s);
 
-    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<type::Vector>());
-    ASSERT_TRUE(TypeOf(c_vu32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(c_vf32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(c_mf32)->Is<type::Matrix>());
-    ASSERT_TRUE(TypeOf(c_s)->Is<type::Struct>());
+    ASSERT_TRUE(TypeOf(c_i32)->Is<core::type::I32>());
+    ASSERT_TRUE(TypeOf(c_u32)->Is<core::type::U32>());
+    ASSERT_TRUE(TypeOf(c_f32)->Is<core::type::F32>());
+    ASSERT_TRUE(TypeOf(c_vi32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(c_vu32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(c_vf32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(c_mf32)->Is<core::type::Matrix>());
+    ASSERT_TRUE(TypeOf(c_s)->Is<core::type::Struct>());
 
     EXPECT_TRUE(Sem().Get(c_i32)->ConstantValue()->AllZero());
     EXPECT_TRUE(Sem().Get(c_u32)->ConstantValue()->AllZero());
@@ -976,19 +976,19 @@
     EXPECT_EQ(Sem().Get(c_maf32)->Declaration(), c_maf32);
     EXPECT_EQ(Sem().Get(c_s)->Declaration(), c_s);
 
-    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<type::Vector>());
-    ASSERT_TRUE(TypeOf(c_vu32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(c_vf32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(c_vai)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(c_vaf)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(c_mf32)->Is<type::Matrix>());
-    ASSERT_TRUE(TypeOf(c_maf32)->Is<type::Matrix>());
-    ASSERT_TRUE(TypeOf(c_s)->Is<type::Struct>());
+    ASSERT_TRUE(TypeOf(c_i32)->Is<core::type::I32>());
+    ASSERT_TRUE(TypeOf(c_u32)->Is<core::type::U32>());
+    ASSERT_TRUE(TypeOf(c_f32)->Is<core::type::F32>());
+    ASSERT_TRUE(TypeOf(c_ai)->Is<core::type::AbstractInt>());
+    ASSERT_TRUE(TypeOf(c_af)->Is<core::type::AbstractFloat>());
+    ASSERT_TRUE(TypeOf(c_vi32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(c_vu32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(c_vf32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(c_vai)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(c_vaf)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(c_mf32)->Is<core::type::Matrix>());
+    ASSERT_TRUE(TypeOf(c_maf32)->Is<core::type::Matrix>());
+    ASSERT_TRUE(TypeOf(c_s)->Is<core::type::Struct>());
 
     EXPECT_TRUE(Sem().Get(c_i32)->ConstantValue()->AllZero());
     EXPECT_TRUE(Sem().Get(c_u32)->ConstantValue()->AllZero());
@@ -1014,7 +1014,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(c)->Is<type::I32>());
+    ASSERT_TRUE(TypeOf(c)->Is<core::type::I32>());
 
     EXPECT_EQ(Sem().Get(c)->ConstantValue()->ValueAs<i32>(), 42_i);
 }
@@ -1026,7 +1026,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(c)->Is<type::I32>());
+    ASSERT_TRUE(TypeOf(c)->Is<core::type::I32>());
 
     EXPECT_EQ(Sem().Get(c)->ConstantValue()->ValueAs<i32>(), 3_i);
 }
@@ -1044,22 +1044,22 @@
         GlobalVar("ub", ty.Of(buf), core::AddressSpace::kUniform, Binding(0_a), Group(0_a));
     auto* storage =
         GlobalVar("sb", ty.Of(buf), core::AddressSpace::kStorage, Binding(1_a), Group(0_a));
-    auto* handle =
-        GlobalVar("h", ty.depth_texture(type::TextureDimension::k2d), Binding(2_a), Group(0_a));
+    auto* handle = GlobalVar("h", ty.depth_texture(core::type::TextureDimension::k2d), Binding(2_a),
+                             Group(0_a));
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(private_)->Is<type::Reference>());
-    ASSERT_TRUE(TypeOf(workgroup)->Is<type::Reference>());
-    ASSERT_TRUE(TypeOf(uniform)->Is<type::Reference>());
-    ASSERT_TRUE(TypeOf(storage)->Is<type::Reference>());
-    ASSERT_TRUE(TypeOf(handle)->Is<type::Reference>());
+    ASSERT_TRUE(TypeOf(private_)->Is<core::type::Reference>());
+    ASSERT_TRUE(TypeOf(workgroup)->Is<core::type::Reference>());
+    ASSERT_TRUE(TypeOf(uniform)->Is<core::type::Reference>());
+    ASSERT_TRUE(TypeOf(storage)->Is<core::type::Reference>());
+    ASSERT_TRUE(TypeOf(handle)->Is<core::type::Reference>());
 
-    EXPECT_EQ(TypeOf(private_)->As<type::Reference>()->Access(), core::Access::kReadWrite);
-    EXPECT_EQ(TypeOf(workgroup)->As<type::Reference>()->Access(), core::Access::kReadWrite);
-    EXPECT_EQ(TypeOf(uniform)->As<type::Reference>()->Access(), core::Access::kRead);
-    EXPECT_EQ(TypeOf(storage)->As<type::Reference>()->Access(), core::Access::kRead);
-    EXPECT_EQ(TypeOf(handle)->As<type::Reference>()->Access(), core::Access::kRead);
+    EXPECT_EQ(TypeOf(private_)->As<core::type::Reference>()->Access(), core::Access::kReadWrite);
+    EXPECT_EQ(TypeOf(workgroup)->As<core::type::Reference>()->Access(), core::Access::kReadWrite);
+    EXPECT_EQ(TypeOf(uniform)->As<core::type::Reference>()->Access(), core::Access::kRead);
+    EXPECT_EQ(TypeOf(storage)->As<core::type::Reference>()->Access(), core::Access::kRead);
+    EXPECT_EQ(TypeOf(handle)->As<core::type::Reference>()->Access(), core::Access::kRead);
 }
 
 TEST_F(ResolverVariableTest, GlobalVar_ExplicitAddressSpace) {
@@ -1071,9 +1071,9 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(storage)->Is<type::Reference>());
+    ASSERT_TRUE(TypeOf(storage)->Is<core::type::Reference>());
 
-    EXPECT_EQ(TypeOf(storage)->As<type::Reference>()->Access(), core::Access::kReadWrite);
+    EXPECT_EQ(TypeOf(storage)->As<core::type::Reference>()->Access(), core::Access::kReadWrite);
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1098,13 +1098,13 @@
     EXPECT_EQ(Sem().Get(c_vf32)->Declaration(), c_vf32);
     EXPECT_EQ(Sem().Get(c_mf32)->Declaration(), c_mf32);
 
-    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<type::Vector>());
-    ASSERT_TRUE(TypeOf(c_vu32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(c_vf32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(c_mf32)->Is<type::Matrix>());
+    ASSERT_TRUE(TypeOf(c_i32)->Is<core::type::I32>());
+    ASSERT_TRUE(TypeOf(c_u32)->Is<core::type::U32>());
+    ASSERT_TRUE(TypeOf(c_f32)->Is<core::type::F32>());
+    ASSERT_TRUE(TypeOf(c_vi32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(c_vu32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(c_vf32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(c_mf32)->Is<core::type::Matrix>());
 
     EXPECT_TRUE(Sem().Get(c_i32)->ConstantValue()->AllZero());
     EXPECT_TRUE(Sem().Get(c_u32)->ConstantValue()->AllZero());
@@ -1147,18 +1147,18 @@
     EXPECT_EQ(Sem().Get(c_mf32)->Declaration(), c_mf32);
     EXPECT_EQ(Sem().Get(c_maf32)->Declaration(), c_maf32);
 
-    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<type::Vector>());
-    ASSERT_TRUE(TypeOf(c_vu32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(c_vf32)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(c_vai)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(c_vaf)->Is<type::Vector>());
-    ASSERT_TRUE(TypeOf(c_mf32)->Is<type::Matrix>());
-    ASSERT_TRUE(TypeOf(c_maf32)->Is<type::Matrix>());
+    ASSERT_TRUE(TypeOf(c_i32)->Is<core::type::I32>());
+    ASSERT_TRUE(TypeOf(c_u32)->Is<core::type::U32>());
+    ASSERT_TRUE(TypeOf(c_f32)->Is<core::type::F32>());
+    ASSERT_TRUE(TypeOf(c_ai)->Is<core::type::AbstractInt>());
+    ASSERT_TRUE(TypeOf(c_af)->Is<core::type::AbstractFloat>());
+    ASSERT_TRUE(TypeOf(c_vi32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(c_vu32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(c_vf32)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(c_vai)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(c_vaf)->Is<core::type::Vector>());
+    ASSERT_TRUE(TypeOf(c_mf32)->Is<core::type::Matrix>());
+    ASSERT_TRUE(TypeOf(c_maf32)->Is<core::type::Matrix>());
 
     EXPECT_TRUE(Sem().Get(c_i32)->ConstantValue()->AllZero());
     EXPECT_TRUE(Sem().Get(c_u32)->ConstantValue()->AllZero());
@@ -1181,7 +1181,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(c)->Is<type::I32>());
+    ASSERT_TRUE(TypeOf(c)->Is<core::type::I32>());
 
     EXPECT_EQ(Sem().Get(c)->ConstantValue()->ValueAs<i32>(), 42_i);
 }
@@ -1191,7 +1191,7 @@
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
-    ASSERT_TRUE(TypeOf(c)->Is<type::I32>());
+    ASSERT_TRUE(TypeOf(c)->Is<core::type::I32>());
 
     EXPECT_EQ(Sem().Get(c)->ConstantValue()->ValueAs<i32>(), 3_i);
 }
diff --git a/src/tint/lang/wgsl/resolver/variable_validation_test.cc b/src/tint/lang/wgsl/resolver/variable_validation_test.cc
index 20e50e8..c7abf4e 100644
--- a/src/tint/lang/wgsl/resolver/variable_validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/variable_validation_test.cc
@@ -144,7 +144,7 @@
 TEST_F(ResolverVariableValidationTest, LetTypeNotConstructible) {
     // @group(0) @binding(0) var t1 : texture_2d<f32>;
     // let t2 : t1;
-    auto* t1 = GlobalVar("t1", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()),
+    auto* t1 = GlobalVar("t1", ty.sampled_texture(core::type::TextureDimension::k2d, ty.f32()),
                          Group(0_a), Binding(0_a));
     auto* t2 = Let(Source{{56, 78}}, "t2", Expr(t1));
     WrapInFunction(t2);
@@ -367,7 +367,7 @@
     // fn foo() {
     //   var v = s;
     // }
-    GlobalVar("s", ty.sampler(type::SamplerKind::kSampler), Group(0_a), Binding(0_a));
+    GlobalVar("s", ty.sampler(core::type::SamplerKind::kSampler), Group(0_a), Binding(0_a));
     auto* v = Var(Source{{12, 34}}, "v", Expr("s"));
     WrapInFunction(v);
 
diff --git a/src/tint/lang/wgsl/sem/accessor_expression.cc b/src/tint/lang/wgsl/sem/accessor_expression.cc
index a0e3218..5872d3a 100644
--- a/src/tint/lang/wgsl/sem/accessor_expression.cc
+++ b/src/tint/lang/wgsl/sem/accessor_expression.cc
@@ -23,7 +23,7 @@
 namespace tint::sem {
 
 AccessorExpression::AccessorExpression(const ast::AccessorExpression* declaration,
-                                       const type::Type* type,
+                                       const core::type::Type* type,
                                        core::EvaluationStage stage,
                                        const ValueExpression* object,
                                        const Statement* statement,
diff --git a/src/tint/lang/wgsl/sem/accessor_expression.h b/src/tint/lang/wgsl/sem/accessor_expression.h
index b89db50..b7090a4 100644
--- a/src/tint/lang/wgsl/sem/accessor_expression.h
+++ b/src/tint/lang/wgsl/sem/accessor_expression.h
@@ -48,7 +48,7 @@
     /// @param has_side_effects whether this expression may have side effects
     /// @param root_ident the (optional) root identifier for this expression
     AccessorExpression(const ast::AccessorExpression* declaration,
-                       const type::Type* type,
+                       const core::type::Type* type,
                        core::EvaluationStage stage,
                        const ValueExpression* object,
                        const Statement* statement,
diff --git a/src/tint/lang/wgsl/sem/array_count.cc b/src/tint/lang/wgsl/sem/array_count.cc
index 407d6b2..84aaafb 100644
--- a/src/tint/lang/wgsl/sem/array_count.cc
+++ b/src/tint/lang/wgsl/sem/array_count.cc
@@ -37,7 +37,7 @@
     return variable->Declaration()->name->symbol.Name();
 }
 
-type::ArrayCount* NamedOverrideArrayCount::Clone(type::CloneContext&) const {
+core::type::ArrayCount* NamedOverrideArrayCount::Clone(core::type::CloneContext&) const {
     TINT_UNREACHABLE() << "Named override array count clone not available";
     return nullptr;
 }
@@ -58,7 +58,7 @@
     return "[unnamed override-expression]";
 }
 
-type::ArrayCount* UnnamedOverrideArrayCount::Clone(type::CloneContext&) const {
+core::type::ArrayCount* UnnamedOverrideArrayCount::Clone(core::type::CloneContext&) const {
     TINT_UNREACHABLE() << "Unnamed override array count clone not available";
     return nullptr;
 }
diff --git a/src/tint/lang/wgsl/sem/array_count.h b/src/tint/lang/wgsl/sem/array_count.h
index 82f8f51..87bf5ac 100644
--- a/src/tint/lang/wgsl/sem/array_count.h
+++ b/src/tint/lang/wgsl/sem/array_count.h
@@ -29,7 +29,8 @@
 /// override N : i32;
 /// type arr = array<i32, N>
 /// ```
-class NamedOverrideArrayCount final : public Castable<NamedOverrideArrayCount, type::ArrayCount> {
+class NamedOverrideArrayCount final
+    : public Castable<NamedOverrideArrayCount, core::type::ArrayCount> {
   public:
     /// Constructor
     /// @param var the `override` variable
@@ -38,14 +39,14 @@
 
     /// @param other the other node
     /// @returns true if this array count is equal @p other
-    bool Equals(const type::UniqueNode& other) const override;
+    bool Equals(const core::type::UniqueNode& other) const override;
 
     /// @returns the friendly name for this array count
     std::string FriendlyName() const override;
 
     /// @param ctx the clone context
     /// @returns a clone of this type
-    type::ArrayCount* Clone(type::CloneContext& ctx) const override;
+    core::type::ArrayCount* Clone(core::type::CloneContext& ctx) const override;
 
     /// The `override` variable.
     const GlobalVariable* variable;
@@ -58,7 +59,7 @@
 /// type arr = array<i32, N*2>
 /// ```
 class UnnamedOverrideArrayCount final
-    : public Castable<UnnamedOverrideArrayCount, type::ArrayCount> {
+    : public Castable<UnnamedOverrideArrayCount, core::type::ArrayCount> {
   public:
     /// Constructor
     /// @param e the override expression
@@ -67,14 +68,14 @@
 
     /// @param other the other node
     /// @returns true if this array count is equal @p other
-    bool Equals(const type::UniqueNode& other) const override;
+    bool Equals(const core::type::UniqueNode& other) const override;
 
     /// @returns the friendly name for this array count
     std::string FriendlyName() const override;
 
     /// @param ctx the clone context
     /// @returns a clone of this type
-    type::ArrayCount* Clone(type::CloneContext& ctx) const override;
+    core::type::ArrayCount* Clone(core::type::CloneContext& ctx) const override;
 
     /// The unnamed override expression.
     /// Note: Each AST expression gets a unique semantic expression node, so two equivalent AST
diff --git a/src/tint/lang/wgsl/sem/builtin.cc b/src/tint/lang/wgsl/sem/builtin.cc
index 73908c4..ece6ded 100644
--- a/src/tint/lang/wgsl/sem/builtin.cc
+++ b/src/tint/lang/wgsl/sem/builtin.cc
@@ -31,7 +31,7 @@
 }
 
 Builtin::Builtin(core::Function type,
-                 const type::Type* return_type,
+                 const core::type::Type* return_type,
                  VectorRef<Parameter*> parameters,
                  core::EvaluationStage eval_stage,
                  PipelineStageSet supported_stages,
diff --git a/src/tint/lang/wgsl/sem/builtin.h b/src/tint/lang/wgsl/sem/builtin.h
index 82773d5..64ee5c2 100644
--- a/src/tint/lang/wgsl/sem/builtin.h
+++ b/src/tint/lang/wgsl/sem/builtin.h
@@ -38,7 +38,7 @@
     /// @param is_deprecated true if the particular overload is considered deprecated
     /// @param must_use true if the builtin was annotated with `@must_use`
     Builtin(core::Function type,
-            const type::Type* return_type,
+            const core::type::Type* return_type,
             VectorRef<Parameter*> parameters,
             core::EvaluationStage eval_stage,
             PipelineStageSet supported_stages,
diff --git a/src/tint/lang/wgsl/sem/builtin_enum_expression.h b/src/tint/lang/wgsl/sem/builtin_enum_expression.h
index fb56aea..06cb2ef 100644
--- a/src/tint/lang/wgsl/sem/builtin_enum_expression.h
+++ b/src/tint/lang/wgsl/sem/builtin_enum_expression.h
@@ -18,9 +18,9 @@
 #include "src/tint/lang/wgsl/sem/expression.h"
 
 // Forward declarations
-namespace tint::type {
+namespace tint::core::type {
 class Type;
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 namespace tint::sem {
 
diff --git a/src/tint/lang/wgsl/sem/call_target.cc b/src/tint/lang/wgsl/sem/call_target.cc
index 08f709a..a2923c1 100644
--- a/src/tint/lang/wgsl/sem/call_target.cc
+++ b/src/tint/lang/wgsl/sem/call_target.cc
@@ -26,7 +26,7 @@
 CallTarget::CallTarget(core::EvaluationStage stage, bool must_use)
     : stage_(stage), must_use_(must_use) {}
 
-CallTarget::CallTarget(const type::Type* return_type,
+CallTarget::CallTarget(const core::type::Type* return_type,
                        VectorRef<Parameter*> parameters,
                        core::EvaluationStage stage,
                        bool must_use)
@@ -43,7 +43,7 @@
 
 CallTargetSignature::CallTargetSignature() = default;
 
-CallTargetSignature::CallTargetSignature(const type::Type* ret_ty,
+CallTargetSignature::CallTargetSignature(const core::type::Type* ret_ty,
                                          VectorRef<const sem::Parameter*> params)
     : return_type(ret_ty), parameters(std::move(params)) {}
 CallTargetSignature::CallTargetSignature(const CallTargetSignature&) = default;
diff --git a/src/tint/lang/wgsl/sem/call_target.h b/src/tint/lang/wgsl/sem/call_target.h
index 075b644..1b97aa7 100644
--- a/src/tint/lang/wgsl/sem/call_target.h
+++ b/src/tint/lang/wgsl/sem/call_target.h
@@ -33,7 +33,7 @@
     /// Constructor
     /// @param ret_ty the call target return type
     /// @param params the call target parameters
-    CallTargetSignature(const type::Type* ret_ty, VectorRef<const Parameter*> params);
+    CallTargetSignature(const core::type::Type* ret_ty, VectorRef<const Parameter*> params);
 
     /// Copy constructor
     CallTargetSignature(const CallTargetSignature&);
@@ -42,7 +42,7 @@
     ~CallTargetSignature();
 
     /// The type of the call target return value
-    const type::Type* return_type = nullptr;
+    const core::type::Type* return_type = nullptr;
     /// The parameters of the call target
     tint::Vector<const sem::Parameter*, 8> parameters;
 
@@ -81,7 +81,7 @@
     /// @param stage the earliest evaluation stage for a call to this target
     /// @param must_use the result of the call target must be used, i.e. it cannot be used as a call
     /// statement.
-    CallTarget(const type::Type* return_type,
+    CallTarget(const core::type::Type* return_type,
                VectorRef<Parameter*> parameters,
                core::EvaluationStage stage,
                bool must_use);
@@ -94,10 +94,10 @@
 
     /// Sets the call target's return type
     /// @param ty the parameter
-    void SetReturnType(const type::Type* ty) { signature_.return_type = ty; }
+    void SetReturnType(const core::type::Type* ty) { signature_.return_type = ty; }
 
     /// @return the return type of the call target
-    const type::Type* ReturnType() const { return signature_.return_type; }
+    const core::type::Type* ReturnType() const { return signature_.return_type; }
 
     /// Adds a parameter to the call target
     /// @param parameter the parameter
diff --git a/src/tint/lang/wgsl/sem/function.cc b/src/tint/lang/wgsl/sem/function.cc
index bde4a9d..1d1b9e3 100644
--- a/src/tint/lang/wgsl/sem/function.cc
+++ b/src/tint/lang/wgsl/sem/function.cc
@@ -98,11 +98,11 @@
 }
 
 Function::VariableBindings Function::TransitivelyReferencedSamplerVariables() const {
-    return TransitivelyReferencedSamplerVariablesImpl(type::SamplerKind::kSampler);
+    return TransitivelyReferencedSamplerVariablesImpl(core::type::SamplerKind::kSampler);
 }
 
 Function::VariableBindings Function::TransitivelyReferencedComparisonSamplerVariables() const {
-    return TransitivelyReferencedSamplerVariablesImpl(type::SamplerKind::kComparisonSampler);
+    return TransitivelyReferencedSamplerVariablesImpl(core::type::SamplerKind::kComparisonSampler);
 }
 
 Function::VariableBindings Function::TransitivelyReferencedSampledTextureVariables() const {
@@ -137,12 +137,12 @@
 }
 
 Function::VariableBindings Function::TransitivelyReferencedSamplerVariablesImpl(
-    type::SamplerKind kind) const {
+    core::type::SamplerKind kind) const {
     VariableBindings ret;
 
     for (auto* global : TransitivelyReferencedGlobals()) {
         auto* unwrapped_type = global->Type()->UnwrapRef();
-        auto* sampler = unwrapped_type->As<type::Sampler>();
+        auto* sampler = unwrapped_type->As<core::type::Sampler>();
         if (sampler == nullptr || sampler->kind() != kind) {
             continue;
         }
@@ -160,13 +160,13 @@
 
     for (auto* global : TransitivelyReferencedGlobals()) {
         auto* unwrapped_type = global->Type()->UnwrapRef();
-        auto* texture = unwrapped_type->As<type::Texture>();
+        auto* texture = unwrapped_type->As<core::type::Texture>();
         if (texture == nullptr) {
             continue;
         }
 
-        auto is_multisampled = texture->Is<type::MultisampledTexture>();
-        auto is_sampled = texture->Is<type::SampledTexture>();
+        auto is_multisampled = texture->Is<core::type::MultisampledTexture>();
+        auto is_sampled = texture->Is<core::type::SampledTexture>();
 
         if ((multisampled && !is_multisampled) || (!multisampled && !is_sampled)) {
             continue;
diff --git a/src/tint/lang/wgsl/sem/function.h b/src/tint/lang/wgsl/sem/function.h
index 10af0f0..5638dbd 100644
--- a/src/tint/lang/wgsl/sem/function.h
+++ b/src/tint/lang/wgsl/sem/function.h
@@ -279,7 +279,7 @@
     Function(const Function&) = delete;
     Function(Function&&) = delete;
 
-    VariableBindings TransitivelyReferencedSamplerVariablesImpl(type::SamplerKind kind) const;
+    VariableBindings TransitivelyReferencedSamplerVariablesImpl(core::type::SamplerKind kind) const;
     VariableBindings TransitivelyReferencedSampledTextureVariablesImpl(bool multisampled) const;
 
     const ast::Function* const declaration_;
diff --git a/src/tint/lang/wgsl/sem/index_accessor_expression.cc b/src/tint/lang/wgsl/sem/index_accessor_expression.cc
index 1386780..1e3712d 100644
--- a/src/tint/lang/wgsl/sem/index_accessor_expression.cc
+++ b/src/tint/lang/wgsl/sem/index_accessor_expression.cc
@@ -23,7 +23,7 @@
 namespace tint::sem {
 
 IndexAccessorExpression::IndexAccessorExpression(const ast::IndexAccessorExpression* declaration,
-                                                 const type::Type* type,
+                                                 const core::type::Type* type,
                                                  core::EvaluationStage stage,
                                                  const ValueExpression* object,
                                                  const ValueExpression* index,
diff --git a/src/tint/lang/wgsl/sem/index_accessor_expression.h b/src/tint/lang/wgsl/sem/index_accessor_expression.h
index fb9dfc0..b91b4d8 100644
--- a/src/tint/lang/wgsl/sem/index_accessor_expression.h
+++ b/src/tint/lang/wgsl/sem/index_accessor_expression.h
@@ -36,7 +36,7 @@
     /// @param has_side_effects whether this expression may have side effects
     /// @param root_ident the (optional) root identifier for this expression
     IndexAccessorExpression(const ast::IndexAccessorExpression* declaration,
-                            const type::Type* type,
+                            const core::type::Type* type,
                             core::EvaluationStage stage,
                             const ValueExpression* object,
                             const ValueExpression* index,
diff --git a/src/tint/lang/wgsl/sem/info.h b/src/tint/lang/wgsl/sem/info.h
index 009cf6a..3cdbc9a 100644
--- a/src/tint/lang/wgsl/sem/info.h
+++ b/src/tint/lang/wgsl/sem/info.h
@@ -32,10 +32,10 @@
 class Module;
 class ValueExpression;
 }  // namespace tint::sem
-namespace tint::type {
+namespace tint::core::type {
 class Node;
 class Type;
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 namespace tint::sem {
 
diff --git a/src/tint/lang/wgsl/sem/load.cc b/src/tint/lang/wgsl/sem/load.cc
index 85eea03..60eb221 100644
--- a/src/tint/lang/wgsl/sem/load.cc
+++ b/src/tint/lang/wgsl/sem/load.cc
@@ -29,7 +29,7 @@
            /* has_side_effects */ ref->HasSideEffects(),
            /* root_ident */ ref->RootIdentifier()),
       reference_(ref) {
-    TINT_ASSERT(ref->Type()->Is<type::Reference>());
+    TINT_ASSERT(ref->Type()->Is<core::type::Reference>());
 }
 
 Load::~Load() = default;
diff --git a/src/tint/lang/wgsl/sem/load.h b/src/tint/lang/wgsl/sem/load.h
index 705f4b1..ba8f488 100644
--- a/src/tint/lang/wgsl/sem/load.h
+++ b/src/tint/lang/wgsl/sem/load.h
@@ -37,8 +37,8 @@
     const ValueExpression* Reference() const { return reference_; }
 
     /// @returns the type of the loaded reference.
-    const type::Reference* ReferenceType() const {
-        return static_cast<const type::Reference*>(reference_->Type());
+    const core::type::Reference* ReferenceType() const {
+        return static_cast<const core::type::Reference*>(reference_->Type());
     }
 
   private:
diff --git a/src/tint/lang/wgsl/sem/materialize.cc b/src/tint/lang/wgsl/sem/materialize.cc
index 2f3769c..c372e6d 100644
--- a/src/tint/lang/wgsl/sem/materialize.cc
+++ b/src/tint/lang/wgsl/sem/materialize.cc
@@ -19,7 +19,7 @@
 namespace tint::sem {
 Materialize::Materialize(const ValueExpression* expr,
                          const Statement* statement,
-                         const type::Type* type,
+                         const core::type::Type* type,
                          const core::constant::Value* constant)
     : Base(/* declaration */ expr->Declaration(),
            /* type */ type,
diff --git a/src/tint/lang/wgsl/sem/materialize.h b/src/tint/lang/wgsl/sem/materialize.h
index af8389f..319eb8f 100644
--- a/src/tint/lang/wgsl/sem/materialize.h
+++ b/src/tint/lang/wgsl/sem/materialize.h
@@ -34,7 +34,7 @@
     /// @param constant the constant value of this expression or nullptr
     Materialize(const ValueExpression* expr,
                 const Statement* statement,
-                const type::Type* type,
+                const core::type::Type* type,
                 const core::constant::Value* constant);
 
     /// Destructor
diff --git a/src/tint/lang/wgsl/sem/member_accessor_expression.cc b/src/tint/lang/wgsl/sem/member_accessor_expression.cc
index 7fdf91d..4051e66 100644
--- a/src/tint/lang/wgsl/sem/member_accessor_expression.cc
+++ b/src/tint/lang/wgsl/sem/member_accessor_expression.cc
@@ -24,7 +24,7 @@
 namespace tint::sem {
 
 MemberAccessorExpression::MemberAccessorExpression(const ast::MemberAccessorExpression* declaration,
-                                                   const type::Type* type,
+                                                   const core::type::Type* type,
                                                    core::EvaluationStage stage,
                                                    const Statement* statement,
                                                    const core::constant::Value* constant,
@@ -36,11 +36,11 @@
 MemberAccessorExpression::~MemberAccessorExpression() = default;
 
 StructMemberAccess::StructMemberAccess(const ast::MemberAccessorExpression* declaration,
-                                       const type::Type* type,
+                                       const core::type::Type* type,
                                        const Statement* statement,
                                        const core::constant::Value* constant,
                                        const ValueExpression* object,
-                                       const type::StructMember* member,
+                                       const core::type::StructMember* member,
                                        bool has_side_effects,
                                        const Variable* root_ident /* = nullptr */)
     : Base(declaration,
@@ -56,7 +56,7 @@
 StructMemberAccess::~StructMemberAccess() = default;
 
 Swizzle::Swizzle(const ast::MemberAccessorExpression* declaration,
-                 const type::Type* type,
+                 const core::type::Type* type,
                  const Statement* statement,
                  const core::constant::Value* constant,
                  const ValueExpression* object,
diff --git a/src/tint/lang/wgsl/sem/member_accessor_expression.h b/src/tint/lang/wgsl/sem/member_accessor_expression.h
index e7b6a20..a84496a 100644
--- a/src/tint/lang/wgsl/sem/member_accessor_expression.h
+++ b/src/tint/lang/wgsl/sem/member_accessor_expression.h
@@ -22,9 +22,9 @@
 namespace tint::ast {
 class MemberAccessorExpression;
 }  // namespace tint::ast
-namespace tint::type {
+namespace tint::core::type {
 class StructMember;
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 namespace tint::sem {
 
@@ -46,7 +46,7 @@
     /// @param has_side_effects whether this expression may have side effects
     /// @param root_ident the (optional) root identifier for this expression
     MemberAccessorExpression(const ast::MemberAccessorExpression* declaration,
-                             const type::Type* type,
+                             const core::type::Type* type,
                              core::EvaluationStage stage,
                              const Statement* statement,
                              const core::constant::Value* constant,
@@ -70,11 +70,11 @@
     /// @param has_side_effects whether this expression may have side effects
     /// @param root_ident the (optional) root identifier for this expression
     StructMemberAccess(const ast::MemberAccessorExpression* declaration,
-                       const type::Type* type,
+                       const core::type::Type* type,
                        const Statement* statement,
                        const core::constant::Value* constant,
                        const ValueExpression* object,
-                       const type::StructMember* member,
+                       const core::type::StructMember* member,
                        bool has_side_effects,
                        const Variable* root_ident = nullptr);
 
@@ -82,10 +82,10 @@
     ~StructMemberAccess() override;
 
     /// @returns the structure member
-    type::StructMember const* Member() const { return member_; }
+    core::type::StructMember const* Member() const { return member_; }
 
   private:
-    type::StructMember const* const member_;
+    core::type::StructMember const* const member_;
 };
 
 /// Swizzle holds the semantic information for a ast::MemberAccessorExpression
@@ -102,7 +102,7 @@
     /// @param has_side_effects whether this expression may have side effects
     /// @param root_ident the (optional) root identifier for this expression
     Swizzle(const ast::MemberAccessorExpression* declaration,
-            const type::Type* type,
+            const core::type::Type* type,
             const Statement* statement,
             const core::constant::Value* constant,
             const ValueExpression* object,
diff --git a/src/tint/lang/wgsl/sem/struct.cc b/src/tint/lang/wgsl/sem/struct.cc
index 07d79f8..ed82c54 100644
--- a/src/tint/lang/wgsl/sem/struct.cc
+++ b/src/tint/lang/wgsl/sem/struct.cc
@@ -35,12 +35,12 @@
 
 StructMember::StructMember(const ast::StructMember* declaration,
                            Symbol name,
-                           const type::Type* type,
+                           const core::type::Type* type,
                            uint32_t index,
                            uint32_t offset,
                            uint32_t align,
                            uint32_t size,
-                           const type::StructMemberAttributes& attributes)
+                           const core::type::StructMemberAttributes& attributes)
     : Base(name, type, index, offset, align, size, attributes), declaration_(declaration) {
     TINT_ASSERT(declaration != nullptr);
 }
diff --git a/src/tint/lang/wgsl/sem/struct.h b/src/tint/lang/wgsl/sem/struct.h
index 1a483c5..77472aa 100644
--- a/src/tint/lang/wgsl/sem/struct.h
+++ b/src/tint/lang/wgsl/sem/struct.h
@@ -31,15 +31,15 @@
 namespace tint::sem {
 class StructMember;
 }  // namespace tint::sem
-namespace tint::type {
+namespace tint::core::type {
 class StructMember;
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 namespace tint::sem {
 
 /// Struct holds the semantic information for structures.
-/// Unlike type::Struct, sem::Struct has an AST declaration node.
-class Struct final : public Castable<Struct, type::Struct> {
+/// Unlike core::type::Struct, sem::Struct has an AST declaration node.
+class Struct final : public Castable<Struct, core::type::Struct> {
   public:
     /// Constructor
     /// @param declaration the AST structure declaration
@@ -71,8 +71,8 @@
 };
 
 /// StructMember holds the semantic information for structure members.
-/// Unlike type::StructMember, sem::StructMember has an AST declaration node.
-class StructMember final : public Castable<StructMember, type::StructMember> {
+/// Unlike core::type::StructMember, sem::StructMember has an AST declaration node.
+class StructMember final : public Castable<StructMember, core::type::StructMember> {
   public:
     /// Constructor
     /// @param declaration the AST declaration node
@@ -85,12 +85,12 @@
     /// @param attributes the optional attributes
     StructMember(const ast::StructMember* declaration,
                  Symbol name,
-                 const type::Type* type,
+                 const core::type::Type* type,
                  uint32_t index,
                  uint32_t offset,
                  uint32_t align,
                  uint32_t size,
-                 const type::StructMemberAttributes& attributes);
+                 const core::type::StructMemberAttributes& attributes);
 
     /// Destructor
     ~StructMember() override;
diff --git a/src/tint/lang/wgsl/sem/struct_test.cc b/src/tint/lang/wgsl/sem/struct_test.cc
index f6c3340..7b6c01a 100644
--- a/src/tint/lang/wgsl/sem/struct_test.cc
+++ b/src/tint/lang/wgsl/sem/struct_test.cc
@@ -44,7 +44,7 @@
 
     EXPECT_TRUE(a->Equals(*a));
     EXPECT_FALSE(a->Equals(*b));
-    EXPECT_FALSE(a->Equals(type::Void{}));
+    EXPECT_FALSE(a->Equals(core::type::Void{}));
 }
 
 TEST_F(SemStructTest, FriendlyName) {
diff --git a/src/tint/lang/wgsl/sem/type_expression.cc b/src/tint/lang/wgsl/sem/type_expression.cc
index aeab271..702c609 100644
--- a/src/tint/lang/wgsl/sem/type_expression.cc
+++ b/src/tint/lang/wgsl/sem/type_expression.cc
@@ -20,7 +20,7 @@
 
 TypeExpression::TypeExpression(const ast::Expression* declaration,
                                const Statement* statement,
-                               const type::Type* type)
+                               const core::type::Type* type)
     : Base(declaration, statement), type_(type) {}
 
 TypeExpression::~TypeExpression() = default;
diff --git a/src/tint/lang/wgsl/sem/type_expression.h b/src/tint/lang/wgsl/sem/type_expression.h
index 6850f8a..c8f9563 100644
--- a/src/tint/lang/wgsl/sem/type_expression.h
+++ b/src/tint/lang/wgsl/sem/type_expression.h
@@ -18,9 +18,9 @@
 #include "src/tint/lang/wgsl/sem/expression.h"
 
 // Forward declarations
-namespace tint::type {
+namespace tint::core::type {
 class Type;
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 namespace tint::sem {
 
@@ -33,16 +33,16 @@
     /// @param type the type that this expression resolved to
     TypeExpression(const ast::Expression* declaration,
                    const Statement* statement,
-                   const type::Type* type);
+                   const core::type::Type* type);
 
     /// Destructor
     ~TypeExpression() override;
 
     /// @return the type that the expression resolved to
-    const type::Type* Type() const { return type_; }
+    const core::type::Type* Type() const { return type_; }
 
   private:
-    type::Type const* const type_;
+    core::type::Type const* const type_;
 };
 
 }  // namespace tint::sem
diff --git a/src/tint/lang/wgsl/sem/type_mappings.h b/src/tint/lang/wgsl/sem/type_mappings.h
index 92c97e6..d8f3cc2 100644
--- a/src/tint/lang/wgsl/sem/type_mappings.h
+++ b/src/tint/lang/wgsl/sem/type_mappings.h
@@ -64,10 +64,10 @@
 class Variable;
 class WhileStatement;
 }  // namespace tint::sem
-namespace tint::type {
+namespace tint::core::type {
 class Array;
 class Type;
-}  // namespace tint::type
+}  // namespace tint::core::type
 
 namespace tint::sem {
 
@@ -88,7 +88,7 @@
     Struct* operator()(ast::Struct*);
     StructMember* operator()(ast::StructMember*);
     SwitchStatement* operator()(ast::SwitchStatement*);
-    type::Type* operator()(ast::TypeDecl*);
+    core::type::Type* operator()(ast::TypeDecl*);
     ValueExpression* operator()(ast::AccessorExpression*);
     ValueExpression* operator()(ast::BinaryExpression*);
     ValueExpression* operator()(ast::BitcastExpression*);
diff --git a/src/tint/lang/wgsl/sem/value_constructor.cc b/src/tint/lang/wgsl/sem/value_constructor.cc
index d7d1b11..db27756 100644
--- a/src/tint/lang/wgsl/sem/value_constructor.cc
+++ b/src/tint/lang/wgsl/sem/value_constructor.cc
@@ -20,7 +20,7 @@
 
 namespace tint::sem {
 
-ValueConstructor::ValueConstructor(const type::Type* type,
+ValueConstructor::ValueConstructor(const core::type::Type* type,
                                    VectorRef<Parameter*> parameters,
                                    core::EvaluationStage stage)
     : Base(type, std::move(parameters), stage, /* must_use */ true) {}
diff --git a/src/tint/lang/wgsl/sem/value_constructor.h b/src/tint/lang/wgsl/sem/value_constructor.h
index b6917fa..e39a219 100644
--- a/src/tint/lang/wgsl/sem/value_constructor.h
+++ b/src/tint/lang/wgsl/sem/value_constructor.h
@@ -27,7 +27,7 @@
     /// @param type the type that's being constructed
     /// @param parameters the constructor parameters
     /// @param stage the earliest evaluation stage for the expression
-    ValueConstructor(const type::Type* type,
+    ValueConstructor(const core::type::Type* type,
                      VectorRef<Parameter*> parameters,
                      core::EvaluationStage stage);
 
diff --git a/src/tint/lang/wgsl/sem/value_conversion.cc b/src/tint/lang/wgsl/sem/value_conversion.cc
index a47c9e5..a0f95a9 100644
--- a/src/tint/lang/wgsl/sem/value_conversion.cc
+++ b/src/tint/lang/wgsl/sem/value_conversion.cc
@@ -18,7 +18,7 @@
 
 namespace tint::sem {
 
-ValueConversion::ValueConversion(const type::Type* type,
+ValueConversion::ValueConversion(const core::type::Type* type,
                                  sem::Parameter* parameter,
                                  core::EvaluationStage stage)
     : Base(type, tint::Vector<sem::Parameter*, 1>{parameter}, stage, /* must_use */ true) {}
diff --git a/src/tint/lang/wgsl/sem/value_conversion.h b/src/tint/lang/wgsl/sem/value_conversion.h
index 8d7884b..84fb00b 100644
--- a/src/tint/lang/wgsl/sem/value_conversion.h
+++ b/src/tint/lang/wgsl/sem/value_conversion.h
@@ -26,16 +26,18 @@
     /// @param type the target type of the cast
     /// @param parameter the type cast parameter
     /// @param stage the earliest evaluation stage for the expression
-    ValueConversion(const type::Type* type, sem::Parameter* parameter, core::EvaluationStage stage);
+    ValueConversion(const core::type::Type* type,
+                    sem::Parameter* parameter,
+                    core::EvaluationStage stage);
 
     /// Destructor
     ~ValueConversion() override;
 
     /// @returns the cast source type
-    const type::Type* Source() const { return Parameters()[0]->Type(); }
+    const core::type::Type* Source() const { return Parameters()[0]->Type(); }
 
     /// @returns the cast target type
-    const type::Type* Target() const { return ReturnType(); }
+    const core::type::Type* Target() const { return ReturnType(); }
 };
 
 }  // namespace tint::sem
diff --git a/src/tint/lang/wgsl/sem/value_expression.cc b/src/tint/lang/wgsl/sem/value_expression.cc
index a5cb212..0e05199 100644
--- a/src/tint/lang/wgsl/sem/value_expression.cc
+++ b/src/tint/lang/wgsl/sem/value_expression.cc
@@ -25,7 +25,7 @@
 namespace tint::sem {
 
 ValueExpression::ValueExpression(const ast::Expression* declaration,
-                                 const type::Type* type,
+                                 const core::type::Type* type,
                                  core::EvaluationStage stage,
                                  const Statement* statement,
                                  const core::constant::Value* constant,
diff --git a/src/tint/lang/wgsl/sem/value_expression.h b/src/tint/lang/wgsl/sem/value_expression.h
index 4d3fad2..00d76b1 100644
--- a/src/tint/lang/wgsl/sem/value_expression.h
+++ b/src/tint/lang/wgsl/sem/value_expression.h
@@ -40,7 +40,7 @@
     /// @param has_side_effects true if this expression may have side-effects
     /// @param root_ident the (optional) root identifier for this expression
     ValueExpression(const ast::Expression* declaration,
-                    const type::Type* type,
+                    const core::type::Type* type,
                     core::EvaluationStage stage,
                     const Statement* statement,
                     const core::constant::Value* constant,
@@ -51,7 +51,7 @@
     ~ValueExpression() override;
 
     /// @return the resolved type of the expression
-    const type::Type* Type() const { return type_; }
+    const core::type::Type* Type() const { return type_; }
 
     /// @return the earliest evaluation stage for the expression
     core::EvaluationStage Stage() const { return stage_; }
@@ -89,7 +89,7 @@
     const Variable* root_identifier_;
 
   private:
-    const type::Type* const type_;
+    const core::type::Type* const type_;
     const core::EvaluationStage stage_;
     const core::constant::Value* const constant_;
     sem::Behaviors behaviors_{sem::Behavior::kNext};
diff --git a/src/tint/lang/wgsl/sem/value_expression_test.cc b/src/tint/lang/wgsl/sem/value_expression_test.cc
index 0999006..0c81147 100644
--- a/src/tint/lang/wgsl/sem/value_expression_test.cc
+++ b/src/tint/lang/wgsl/sem/value_expression_test.cc
@@ -25,9 +25,9 @@
 
 class MockConstant : public core::constant::Value {
   public:
-    explicit MockConstant(const type::Type* ty) : type(ty) {}
+    explicit MockConstant(const core::type::Type* ty) : type(ty) {}
     ~MockConstant() override {}
-    const type::Type* Type() const override { return type; }
+    const core::type::Type* Type() const override { return type; }
     const core::constant::Value* Index(size_t) const override { return {}; }
     size_t NumElements() const override { return 0; }
     bool AllZero() const override { return {}; }
@@ -39,14 +39,14 @@
     std::variant<std::monostate, AInt, AFloat> InternalValue() const override { return {}; }
 
   private:
-    const type::Type* type;
+    const core::type::Type* type;
 };
 
 using ValueExpressionTest = TestHelper;
 
 TEST_F(ValueExpressionTest, UnwrapMaterialize) {
-    MockConstant c(create<type::I32>());
-    auto* a = create<ValueExpression>(/* declaration */ nullptr, create<type::I32>(),
+    MockConstant c(create<core::type::I32>());
+    auto* a = create<ValueExpression>(/* declaration */ nullptr, create<core::type::I32>(),
                                       core::EvaluationStage::kRuntime, /* statement */ nullptr,
                                       /* constant_value */ nullptr,
                                       /* has_side_effects */ false, /* root_ident */ nullptr);
diff --git a/src/tint/lang/wgsl/sem/variable.cc b/src/tint/lang/wgsl/sem/variable.cc
index 97240d4..bfff38f 100644
--- a/src/tint/lang/wgsl/sem/variable.cc
+++ b/src/tint/lang/wgsl/sem/variable.cc
@@ -29,7 +29,7 @@
 
 namespace tint::sem {
 Variable::Variable(const ast::Variable* declaration,
-                   const type::Type* type,
+                   const core::type::Type* type,
                    core::EvaluationStage stage,
                    core::AddressSpace address_space,
                    core::Access access,
@@ -44,7 +44,7 @@
 Variable::~Variable() = default;
 
 LocalVariable::LocalVariable(const ast::Variable* declaration,
-                             const type::Type* type,
+                             const core::type::Type* type,
                              core::EvaluationStage stage,
                              core::AddressSpace address_space,
                              core::Access access,
@@ -56,7 +56,7 @@
 LocalVariable::~LocalVariable() = default;
 
 GlobalVariable::GlobalVariable(const ast::Variable* declaration,
-                               const type::Type* type,
+                               const core::type::Type* type,
                                core::EvaluationStage stage,
                                core::AddressSpace address_space,
                                core::Access access,
@@ -73,7 +73,7 @@
 
 Parameter::Parameter(const ast::Parameter* declaration,
                      uint32_t index,
-                     const type::Type* type,
+                     const core::type::Type* type,
                      core::AddressSpace address_space,
                      core::Access access,
                      const core::ParameterUsage usage /* = ParameterUsage::kNone */,
@@ -100,7 +100,7 @@
            /* has_side_effects */ false),
       variable_(variable) {
     auto* type = variable->Type();
-    if (type->Is<type::Pointer>() && variable->Initializer()) {
+    if (type->Is<core::type::Pointer>() && variable->Initializer()) {
         root_identifier_ = variable->Initializer()->RootIdentifier();
     } else {
         root_identifier_ = variable;
diff --git a/src/tint/lang/wgsl/sem/variable.h b/src/tint/lang/wgsl/sem/variable.h
index 9e127de..7b0f33d 100644
--- a/src/tint/lang/wgsl/sem/variable.h
+++ b/src/tint/lang/wgsl/sem/variable.h
@@ -55,7 +55,7 @@
     /// @param access the variable access control type
     /// @param constant_value the constant value for the variable. May be null
     Variable(const ast::Variable* declaration,
-             const type::Type* type,
+             const core::type::Type* type,
              core::EvaluationStage stage,
              core::AddressSpace address_space,
              core::Access access,
@@ -68,7 +68,7 @@
     const ast::Variable* Declaration() const { return declaration_; }
 
     /// @returns the canonical type for the variable
-    const type::Type* Type() const { return type_; }
+    const core::type::Type* Type() const { return type_; }
 
     /// @returns the evaluation stage for an expression of this variable type
     core::EvaluationStage Stage() const { return stage_; }
@@ -98,7 +98,7 @@
 
   private:
     const ast::Variable* const declaration_;
-    const type::Type* const type_;
+    const core::type::Type* const type_;
     const core::EvaluationStage stage_;
     const core::AddressSpace address_space_;
     const core::Access access_;
@@ -119,7 +119,7 @@
     /// @param statement the statement that declared this local variable
     /// @param constant_value the constant value for the variable. May be null
     LocalVariable(const ast::Variable* declaration,
-                  const type::Type* type,
+                  const core::type::Type* type,
                   core::EvaluationStage stage,
                   core::AddressSpace address_space,
                   core::Access access,
@@ -161,7 +161,7 @@
     /// Note, a GlobalVariable generally doesn't have a `location` in WGSL, as it isn't allowed by
     /// the spec. The location maybe attached by transforms such as CanonicalizeEntryPointIO.
     GlobalVariable(const ast::Variable* declaration,
-                   const type::Type* type,
+                   const core::type::Type* type,
                    core::EvaluationStage stage,
                    core::AddressSpace address_space,
                    core::Access access,
@@ -210,7 +210,7 @@
     /// @param location the location value, if set
     Parameter(const ast::Parameter* declaration,
               uint32_t index,
-              const type::Type* type,
+              const core::type::Type* type,
               core::AddressSpace address_space,
               core::Access access,
               const core::ParameterUsage usage = core::ParameterUsage::kNone,
diff --git a/src/tint/lang/wgsl/writer/ast_printer/global_decl_test.cc b/src/tint/lang/wgsl/writer/ast_printer/global_decl_test.cc
index 381afcb..dafff0e 100644
--- a/src/tint/lang/wgsl/writer/ast_printer/global_decl_test.cc
+++ b/src/tint/lang/wgsl/writer/ast_printer/global_decl_test.cc
@@ -108,7 +108,7 @@
 }
 
 TEST_F(WgslASTPrinterTest, Emit_Global_Sampler) {
-    GlobalVar("s", ty.sampler(type::SamplerKind::kSampler), Group(0_a), Binding(0_a));
+    GlobalVar("s", ty.sampler(core::type::SamplerKind::kSampler), Group(0_a), Binding(0_a));
 
     ASTPrinter& gen = Build();
 
@@ -119,7 +119,7 @@
 }
 
 TEST_F(WgslASTPrinterTest, Emit_Global_Texture) {
-    auto st = ty.sampled_texture(type::TextureDimension::k1d, ty.f32());
+    auto st = ty.sampled_texture(core::type::TextureDimension::k1d, ty.f32());
     GlobalVar("t", st, Group(0_a), Binding(0_a));
 
     ASTPrinter& gen = Build();
diff --git a/src/tint/lang/wgsl/writer/ast_printer/type_test.cc b/src/tint/lang/wgsl/writer/ast_printer/type_test.cc
index cca9f8b4..ccee176 100644
--- a/src/tint/lang/wgsl/writer/ast_printer/type_test.cc
+++ b/src/tint/lang/wgsl/writer/ast_printer/type_test.cc
@@ -401,7 +401,7 @@
 }
 
 struct TextureData {
-    type::TextureDimension dim;
+    core::type::TextureDimension dim;
     const char* name;
 };
 inline std::ostream& operator<<(std::ostream& out, TextureData data) {
@@ -425,10 +425,11 @@
 INSTANTIATE_TEST_SUITE_P(
     WgslASTPrinterTest,
     WgslGenerator_DepthTextureTest,
-    testing::Values(TextureData{type::TextureDimension::k2d, "texture_depth_2d"},
-                    TextureData{type::TextureDimension::k2dArray, "texture_depth_2d_array"},
-                    TextureData{type::TextureDimension::kCube, "texture_depth_cube"},
-                    TextureData{type::TextureDimension::kCubeArray, "texture_depth_cube_array"}));
+    testing::Values(TextureData{core::type::TextureDimension::k2d, "texture_depth_2d"},
+                    TextureData{core::type::TextureDimension::k2dArray, "texture_depth_2d_array"},
+                    TextureData{core::type::TextureDimension::kCube, "texture_depth_cube"},
+                    TextureData{core::type::TextureDimension::kCubeArray,
+                                "texture_depth_cube_array"}));
 
 using WgslGenerator_SampledTextureTest = TestParamHelper<TextureData>;
 TEST_P(WgslGenerator_SampledTextureTest, EmitType_SampledTexture_F32) {
@@ -475,12 +476,12 @@
 INSTANTIATE_TEST_SUITE_P(
     WgslASTPrinterTest,
     WgslGenerator_SampledTextureTest,
-    testing::Values(TextureData{type::TextureDimension::k1d, "texture_1d"},
-                    TextureData{type::TextureDimension::k2d, "texture_2d"},
-                    TextureData{type::TextureDimension::k2dArray, "texture_2d_array"},
-                    TextureData{type::TextureDimension::k3d, "texture_3d"},
-                    TextureData{type::TextureDimension::kCube, "texture_cube"},
-                    TextureData{type::TextureDimension::kCubeArray, "texture_cube_array"}));
+    testing::Values(TextureData{core::type::TextureDimension::k1d, "texture_1d"},
+                    TextureData{core::type::TextureDimension::k2d, "texture_2d"},
+                    TextureData{core::type::TextureDimension::k2dArray, "texture_2d_array"},
+                    TextureData{core::type::TextureDimension::k3d, "texture_3d"},
+                    TextureData{core::type::TextureDimension::kCube, "texture_cube"},
+                    TextureData{core::type::TextureDimension::kCubeArray, "texture_cube_array"}));
 
 using WgslGenerator_MultiampledTextureTest = TestParamHelper<TextureData>;
 TEST_P(WgslGenerator_MultiampledTextureTest, EmitType_MultisampledTexture_F32) {
@@ -526,12 +527,12 @@
 }
 INSTANTIATE_TEST_SUITE_P(WgslASTPrinterTest,
                          WgslGenerator_MultiampledTextureTest,
-                         testing::Values(TextureData{type::TextureDimension::k2d,
+                         testing::Values(TextureData{core::type::TextureDimension::k2d,
                                                      "texture_multisampled_2d"}));
 
 struct StorageTextureData {
     core::TexelFormat fmt;
-    type::TextureDimension dim;
+    core::type::TextureDimension dim;
     core::Access access;
     const char* name;
 };
@@ -557,13 +558,13 @@
     WgslASTPrinterTest,
     WgslGenerator_StorageTextureTest,
     testing::Values(
-        StorageTextureData{core::TexelFormat::kRgba8Sint, type::TextureDimension::k1d,
+        StorageTextureData{core::TexelFormat::kRgba8Sint, core::type::TextureDimension::k1d,
                            core::Access::kWrite, "texture_storage_1d<rgba8sint, write>"},
-        StorageTextureData{core::TexelFormat::kRgba8Sint, type::TextureDimension::k2d,
+        StorageTextureData{core::TexelFormat::kRgba8Sint, core::type::TextureDimension::k2d,
                            core::Access::kWrite, "texture_storage_2d<rgba8sint, write>"},
-        StorageTextureData{core::TexelFormat::kRgba8Sint, type::TextureDimension::k2dArray,
+        StorageTextureData{core::TexelFormat::kRgba8Sint, core::type::TextureDimension::k2dArray,
                            core::Access::kWrite, "texture_storage_2d_array<rgba8sint, write>"},
-        StorageTextureData{core::TexelFormat::kRgba8Sint, type::TextureDimension::k3d,
+        StorageTextureData{core::TexelFormat::kRgba8Sint, core::type::TextureDimension::k3d,
                            core::Access::kWrite, "texture_storage_3d<rgba8sint, write>"}));
 
 struct ImageFormatData {
@@ -607,7 +608,7 @@
                     ImageFormatData{core::TexelFormat::kRgba32Float, "rgba32float"}));
 
 TEST_F(WgslASTPrinterTest, EmitType_Sampler) {
-    auto sampler = ty.sampler(type::SamplerKind::kSampler);
+    auto sampler = ty.sampler(core::type::SamplerKind::kSampler);
     auto type = Alias("make_type_reachable", sampler)->type;
 
     ASTPrinter& gen = Build();
@@ -619,7 +620,7 @@
 }
 
 TEST_F(WgslASTPrinterTest, EmitType_SamplerComparison) {
-    auto sampler = ty.sampler(type::SamplerKind::kComparisonSampler);
+    auto sampler = ty.sampler(core::type::SamplerKind::kComparisonSampler);
     auto type = Alias("make_type_reachable", sampler)->type;
 
     ASTPrinter& gen = Build();
diff --git a/src/tint/lang/wgsl/writer/ast_printer/variable_test.cc b/src/tint/lang/wgsl/writer/ast_printer/variable_test.cc
index 9b78de5..83cb95d 100644
--- a/src/tint/lang/wgsl/writer/ast_printer/variable_test.cc
+++ b/src/tint/lang/wgsl/writer/ast_printer/variable_test.cc
@@ -73,7 +73,8 @@
 }
 
 TEST_F(WgslASTPrinterTest, EmitVariable_Decorated) {
-    auto* v = GlobalVar("a", ty.sampler(type::SamplerKind::kSampler), Group(1_a), Binding(2_a));
+    auto* v =
+        GlobalVar("a", ty.sampler(core::type::SamplerKind::kSampler), Group(1_a), Binding(2_a));
 
     ASTPrinter& gen = Build();
 
diff --git a/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc b/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc
index 129dc84..5b4fbc3 100644
--- a/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc
+++ b/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc
@@ -177,7 +177,7 @@
     Hashset<core::Extension, 4> enables_;
 
     /// Map of struct to output program name.
-    Hashmap<const type::Struct*, Symbol, 8> structs_;
+    Hashmap<const core::type::Struct*, Symbol, 8> structs_;
 
     /// True if 'diagnostic(off, derivative_uniformity)' has been emitted
     bool disabled_derivative_uniformity_ = false;
@@ -512,7 +512,7 @@
 
     void Var(ir::Var* var) {
         auto* val = var->Result();
-        auto* ptr = As<type::Pointer>(val->Type());
+        auto* ptr = As<core::type::Pointer>(val->Type());
         auto ty = Type(ptr->StoreType());
         Symbol name = NameFor(var->Result());
         Bind(var->Result(), name, PtrKind::kRef);
@@ -585,7 +585,7 @@
                 }
 
                 auto* expr = b.Call(c->Func(), std::move(args));
-                if (!call->HasResults() || call->Result()->Type()->Is<type::Void>()) {
+                if (!call->HasResults() || call->Result()->Type()->Is<core::type::Void>()) {
                     Append(b.CallStmt(expr));
                     return;
                 }
@@ -633,19 +633,19 @@
         for (auto* index : a->Indices()) {
             tint::Switch(
                 obj_ty,
-                [&](const type::Vector* vec) {
+                [&](const core::type::Vector* vec) {
                     TINT_DEFER(obj_ty = vec->type());
                     expr = VectorMemberAccess(expr, index);
                 },
-                [&](const type::Matrix* mat) {
+                [&](const core::type::Matrix* mat) {
                     obj_ty = mat->ColumnType();
                     expr = b.IndexAccessor(expr, Expr(index));
                 },
-                [&](const type::Array* arr) {
+                [&](const core::type::Array* arr) {
                     obj_ty = arr->ElemType();
                     expr = b.IndexAccessor(expr, Expr(index));
                 },
-                [&](const type::Struct* s) {
+                [&](const core::type::Struct* s) {
                     if (auto* c = index->As<ir::Constant>()) {
                         auto i = c->Value()->ValueAs<uint32_t>();
                         TINT_ASSERT_OR_RETURN(i < s->Members().Length());
@@ -679,7 +679,8 @@
     void Binary(ir::Binary* e) {
         if (e->Kind() == ir::Binary::Kind::kEqual) {
             auto* rhs = e->RHS()->As<ir::Constant>();
-            if (rhs && rhs->Type()->Is<type::Bool>() && rhs->Value()->ValueAs<bool>() == false) {
+            if (rhs && rhs->Type()->Is<core::type::Bool>() &&
+                rhs->Value()->ValueAs<bool>() == false) {
                 // expr == false
                 Bind(e->Result(), b.Not(Expr(e->LHS())));
                 return;
@@ -790,7 +791,7 @@
             return b.Expr("<error>");
         }
 
-        if (value->Type()->Is<type::Pointer>()) {
+        if (value->Type()->Is<core::type::Pointer>()) {
             return ToPtrKind(expr, got_ptr_kind, want_ptr_kind);
         }
 
@@ -819,18 +820,18 @@
         };
         return tint::Switch(
             c->Type(),  //
-            [&](const type::I32*) { return b.Expr(c->ValueAs<i32>()); },
-            [&](const type::U32*) { return b.Expr(c->ValueAs<u32>()); },
-            [&](const type::F32*) { return b.Expr(c->ValueAs<f32>()); },
-            [&](const type::F16*) {
+            [&](const core::type::I32*) { return b.Expr(c->ValueAs<i32>()); },
+            [&](const core::type::U32*) { return b.Expr(c->ValueAs<u32>()); },
+            [&](const core::type::F32*) { return b.Expr(c->ValueAs<f32>()); },
+            [&](const core::type::F16*) {
                 Enable(core::Extension::kF16);
                 return b.Expr(c->ValueAs<f16>());
             },
-            [&](const type::Bool*) { return b.Expr(c->ValueAs<bool>()); },
-            [&](const type::Array*) { return composite(/* can_splat */ false); },
-            [&](const type::Vector*) { return composite(/* can_splat */ true); },
-            [&](const type::Matrix*) { return composite(/* can_splat */ false); },
-            [&](const type::Struct*) { return composite(/* can_splat */ false); },
+            [&](const core::type::Bool*) { return b.Expr(c->ValueAs<bool>()); },
+            [&](const core::type::Array*) { return composite(/* can_splat */ false); },
+            [&](const core::type::Vector*) { return composite(/* can_splat */ true); },
+            [&](const core::type::Matrix*) { return composite(/* can_splat */ false); },
+            [&](const core::type::Struct*) { return composite(/* can_splat */ false); },
             [&](Default) {
                 UNHANDLED_CASE(c->Type());
                 return b.Expr("<error>");
@@ -856,22 +857,22 @@
     /// @param ty the type::Type
     /// @return an ast::Type from @p ty.
     /// @note May be a semantically-invalid placeholder type on error.
-    ast::Type Type(const type::Type* ty) {
+    ast::Type Type(const core::type::Type* ty) {
         return tint::Switch(
-            ty,                                              //
-            [&](const type::Void*) { return ast::Type{}; },  //
-            [&](const type::I32*) { return b.ty.i32(); },    //
-            [&](const type::U32*) { return b.ty.u32(); },    //
-            [&](const type::F16*) {
+            ty,                                                    //
+            [&](const core::type::Void*) { return ast::Type{}; },  //
+            [&](const core::type::I32*) { return b.ty.i32(); },    //
+            [&](const core::type::U32*) { return b.ty.u32(); },    //
+            [&](const core::type::F16*) {
                 Enable(core::Extension::kF16);
                 return b.ty.f16();
             },
-            [&](const type::F32*) { return b.ty.f32(); },  //
-            [&](const type::Bool*) { return b.ty.bool_(); },
-            [&](const type::Matrix* m) {
+            [&](const core::type::F32*) { return b.ty.f32(); },  //
+            [&](const core::type::Bool*) { return b.ty.bool_(); },
+            [&](const core::type::Matrix* m) {
                 return b.ty.mat(Type(m->type()), m->columns(), m->rows());
             },
-            [&](const type::Vector* v) {
+            [&](const core::type::Vector* v) {
                 auto el = Type(v->type());
                 if (v->Packed()) {
                     TINT_ASSERT(v->Width() == 3u);
@@ -880,42 +881,42 @@
                     return b.ty.vec(el, v->Width());
                 }
             },
-            [&](const type::Array* a) {
+            [&](const core::type::Array* a) {
                 auto el = Type(a->ElemType());
                 Vector<const ast::Attribute*, 1> attrs;
                 if (!a->IsStrideImplicit()) {
                     attrs.Push(b.Stride(a->Stride()));
                 }
-                if (a->Count()->Is<type::RuntimeArrayCount>()) {
+                if (a->Count()->Is<core::type::RuntimeArrayCount>()) {
                     return b.ty.array(el, std::move(attrs));
                 }
                 auto count = a->ConstantCount();
                 if (TINT_UNLIKELY(!count)) {
-                    TINT_ICE() << type::Array::kErrExpectedConstantCount;
+                    TINT_ICE() << core::type::Array::kErrExpectedConstantCount;
                     return b.ty.array(el, u32(1), std::move(attrs));
                 }
                 return b.ty.array(el, u32(count.value()), std::move(attrs));
             },
-            [&](const type::Struct* s) { return Struct(s); },
-            [&](const type::Atomic* a) { return b.ty.atomic(Type(a->Type())); },
-            [&](const type::DepthTexture* t) { return b.ty.depth_texture(t->dim()); },
-            [&](const type::DepthMultisampledTexture* t) {
+            [&](const core::type::Struct* s) { return Struct(s); },
+            [&](const core::type::Atomic* a) { return b.ty.atomic(Type(a->Type())); },
+            [&](const core::type::DepthTexture* t) { return b.ty.depth_texture(t->dim()); },
+            [&](const core::type::DepthMultisampledTexture* t) {
                 return b.ty.depth_multisampled_texture(t->dim());
             },
-            [&](const type::ExternalTexture*) { return b.ty.external_texture(); },
-            [&](const type::MultisampledTexture* t) {
+            [&](const core::type::ExternalTexture*) { return b.ty.external_texture(); },
+            [&](const core::type::MultisampledTexture* t) {
                 auto el = Type(t->type());
                 return b.ty.multisampled_texture(t->dim(), el);
             },
-            [&](const type::SampledTexture* t) {
+            [&](const core::type::SampledTexture* t) {
                 auto el = Type(t->type());
                 return b.ty.sampled_texture(t->dim(), el);
             },
-            [&](const type::StorageTexture* t) {
+            [&](const core::type::StorageTexture* t) {
                 return b.ty.storage_texture(t->dim(), t->texel_format(), t->access());
             },
-            [&](const type::Sampler* s) { return b.ty.sampler(s->kind()); },
-            [&](const type::Pointer* p) {
+            [&](const core::type::Sampler* s) { return b.ty.sampler(s->kind()); },
+            [&](const core::type::Pointer* p) {
                 // Note: type::Pointer always has an inferred access, but WGSL only allows an
                 // explicit access in the 'storage' address space.
                 auto el = Type(p->StoreType());
@@ -925,7 +926,7 @@
                                   : core::Access::kUndefined;
                 return b.ty.ptr(address_space, el, access);
             },
-            [&](const type::Reference*) {
+            [&](const core::type::Reference*) {
                 TINT_ICE() << "reference types should never appear in the IR";
                 return b.ty.i32();
             },
@@ -935,9 +936,9 @@
             });
     }
 
-    ast::Type Struct(const type::Struct* s) {
+    ast::Type Struct(const core::type::Struct* s) {
         auto n = structs_.GetOrCreate(s, [&] {
-            auto members = tint::Transform<8>(s->Members(), [&](const type::StructMember* m) {
+            auto members = tint::Transform<8>(s->Members(), [&](const core::type::StructMember* m) {
                 auto ty = Type(m->Type());
                 const auto& ir_attrs = m->Attributes();
                 Vector<const ast::Attribute*, 4> ast_attrs;
@@ -1015,7 +1016,7 @@
                 return;
             }
         } else {
-            if (value->Type()->Is<type::Pointer>()) {
+            if (value->Type()->Is<core::type::Pointer>()) {
                 expr = ToPtrKind(expr, ptr_kind, PtrKind::kPtr);
             }
             auto mod_name = mod.NameOf(value);
@@ -1057,7 +1058,7 @@
             return false;
         }
         auto* result = i->Result();
-        if (!result->Type()->Is<type::Bool>()) {
+        if (!result->Type()->Is<core::type::Bool>()) {
             return false;  // Wrong result type
         }
         if (i->Exits().Count() != 2) {
@@ -1113,7 +1114,7 @@
 
     bool IsConstant(ir::Value* val, bool value) {
         if (auto* c = val->As<ir::Constant>()) {
-            if (c->Type()->Is<type::Bool>()) {
+            if (c->Type()->Is<core::type::Bool>()) {
                 return c->Value()->ValueAs<bool>() == value;
             }
         }
diff --git a/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts.cc b/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts.cc
index eadae08..cb57213 100644
--- a/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts.cc
+++ b/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts.cc
@@ -77,7 +77,7 @@
 
   private:
     /// Map of identifier to declaration.
-    /// The declarations may be one of an ir::Value or type::Struct.
+    /// The declarations may be one of an ir::Value or core::type::Struct.
     using Scope = Hashmap<std::string_view, CastableBase*, 8>;
 
     /// The IR module.
@@ -91,10 +91,10 @@
     void RegisterModuleScopeDecls() {
         // Declare all the user types
         for (auto* ty : ir->Types()) {
-            if (auto* str = ty->As<type::Struct>()) {
+            if (auto* str = ty->As<core::type::Struct>()) {
                 auto name = str->Name().NameView();
                 if (!IsBuiltinStruct(str)) {
-                    Declare(scopes.Front(), const_cast<type::Struct*>(str), name);
+                    Declare(scopes.Front(), const_cast<core::type::Struct*>(str), name);
                 }
             }
         }
@@ -192,30 +192,30 @@
     }
 
     /// Ensures that the type @p type can be resolved given its identifier(s)
-    void EnsureResolvable(const type::Type* type) {
+    void EnsureResolvable(const core::type::Type* type) {
         while (type) {
             type = tint::Switch(
                 type,  //
-                [&](const type::Scalar* s) {
+                [&](const core::type::Scalar* s) {
                     EnsureResolvesTo(s->FriendlyName(), nullptr);
                     return nullptr;
                 },
-                [&](const type::Vector* v) {
+                [&](const core::type::Vector* v) {
                     EnsureResolvesTo("vec" + tint::ToString(v->Width()), nullptr);
                     return v->type();
                 },
-                [&](const type::Matrix* m) {
+                [&](const core::type::Matrix* m) {
                     EnsureResolvesTo(
                         "mat" + tint::ToString(m->columns()) + "x" + tint::ToString(m->rows()),
                         nullptr);
                     return m->type();
                 },
-                [&](const type::Pointer* p) {
+                [&](const core::type::Pointer* p) {
                     EnsureResolvesTo(tint::ToString(p->Access()), nullptr);
                     EnsureResolvesTo(tint::ToString(p->AddressSpace()), nullptr);
                     return p->StoreType();
                 },
-                [&](const type::Struct* s) {
+                [&](const core::type::Struct* s) {
                     auto name = s->Name().NameView();
                     if (IsBuiltinStruct(s)) {
                         EnsureResolvesTo(name, nullptr);
@@ -260,14 +260,14 @@
         Switch(
             thing,  //
             [&](ir::Value* value) { ir->SetName(value, new_name); },
-            [&](type::Struct* str) { str->SetName(new_name); },
+            [&](core::type::Struct* str) { str->SetName(new_name); },
             [&](Default) {
                 TINT_ICE() << "unhandled type for renaming: " << thing->TypeInfo().name;
             });
     }
 
     /// @return true if @p s is a builtin (non-user declared) structure.
-    bool IsBuiltinStruct(const type::Struct* s) {
+    bool IsBuiltinStruct(const core::type::Struct* s) {
         // TODO(bclayton): Need to do better than this.
         return tint::HasPrefix(s->Name().NameView(), "_");
     }
diff --git a/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts_test.cc b/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts_test.cc
index 97a62d5..02d7fed 100644
--- a/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts_test.cc
+++ b/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts_test.cc
@@ -62,7 +62,7 @@
     /// The test IR builder.
     ir::Builder b{mod};
     /// The type manager.
-    type::Manager& ty{mod.Types()};
+    core::type::Manager& ty{mod.Types()};
 };
 
 TEST_F(IRToProgramRenameConflictsTest, NoModify_SingleNamedRootBlockVar) {
diff --git a/src/tint/tint.natvis b/src/tint/tint.natvis
index 5af1320..47198c0 100644
--- a/src/tint/tint.natvis
+++ b/src/tint/tint.natvis
@@ -231,23 +231,23 @@
 	<!-- sem -->
 	<!--=================================================================-->
 
-	<Type Name="tint::type::AbstractInt">
+	<Type Name="tint::core::type::AbstractInt">
 		<DisplayString>AbstractInt</DisplayString>
 	</Type>
 
-	<Type Name="tint::type::AbstractFloat">
+	<Type Name="tint::core::type::AbstractFloat">
 		<DisplayString>AbstractFloat</DisplayString>
 	</Type>
 
-	<Type Name="tint::type::Bool">
+	<Type Name="tint::core::type::Bool">
 		<DisplayString>bool</DisplayString>
 	</Type>
 
-	<Type Name="tint::type::F32">
+	<Type Name="tint::core::type::F32">
 		<DisplayString>f32</DisplayString>
 	</Type>
 
-	<Type Name="tint::type::Vector">
+	<Type Name="tint::core::type::Vector">
 		<DisplayString>vec{width_}&lt;{*subtype_}&gt;</DisplayString>
 	</Type>
 
diff --git a/src/tint/utils/templates/intrinsic_table_data.tmpl.inc b/src/tint/utils/templates/intrinsic_table_data.tmpl.inc
index b1c8b1e..fe3f9da 100644
--- a/src/tint/utils/templates/intrinsic_table_data.tmpl.inc
+++ b/src/tint/utils/templates/intrinsic_table_data.tmpl.inc
@@ -39,7 +39,7 @@
 using TemplateNumberInfo = tint::core::intrinsic::TemplateNumberInfo;
 using TemplateTypeIndex = tint::core::intrinsic::TemplateTypeIndex;
 using TemplateTypeInfo = tint::core::intrinsic::TemplateTypeInfo;
-using Type = tint::type::Type;
+using Type = tint::core::type::Type;
 using TypeMatcher = tint::core::intrinsic::TypeMatcher;
 using TypeMatcherIndex = tint::core::intrinsic::TypeMatcherIndex;
 using TypeMatcherIndicesIndex = tint::core::intrinsic::TypeMatcherIndicesIndex;
