Move TextureDimension to type/

This cl pulls TextureDimension out of ast/texture and into
type/texture_dimension removing a type dependency on ast.

Change-Id: Icf06ec32ee9051286f169ae9538c48416f513039
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/117603
Commit-Queue: Dan Sinclair <dsinclair@chromium.org>
Reviewed-by: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/tint/BUILD.gn b/src/tint/BUILD.gn
index 139f8ee..6e171e6 100644
--- a/src/tint/BUILD.gn
+++ b/src/tint/BUILD.gn
@@ -586,6 +586,7 @@
     "type/storage_texture.h",
     "type/struct.h",
     "type/texture.h",
+    "type/texture_dimension.h",
     "type/type.h",
     "type/u32.h",
     "type/unique_node.h",
@@ -739,6 +740,8 @@
     "type/struct.h",
     "type/texture.cc",
     "type/texture.h",
+    "type/texture_dimension.cc",
+    "type/texture_dimension.h",
     "type/type.cc",
     "type/type.h",
     "type/u32.cc",
diff --git a/src/tint/CMakeLists.txt b/src/tint/CMakeLists.txt
index 2f7bda7..45c45e7 100644
--- a/src/tint/CMakeLists.txt
+++ b/src/tint/CMakeLists.txt
@@ -514,6 +514,8 @@
   type/struct.h
   type/texture.cc
   type/texture.h
+  type/texture_dimension.cc
+  type/texture_dimension.h
   type/type.cc
   type/type.h
   type/u32.cc
diff --git a/src/tint/ast/builtin_texture_helper_test.cc b/src/tint/ast/builtin_texture_helper_test.cc
index 0ea2ced..7dda560 100644
--- a/src/tint/ast/builtin_texture_helper_test.cc
+++ b/src/tint/ast/builtin_texture_helper_test.cc
@@ -17,6 +17,7 @@
 #include "src/tint/type/depth_texture.h"
 #include "src/tint/type/multisampled_texture.h"
 #include "src/tint/type/sampled_texture.h"
+#include "src/tint/type/texture_dimension.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
@@ -26,7 +27,7 @@
                                          const char* desc,
                                          TextureKind tk,
                                          ast::SamplerKind sk,
-                                         ast::TextureDimension dims,
+                                         type::TextureDimension dims,
                                          TextureDataType datatype,
                                          const char* f,
                                          std::function<Args(ProgramBuilder*)> a)
@@ -41,7 +42,7 @@
 TextureOverloadCase::TextureOverloadCase(ValidTextureOverload o,
                                          const char* desc,
                                          TextureKind tk,
-                                         ast::TextureDimension dims,
+                                         type::TextureDimension dims,
                                          TextureDataType datatype,
                                          const char* f,
                                          std::function<Args(ProgramBuilder*)> a)
@@ -56,7 +57,7 @@
                                          const char* d,
                                          Access acc,
                                          ast::TexelFormat fmt,
-                                         ast::TextureDimension dims,
+                                         type::TextureDimension dims,
                                          TextureDataType datatype,
                                          const char* f,
                                          std::function<Args(ProgramBuilder*)> a)
@@ -186,7 +187,7 @@
             "textureDimensions(t : texture_1d<f32>) -> u32",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k1d,
+            type::TextureDimension::k1d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -196,7 +197,7 @@
             "textureDimensions(t : texture_2d<f32>) -> vec2<u32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -207,7 +208,7 @@
             "                  level : i32) -> vec2<u32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture", 1_i); },
@@ -217,7 +218,7 @@
             "textureDimensions(t : texture_2d_array<f32>) -> vec2<u32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -228,7 +229,7 @@
             "                  level : i32) -> vec2<u32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture", 1_i); },
@@ -238,7 +239,7 @@
             "textureDimensions(t : texture_3d<f32>) -> vec3<u32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k3d,
+            type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -249,7 +250,7 @@
             "                  level : i32) -> vec3<u32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k3d,
+            type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture", 1_i); },
@@ -259,7 +260,7 @@
             "textureDimensions(t : texture_cube<f32>) -> vec2<u32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCube,
+            type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -270,7 +271,7 @@
             "                  level : i32) -> vec2<u32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCube,
+            type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture", 1_i); },
@@ -280,7 +281,7 @@
             "textureDimensions(t : texture_cube_array<f32>) -> vec2<u32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCubeArray,
+            type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -291,7 +292,7 @@
             "                  level : i32) -> vec2<u32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCubeArray,
+            type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture", 1_i); },
@@ -301,7 +302,7 @@
             "textureDimensions(t : texture_multisampled_2d<f32>)-> vec2<u32>",
             TextureKind::kMultisampled,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -311,7 +312,7 @@
             "textureDimensions(t : texture_depth_2d) -> vec2<u32>",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -322,7 +323,7 @@
             "                  level : i32) -> vec2<u32>",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture", 1_i); },
@@ -332,7 +333,7 @@
             "textureDimensions(t : texture_depth_2d_array) -> vec2<u32>",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -343,7 +344,7 @@
             "                  level : i32) -> vec2<u32>",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture", 1_i); },
@@ -353,7 +354,7 @@
             "textureDimensions(t : texture_depth_cube) -> vec2<u32>",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCube,
+            type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -364,7 +365,7 @@
             "                  level : i32) -> vec2<u32>",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCube,
+            type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture", 1_i); },
@@ -374,7 +375,7 @@
             "textureDimensions(t : texture_depth_cube_array) -> vec2<u32>",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCubeArray,
+            type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -385,7 +386,7 @@
             "                  level : i32) -> vec2<u32>",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCubeArray,
+            type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture", 1_i); },
@@ -395,7 +396,7 @@
             "textureDimensions(t : texture_depth_multisampled_2d) -> vec2<u32>",
             TextureKind::kDepthMultisampled,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -405,7 +406,7 @@
             "textureDimensions(t : texture_storage_1d<rgba32float>) -> u32",
             ast::Access::kWrite,
             ast::TexelFormat::kRgba32Float,
-            ast::TextureDimension::k1d,
+            type::TextureDimension::k1d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -415,7 +416,7 @@
             "textureDimensions(t : texture_storage_2d<rgba32float>) -> vec2<u32>",
             ast::Access::kWrite,
             ast::TexelFormat::kRgba32Float,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -425,7 +426,7 @@
             "textureDimensions(t : texture_storage_2d_array<rgba32float>) -> vec2<u32>",
             ast::Access::kWrite,
             ast::TexelFormat::kRgba32Float,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -435,7 +436,7 @@
             "textureDimensions(t : texture_storage_3d<rgba32float>) -> vec3<u32>",
             ast::Access::kWrite,
             ast::TexelFormat::kRgba32Float,
-            ast::TextureDimension::k3d,
+            type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureDimensions",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -449,7 +450,7 @@
             "              coords    : vec2<f32>) -> vec4<T>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -468,7 +469,7 @@
             "              offset    : vec2<i32>) -> vec4<T>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -488,7 +489,7 @@
             "              array_index : i32) -> vec4<T>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -509,7 +510,7 @@
             "              offset      : vec2<i32>) -> vec4<T>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -529,7 +530,7 @@
             "              coords    : vec3<f32>) -> vec4<T>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCube,
+            type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -548,7 +549,7 @@
             "              array_index : u32) -> vec4<T>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCubeArray,
+            type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -566,7 +567,7 @@
             "              coords : vec2<f32>) -> vec4<f32>",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -583,7 +584,7 @@
             "              offset : vec2<i32>) -> vec4<f32>",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -601,7 +602,7 @@
             "              array_index : u32) -> vec4<f32>",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -620,7 +621,7 @@
             "              offset      : vec2<i32>) -> vec4<f32>",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -638,7 +639,7 @@
             "              coords : vec3<f32>) -> vec4<f32>",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCube,
+            type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -655,7 +656,7 @@
             "              array_index : u32) -> vec4<f32>",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCubeArray,
+            type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
@@ -673,7 +674,7 @@
             "                     depth_ref : f32) -> vec4<f32>",
             TextureKind::kDepth,
             ast::SamplerKind::kComparisonSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
@@ -692,7 +693,7 @@
             "                     offset    : vec2<i32>) -> vec4<f32>",
             TextureKind::kDepth,
             ast::SamplerKind::kComparisonSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
@@ -712,7 +713,7 @@
             "                     depth_ref   : f32) -> vec4<f32>",
             TextureKind::kDepth,
             ast::SamplerKind::kComparisonSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
@@ -733,7 +734,7 @@
             "                     offset      : vec2<i32>) -> vec4<f32>",
             TextureKind::kDepth,
             ast::SamplerKind::kComparisonSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
@@ -753,7 +754,7 @@
             "                     depth_ref : f32) -> vec4<f32>",
             TextureKind::kDepth,
             ast::SamplerKind::kComparisonSampler,
-            ast::TextureDimension::kCube,
+            type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
@@ -772,7 +773,7 @@
             "                     depth_ref   : f32) -> vec4<f32>",
             TextureKind::kDepth,
             ast::SamplerKind::kComparisonSampler,
-            ast::TextureDimension::kCubeArray,
+            type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
@@ -788,7 +789,7 @@
             "textureNumLayers(t : texture_2d_array<f32>) -> u32",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureNumLayers",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -798,7 +799,7 @@
             "textureNumLayers(t : texture_cube_array<f32>) -> u32",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCubeArray,
+            type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureNumLayers",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -808,7 +809,7 @@
             "textureNumLayers(t : texture_depth_2d_array) -> u32",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureNumLayers",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -818,7 +819,7 @@
             "textureNumLayers(t : texture_depth_cube_array) -> u32",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCubeArray,
+            type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureNumLayers",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -828,7 +829,7 @@
             "textureNumLayers(t : texture_storage_2d_array<rgba32float>) -> u32",
             ast::Access::kWrite,
             ast::TexelFormat::kRgba32Float,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureNumLayers",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -838,7 +839,7 @@
             "textureNumLevels(t : texture_2d<f32>) -> u32",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureNumLevels",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -848,7 +849,7 @@
             "textureNumLevels(t : texture_2d_array<f32>) -> u32",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureNumLevels",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -858,7 +859,7 @@
             "textureNumLevels(t : texture_3d<f32>) -> u32",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k3d,
+            type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureNumLevels",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -868,7 +869,7 @@
             "textureNumLevels(t : texture_cube<f32>) -> u32",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCube,
+            type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureNumLevels",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -878,7 +879,7 @@
             "textureNumLevels(t : texture_cube_array<f32>) -> u32",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCubeArray,
+            type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureNumLevels",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -888,7 +889,7 @@
             "textureNumLevels(t : texture_depth_2d) -> u32",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureNumLevels",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -898,7 +899,7 @@
             "textureNumLevels(t : texture_depth_2d_array) -> u32",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureNumLevels",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -908,7 +909,7 @@
             "textureNumLevels(t : texture_depth_cube) -> u32",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCube,
+            type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureNumLevels",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -918,7 +919,7 @@
             "textureNumLevels(t : texture_depth_cube_array) -> u32",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCubeArray,
+            type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureNumLevels",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -928,7 +929,7 @@
             "textureNumSamples(t : texture_multisampled_2d<f32>) -> u32",
             TextureKind::kMultisampled,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureNumSamples",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -938,7 +939,7 @@
             "textureNumSamples(t : texture_depth_multisampled_2d<f32>) -> u32",
             TextureKind::kMultisampled,
             ast::SamplerKind::kComparisonSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureNumSamples",
             [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -950,7 +951,7 @@
             "              coords : f32) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k1d,
+            type::TextureDimension::k1d,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -966,7 +967,7 @@
             "              coords : vec2<f32>) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -983,7 +984,7 @@
             "              offset : vec2<i32>) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1001,7 +1002,7 @@
             "              array_index : i32) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1020,7 +1021,7 @@
             "              offset      : vec2<i32>) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1038,7 +1039,7 @@
             "              coords : vec3<f32>) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k3d,
+            type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1055,7 +1056,7 @@
             "              offset : vec3<i32>) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k3d,
+            type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1072,7 +1073,7 @@
             "              coords : vec3<f32>) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCube,
+            type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1089,7 +1090,7 @@
             "              array_index : i32) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCubeArray,
+            type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1106,7 +1107,7 @@
             "              coords : vec2<f32>) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1123,7 +1124,7 @@
             "              offset : vec2<i32>) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1141,7 +1142,7 @@
             "              array_index : i32) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1160,7 +1161,7 @@
             "              offset      : vec2<i32>) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1178,7 +1179,7 @@
             "              coords : vec3<f32>) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCube,
+            type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1195,7 +1196,7 @@
             "              array_index : u32) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCubeArray,
+            type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
@@ -1213,7 +1214,7 @@
             "                  bias   : f32) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
@@ -1232,7 +1233,7 @@
             "                  offset : vec2<i32>) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
@@ -1252,7 +1253,7 @@
             "                  bias        : f32) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
@@ -1273,7 +1274,7 @@
             "                  offset      : vec2<i32>) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
@@ -1293,7 +1294,7 @@
             "                  bias   : f32) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k3d,
+            type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
@@ -1312,7 +1313,7 @@
             "                  offset : vec3<i32>) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k3d,
+            type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
@@ -1331,7 +1332,7 @@
             "                  bias   : f32) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCube,
+            type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
@@ -1350,7 +1351,7 @@
             "                  bias        : f32) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCubeArray,
+            type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
@@ -1369,7 +1370,7 @@
             "                   level  : f32) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1388,7 +1389,7 @@
             "                   offset : vec2<i32>) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1408,7 +1409,7 @@
             "                   level       : f32) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1429,7 +1430,7 @@
             "                   offset      : vec2<i32>) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1449,7 +1450,7 @@
             "                   level  : f32) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k3d,
+            type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1468,7 +1469,7 @@
             "                   offset : vec3<i32>) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k3d,
+            type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1487,7 +1488,7 @@
             "                   level  : f32) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCube,
+            type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1506,7 +1507,7 @@
             "                   level       : f32) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCubeArray,
+            type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1525,7 +1526,7 @@
             "                   level  : u32) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1544,7 +1545,7 @@
             "                   offset : vec2<i32>) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1564,7 +1565,7 @@
             "                   level       : u32) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1585,7 +1586,7 @@
             "                   offset      : vec2<i32>) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1605,7 +1606,7 @@
             "                   level  : i32) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCube,
+            type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1624,7 +1625,7 @@
             "                   level       : i32) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCubeArray,
+            type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
@@ -1644,7 +1645,7 @@
             "                  ddy    : vec2<f32>) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
@@ -1665,7 +1666,7 @@
             "                  offset : vec2<i32>) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
@@ -1687,7 +1688,7 @@
             "                  ddy         : vec2<f32>) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
@@ -1710,7 +1711,7 @@
             "                  offset      : vec2<i32>) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
@@ -1732,7 +1733,7 @@
             "                  ddy    : vec3<f32>) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k3d,
+            type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
@@ -1753,7 +1754,7 @@
             "                  offset : vec3<i32>) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::k3d,
+            type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
@@ -1774,7 +1775,7 @@
             "                  ddy    : vec3<f32>) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCube,
+            type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
@@ -1795,7 +1796,7 @@
             "                  ddy         : vec3<f32>) -> vec4<f32>",
             TextureKind::kRegular,
             ast::SamplerKind::kSampler,
-            ast::TextureDimension::kCubeArray,
+            type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
@@ -1815,7 +1816,7 @@
             "                     depth_ref : f32) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kComparisonSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
@@ -1834,7 +1835,7 @@
             "                     offset    : vec2<i32>) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kComparisonSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
@@ -1854,7 +1855,7 @@
             "                     depth_ref   : f32) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kComparisonSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
@@ -1875,7 +1876,7 @@
             "                     offset      : vec2<i32>) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kComparisonSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
@@ -1895,7 +1896,7 @@
             "                     depth_ref : f32) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kComparisonSampler,
-            ast::TextureDimension::kCube,
+            type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
@@ -1914,7 +1915,7 @@
             "                     depth_ref   : f32) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kComparisonSampler,
-            ast::TextureDimension::kCubeArray,
+            type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
@@ -1933,7 +1934,7 @@
             "                          depth_ref : f32) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kComparisonSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
@@ -1952,7 +1953,7 @@
             "                          offset    : vec2<i32>) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kComparisonSampler,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
@@ -1972,7 +1973,7 @@
             "                          depth_ref   : f32) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kComparisonSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
@@ -1993,7 +1994,7 @@
             "                          offset      : vec2<i32>) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kComparisonSampler,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
@@ -2013,7 +2014,7 @@
             "                          depth_ref   : f32) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kComparisonSampler,
-            ast::TextureDimension::kCube,
+            type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
@@ -2032,7 +2033,7 @@
             "                          depth_ref   : f32) -> f32",
             TextureKind::kDepth,
             ast::SamplerKind::kComparisonSampler,
-            ast::TextureDimension::kCubeArray,
+            type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
@@ -2049,7 +2050,7 @@
             "            coords : u32,\n"
             "            level  : u32) -> vec4<f32>",
             TextureKind::kRegular,
-            ast::TextureDimension::k1d,
+            type::TextureDimension::k1d,
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2064,7 +2065,7 @@
             "            coords : i32,\n"
             "            level  : i32) -> vec4<u32>",
             TextureKind::kRegular,
-            ast::TextureDimension::k1d,
+            type::TextureDimension::k1d,
             TextureDataType::kU32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2079,7 +2080,7 @@
             "            coords : i32,\n"
             "            level  : i32) -> vec4<i32>",
             TextureKind::kRegular,
-            ast::TextureDimension::k1d,
+            type::TextureDimension::k1d,
             TextureDataType::kI32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2094,7 +2095,7 @@
             "            coords : vec2<u32>,\n"
             "            level  : u32) -> vec4<f32>",
             TextureKind::kRegular,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2109,7 +2110,7 @@
             "            coords : vec2<i32>,\n"
             "            level  : i32) -> vec4<u32>",
             TextureKind::kRegular,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kU32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2124,7 +2125,7 @@
             "            coords : vec2<u32>,\n"
             "            level  : u32) -> vec4<i32>",
             TextureKind::kRegular,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kI32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2140,7 +2141,7 @@
             "            array_index : i32,\n"
             "            level       : i32) -> vec4<f32>",
             TextureKind::kRegular,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2157,7 +2158,7 @@
             "            array_index : i32,\n"
             "            level       : i32) -> vec4<u32>",
             TextureKind::kRegular,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kU32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2174,7 +2175,7 @@
             "            array_index : u32,\n"
             "            level       : u32) -> vec4<i32>",
             TextureKind::kRegular,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kI32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2190,7 +2191,7 @@
             "            coords : vec3<i32>,\n"
             "            level  : i32) -> vec4<f32>",
             TextureKind::kRegular,
-            ast::TextureDimension::k3d,
+            type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2205,7 +2206,7 @@
             "            coords : vec3<i32>,\n"
             "            level  : i32) -> vec4<u32>",
             TextureKind::kRegular,
-            ast::TextureDimension::k3d,
+            type::TextureDimension::k3d,
             TextureDataType::kU32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2220,7 +2221,7 @@
             "            coords : vec3<u32>,\n"
             "            level  : u32) -> vec4<i32>",
             TextureKind::kRegular,
-            ast::TextureDimension::k3d,
+            type::TextureDimension::k3d,
             TextureDataType::kI32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2235,7 +2236,7 @@
             "            coords       : vec2<i32>,\n"
             "            sample_index : i32) -> vec4<f32>",
             TextureKind::kMultisampled,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2250,7 +2251,7 @@
             "            coords       : vec2<i32>,\n"
             "            sample_index : i32) -> vec4<u32>",
             TextureKind::kMultisampled,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kU32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2265,7 +2266,7 @@
             "            coords       : vec2<u32>,\n"
             "            sample_index : u32) -> vec4<i32>",
             TextureKind::kMultisampled,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kI32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2280,7 +2281,7 @@
             "            coords : vec2<i32>,\n"
             "            level  : i32) -> f32",
             TextureKind::kDepth,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2296,7 +2297,7 @@
             "            array_index : u32,\n"
             "            level       : u32) -> f32",
             TextureKind::kDepth,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2312,7 +2313,7 @@
             "            coords       : vec2<u32>,\n"
             "            sample_index : u32) -> f32",
             TextureKind::kDepthMultisampled,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
@@ -2328,7 +2329,7 @@
             "             value  : vec4<T>)",
             ast::Access::kWrite,
             ast::TexelFormat::kRgba32Float,
-            ast::TextureDimension::k1d,
+            type::TextureDimension::k1d,
             TextureDataType::kF32,
             "textureStore",
             [](ProgramBuilder* b) {
@@ -2344,7 +2345,7 @@
             "             value  : vec4<T>)",
             ast::Access::kWrite,
             ast::TexelFormat::kRgba32Float,
-            ast::TextureDimension::k2d,
+            type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureStore",
             [](ProgramBuilder* b) {
@@ -2361,7 +2362,7 @@
             "             value       : vec4<T>)",
             ast::Access::kWrite,
             ast::TexelFormat::kRgba32Float,
-            ast::TextureDimension::k2dArray,
+            type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureStore",
             [](ProgramBuilder* b) {
@@ -2378,7 +2379,7 @@
             "             value  : vec4<T>)",
             ast::Access::kWrite,
             ast::TexelFormat::kRgba32Float,
-            ast::TextureDimension::k3d,
+            type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureStore",
             [](ProgramBuilder* b) {
diff --git a/src/tint/ast/builtin_texture_helper_test.h b/src/tint/ast/builtin_texture_helper_test.h
index 744796a..cfa180a 100644
--- a/src/tint/ast/builtin_texture_helper_test.h
+++ b/src/tint/ast/builtin_texture_helper_test.h
@@ -20,6 +20,7 @@
 #include "src/tint/ast/access.h"
 #include "src/tint/program_builder.h"
 #include "src/tint/type/storage_texture.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::ast::builtin::test {
 
@@ -185,7 +186,7 @@
                         const char*,
                         TextureKind,
                         ast::SamplerKind,
-                        ast::TextureDimension,
+                        type::TextureDimension,
                         TextureDataType,
                         const char*,
                         std::function<Args(ProgramBuilder*)>);
@@ -193,7 +194,7 @@
     TextureOverloadCase(ValidTextureOverload,
                         const char*,
                         TextureKind,
-                        ast::TextureDimension,
+                        type::TextureDimension,
                         TextureDataType,
                         const char*,
                         std::function<Args(ProgramBuilder*)>);
@@ -202,7 +203,7 @@
                         const char*,
                         Access,
                         ast::TexelFormat,
-                        ast::TextureDimension,
+                        type::TextureDimension,
                         TextureDataType,
                         const char*,
                         std::function<Args(ProgramBuilder*)>);
@@ -243,7 +244,7 @@
     /// Used only when texture_kind is kStorage
     ast::TexelFormat const texel_format = ast::TexelFormat::kUndefined;
     /// The dimensions of the texture parameter
-    ast::TextureDimension const texture_dimension;
+    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/ast/depth_multisampled_texture.cc b/src/tint/ast/depth_multisampled_texture.cc
index 64998b5..2ab3e8a 100644
--- a/src/tint/ast/depth_multisampled_texture.cc
+++ b/src/tint/ast/depth_multisampled_texture.cc
@@ -21,8 +21,8 @@
 namespace tint::ast {
 namespace {
 
-bool IsValidDepthDimension(TextureDimension dim) {
-    return dim == TextureDimension::k2d;
+bool IsValidDepthDimension(type::TextureDimension dim) {
+    return dim == type::TextureDimension::k2d;
 }
 
 }  // namespace
@@ -30,7 +30,7 @@
 DepthMultisampledTexture::DepthMultisampledTexture(ProgramID pid,
                                                    NodeID nid,
                                                    const Source& src,
-                                                   TextureDimension d)
+                                                   type::TextureDimension d)
     : Base(pid, nid, src, d) {
     TINT_ASSERT(AST, IsValidDepthDimension(dim));
 }
diff --git a/src/tint/ast/depth_multisampled_texture.h b/src/tint/ast/depth_multisampled_texture.h
index 2cc8d78..8986d49 100644
--- a/src/tint/ast/depth_multisampled_texture.h
+++ b/src/tint/ast/depth_multisampled_texture.h
@@ -18,6 +18,7 @@
 #include <string>
 
 #include "src/tint/ast/texture.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::ast {
 
@@ -29,7 +30,10 @@
     /// @param nid the unique node identifier
     /// @param src the source of this node
     /// @param dim the dimensionality of the texture
-    DepthMultisampledTexture(ProgramID pid, NodeID nid, const Source& src, TextureDimension dim);
+    DepthMultisampledTexture(ProgramID pid,
+                             NodeID nid,
+                             const Source& src,
+                             type::TextureDimension dim);
     /// Move constructor
     DepthMultisampledTexture(DepthMultisampledTexture&&);
     ~DepthMultisampledTexture() override;
diff --git a/src/tint/ast/depth_multisampled_texture_test.cc b/src/tint/ast/depth_multisampled_texture_test.cc
index 1de335d..675e672 100644
--- a/src/tint/ast/depth_multisampled_texture_test.cc
+++ b/src/tint/ast/depth_multisampled_texture_test.cc
@@ -22,12 +22,12 @@
 using AstDepthMultisampledTextureTest = TestHelper;
 
 TEST_F(AstDepthMultisampledTextureTest, Dim) {
-    auto* d = create<DepthMultisampledTexture>(TextureDimension::k2d);
-    EXPECT_EQ(d->dim, TextureDimension::k2d);
+    auto* d = create<DepthMultisampledTexture>(type::TextureDimension::k2d);
+    EXPECT_EQ(d->dim, type::TextureDimension::k2d);
 }
 
 TEST_F(AstDepthMultisampledTextureTest, FriendlyName) {
-    auto* d = create<DepthMultisampledTexture>(TextureDimension::k2d);
+    auto* d = create<DepthMultisampledTexture>(type::TextureDimension::k2d);
     EXPECT_EQ(d->FriendlyName(Symbols()), "texture_depth_multisampled_2d");
 }
 
diff --git a/src/tint/ast/depth_texture.cc b/src/tint/ast/depth_texture.cc
index 4aae6f3..199c0da 100644
--- a/src/tint/ast/depth_texture.cc
+++ b/src/tint/ast/depth_texture.cc
@@ -21,14 +21,14 @@
 namespace tint::ast {
 namespace {
 
-bool IsValidDepthDimension(TextureDimension dim) {
-    return dim == TextureDimension::k2d || dim == TextureDimension::k2dArray ||
-           dim == TextureDimension::kCube || dim == TextureDimension::kCubeArray;
+bool IsValidDepthDimension(type::TextureDimension dim) {
+    return dim == type::TextureDimension::k2d || dim == type::TextureDimension::k2dArray ||
+           dim == type::TextureDimension::kCube || dim == type::TextureDimension::kCubeArray;
 }
 
 }  // namespace
 
-DepthTexture::DepthTexture(ProgramID pid, NodeID nid, const Source& src, TextureDimension d)
+DepthTexture::DepthTexture(ProgramID pid, NodeID nid, const Source& src, type::TextureDimension d)
     : Base(pid, nid, src, d) {
     TINT_ASSERT(AST, IsValidDepthDimension(dim));
 }
diff --git a/src/tint/ast/depth_texture.h b/src/tint/ast/depth_texture.h
index 7df34a2..e687612 100644
--- a/src/tint/ast/depth_texture.h
+++ b/src/tint/ast/depth_texture.h
@@ -18,6 +18,7 @@
 #include <string>
 
 #include "src/tint/ast/texture.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::ast {
 
@@ -29,7 +30,7 @@
     /// @param nid the unique node identifier
     /// @param src the source of this node
     /// @param dim the dimensionality of the texture
-    DepthTexture(ProgramID pid, NodeID nid, const Source& src, TextureDimension dim);
+    DepthTexture(ProgramID pid, NodeID nid, const Source& src, type::TextureDimension dim);
     /// Move constructor
     DepthTexture(DepthTexture&&);
     ~DepthTexture() override;
diff --git a/src/tint/ast/depth_texture_test.cc b/src/tint/ast/depth_texture_test.cc
index 15dc356..e2a7b0e 100644
--- a/src/tint/ast/depth_texture_test.cc
+++ b/src/tint/ast/depth_texture_test.cc
@@ -22,19 +22,19 @@
 using AstDepthTextureTest = TestHelper;
 
 TEST_F(AstDepthTextureTest, IsTexture) {
-    Texture* ty = create<DepthTexture>(TextureDimension::kCube);
+    Texture* ty = create<DepthTexture>(type::TextureDimension::kCube);
     EXPECT_TRUE(ty->Is<DepthTexture>());
     EXPECT_FALSE(ty->Is<SampledTexture>());
     EXPECT_FALSE(ty->Is<StorageTexture>());
 }
 
 TEST_F(AstDepthTextureTest, Dim) {
-    auto* d = create<DepthTexture>(TextureDimension::kCube);
-    EXPECT_EQ(d->dim, TextureDimension::kCube);
+    auto* d = create<DepthTexture>(type::TextureDimension::kCube);
+    EXPECT_EQ(d->dim, type::TextureDimension::kCube);
 }
 
 TEST_F(AstDepthTextureTest, FriendlyName) {
-    auto* d = create<DepthTexture>(TextureDimension::kCube);
+    auto* d = create<DepthTexture>(type::TextureDimension::kCube);
     EXPECT_EQ(d->FriendlyName(Symbols()), "texture_depth_cube");
 }
 
diff --git a/src/tint/ast/external_texture.cc b/src/tint/ast/external_texture.cc
index 4881913..95d9bc7 100644
--- a/src/tint/ast/external_texture.cc
+++ b/src/tint/ast/external_texture.cc
@@ -15,14 +15,15 @@
 #include "src/tint/ast/external_texture.h"
 
 #include "src/tint/program_builder.h"
+#include "src/tint/type/texture_dimension.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::ExternalTexture);
 
 namespace tint::ast {
 
-// ExternalTexture::ExternalTexture() : Base(ast::TextureDimension::k2d) {}
+// ExternalTexture::ExternalTexture() : Base(type::TextureDimension::k2d) {}
 ExternalTexture::ExternalTexture(ProgramID pid, NodeID nid, const Source& src)
-    : Base(pid, nid, src, ast::TextureDimension::k2d) {}
+    : Base(pid, nid, src, type::TextureDimension::k2d) {}
 
 ExternalTexture::ExternalTexture(ExternalTexture&&) = default;
 
diff --git a/src/tint/ast/external_texture_test.cc b/src/tint/ast/external_texture_test.cc
index dfe097e..873dca8 100644
--- a/src/tint/ast/external_texture_test.cc
+++ b/src/tint/ast/external_texture_test.cc
@@ -15,6 +15,7 @@
 #include "src/tint/ast/external_texture.h"
 
 #include "src/tint/ast/test_helper.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::ast {
 namespace {
@@ -32,7 +33,7 @@
 
 TEST_F(AstExternalTextureTest, Dim) {
     auto* ty = create<ExternalTexture>();
-    EXPECT_EQ(ty->dim, ast::TextureDimension::k2d);
+    EXPECT_EQ(ty->dim, type::TextureDimension::k2d);
 }
 
 TEST_F(AstExternalTextureTest, FriendlyName) {
diff --git a/src/tint/ast/multisampled_texture.cc b/src/tint/ast/multisampled_texture.cc
index 0c44857..05aea9d 100644
--- a/src/tint/ast/multisampled_texture.cc
+++ b/src/tint/ast/multisampled_texture.cc
@@ -23,7 +23,7 @@
 MultisampledTexture::MultisampledTexture(ProgramID pid,
                                          NodeID nid,
                                          const Source& src,
-                                         TextureDimension d,
+                                         type::TextureDimension d,
                                          const Type* ty)
     : Base(pid, nid, src, d), type(ty) {
     TINT_ASSERT(AST, type);
diff --git a/src/tint/ast/multisampled_texture.h b/src/tint/ast/multisampled_texture.h
index 6887045..dfa192e 100644
--- a/src/tint/ast/multisampled_texture.h
+++ b/src/tint/ast/multisampled_texture.h
@@ -18,6 +18,7 @@
 #include <string>
 
 #include "src/tint/ast/texture.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::ast {
 
@@ -33,7 +34,7 @@
     MultisampledTexture(ProgramID pid,
                         NodeID nid,
                         const Source& src,
-                        TextureDimension dim,
+                        type::TextureDimension dim,
                         const Type* type);
     /// Move constructor
     MultisampledTexture(MultisampledTexture&&);
diff --git a/src/tint/ast/multisampled_texture_test.cc b/src/tint/ast/multisampled_texture_test.cc
index bc3b87f..ee05710 100644
--- a/src/tint/ast/multisampled_texture_test.cc
+++ b/src/tint/ast/multisampled_texture_test.cc
@@ -39,7 +39,7 @@
 
 TEST_F(AstMultisampledTextureTest, IsTexture) {
     auto* f32 = create<F32>();
-    Texture* ty = create<MultisampledTexture>(TextureDimension::kCube, f32);
+    Texture* ty = create<MultisampledTexture>(type::TextureDimension::kCube, f32);
     EXPECT_FALSE(ty->Is<DepthTexture>());
     EXPECT_TRUE(ty->Is<MultisampledTexture>());
     EXPECT_FALSE(ty->Is<SampledTexture>());
@@ -48,19 +48,19 @@
 
 TEST_F(AstMultisampledTextureTest, Dim) {
     auto* f32 = create<F32>();
-    auto* s = create<MultisampledTexture>(TextureDimension::k3d, f32);
-    EXPECT_EQ(s->dim, TextureDimension::k3d);
+    auto* s = create<MultisampledTexture>(type::TextureDimension::k3d, f32);
+    EXPECT_EQ(s->dim, type::TextureDimension::k3d);
 }
 
 TEST_F(AstMultisampledTextureTest, Type) {
     auto* f32 = create<F32>();
-    auto* s = create<MultisampledTexture>(TextureDimension::k3d, f32);
+    auto* s = create<MultisampledTexture>(type::TextureDimension::k3d, f32);
     EXPECT_EQ(s->type, f32);
 }
 
 TEST_F(AstMultisampledTextureTest, FriendlyName) {
     auto* f32 = create<F32>();
-    auto* s = create<MultisampledTexture>(TextureDimension::k3d, f32);
+    auto* s = create<MultisampledTexture>(type::TextureDimension::k3d, f32);
     EXPECT_EQ(s->FriendlyName(Symbols()), "texture_multisampled_3d<f32>");
 }
 
diff --git a/src/tint/ast/sampled_texture.cc b/src/tint/ast/sampled_texture.cc
index b8dfd61..cc33962 100644
--- a/src/tint/ast/sampled_texture.cc
+++ b/src/tint/ast/sampled_texture.cc
@@ -23,7 +23,7 @@
 SampledTexture::SampledTexture(ProgramID pid,
                                NodeID nid,
                                const Source& src,
-                               TextureDimension d,
+                               type::TextureDimension d,
                                const Type* ty)
     : Base(pid, nid, src, d), type(ty) {
     TINT_ASSERT(AST, type);
diff --git a/src/tint/ast/sampled_texture.h b/src/tint/ast/sampled_texture.h
index 1f33af3..4ad7aa7 100644
--- a/src/tint/ast/sampled_texture.h
+++ b/src/tint/ast/sampled_texture.h
@@ -18,6 +18,7 @@
 #include <string>
 
 #include "src/tint/ast/texture.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::ast {
 
@@ -33,7 +34,7 @@
     SampledTexture(ProgramID pid,
                    NodeID nid,
                    const Source& src,
-                   TextureDimension dim,
+                   type::TextureDimension dim,
                    const Type* type);
     /// Move constructor
     SampledTexture(SampledTexture&&);
diff --git a/src/tint/ast/sampled_texture_test.cc b/src/tint/ast/sampled_texture_test.cc
index f85d2df..4b42da7 100644
--- a/src/tint/ast/sampled_texture_test.cc
+++ b/src/tint/ast/sampled_texture_test.cc
@@ -24,7 +24,7 @@
 
 TEST_F(AstSampledTextureTest, IsTexture) {
     auto* f32 = create<F32>();
-    Texture* ty = create<SampledTexture>(TextureDimension::kCube, f32);
+    Texture* ty = create<SampledTexture>(type::TextureDimension::kCube, f32);
     EXPECT_FALSE(ty->Is<DepthTexture>());
     EXPECT_TRUE(ty->Is<SampledTexture>());
     EXPECT_FALSE(ty->Is<StorageTexture>());
@@ -32,19 +32,19 @@
 
 TEST_F(AstSampledTextureTest, Dim) {
     auto* f32 = create<F32>();
-    auto* s = create<SampledTexture>(TextureDimension::k3d, f32);
-    EXPECT_EQ(s->dim, TextureDimension::k3d);
+    auto* s = create<SampledTexture>(type::TextureDimension::k3d, f32);
+    EXPECT_EQ(s->dim, type::TextureDimension::k3d);
 }
 
 TEST_F(AstSampledTextureTest, Type) {
     auto* f32 = create<F32>();
-    auto* s = create<SampledTexture>(TextureDimension::k3d, f32);
+    auto* s = create<SampledTexture>(type::TextureDimension::k3d, f32);
     EXPECT_EQ(s->type, f32);
 }
 
 TEST_F(AstSampledTextureTest, FriendlyName) {
     auto* f32 = create<F32>();
-    auto* s = create<SampledTexture>(TextureDimension::k3d, f32);
+    auto* s = create<SampledTexture>(type::TextureDimension::k3d, f32);
     EXPECT_EQ(s->FriendlyName(Symbols()), "texture_3d<f32>");
 }
 
diff --git a/src/tint/ast/storage_texture.cc b/src/tint/ast/storage_texture.cc
index 0a48a5b..32e233b 100644
--- a/src/tint/ast/storage_texture.cc
+++ b/src/tint/ast/storage_texture.cc
@@ -26,7 +26,7 @@
 StorageTexture::StorageTexture(ProgramID pid,
                                NodeID nid,
                                const Source& src,
-                               TextureDimension d,
+                               type::TextureDimension d,
                                TexelFormat fmt,
                                const Type* subtype,
                                Access ac)
diff --git a/src/tint/ast/storage_texture.h b/src/tint/ast/storage_texture.h
index 9ae7b95..a16212d 100644
--- a/src/tint/ast/storage_texture.h
+++ b/src/tint/ast/storage_texture.h
@@ -20,6 +20,7 @@
 #include "src/tint/ast/access.h"
 #include "src/tint/ast/texel_format.h"
 #include "src/tint/ast/texture.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::ast {
 
@@ -37,7 +38,7 @@
     StorageTexture(ProgramID pid,
                    NodeID nid,
                    const Source& src,
-                   TextureDimension dim,
+                   type::TextureDimension dim,
                    TexelFormat format,
                    const Type* subtype,
                    Access access_control);
diff --git a/src/tint/ast/storage_texture_test.cc b/src/tint/ast/storage_texture_test.cc
index 41f3d65..69ee4a0 100644
--- a/src/tint/ast/storage_texture_test.cc
+++ b/src/tint/ast/storage_texture_test.cc
@@ -23,8 +23,8 @@
 
 TEST_F(AstStorageTextureTest, IsTexture) {
     auto* subtype = StorageTexture::SubtypeFor(TexelFormat::kRgba32Float, *this);
-    Texture* ty = create<StorageTexture>(TextureDimension::k2dArray, TexelFormat::kRgba32Float,
-                                         subtype, Access::kRead);
+    Texture* ty = create<StorageTexture>(type::TextureDimension::k2dArray,
+                                         TexelFormat::kRgba32Float, subtype, Access::kRead);
     EXPECT_FALSE(ty->Is<DepthTexture>());
     EXPECT_FALSE(ty->Is<SampledTexture>());
     EXPECT_TRUE(ty->Is<StorageTexture>());
@@ -32,29 +32,29 @@
 
 TEST_F(AstStorageTextureTest, Dim) {
     auto* subtype = StorageTexture::SubtypeFor(TexelFormat::kRgba32Float, *this);
-    auto* s = create<StorageTexture>(TextureDimension::k2dArray, TexelFormat::kRgba32Float, subtype,
-                                     Access::kRead);
-    EXPECT_EQ(s->dim, TextureDimension::k2dArray);
+    auto* s = create<StorageTexture>(type::TextureDimension::k2dArray, TexelFormat::kRgba32Float,
+                                     subtype, Access::kRead);
+    EXPECT_EQ(s->dim, type::TextureDimension::k2dArray);
 }
 
 TEST_F(AstStorageTextureTest, Format) {
     auto* subtype = StorageTexture::SubtypeFor(TexelFormat::kRgba32Float, *this);
-    auto* s = create<StorageTexture>(TextureDimension::k2dArray, TexelFormat::kRgba32Float, subtype,
-                                     Access::kRead);
+    auto* s = create<StorageTexture>(type::TextureDimension::k2dArray, TexelFormat::kRgba32Float,
+                                     subtype, Access::kRead);
     EXPECT_EQ(s->format, TexelFormat::kRgba32Float);
 }
 
 TEST_F(AstStorageTextureTest, FriendlyName) {
     auto* subtype = StorageTexture::SubtypeFor(TexelFormat::kRgba32Float, *this);
-    auto* s = create<StorageTexture>(TextureDimension::k2dArray, TexelFormat::kRgba32Float, subtype,
-                                     Access::kRead);
+    auto* s = create<StorageTexture>(type::TextureDimension::k2dArray, TexelFormat::kRgba32Float,
+                                     subtype, Access::kRead);
     EXPECT_EQ(s->FriendlyName(Symbols()), "texture_storage_2d_array<rgba32float, read>");
 }
 
 TEST_F(AstStorageTextureTest, F32) {
     auto* subtype = StorageTexture::SubtypeFor(TexelFormat::kRgba32Float, *this);
-    Type* s = create<StorageTexture>(TextureDimension::k2dArray, TexelFormat::kRgba32Float, subtype,
-                                     Access::kRead);
+    Type* s = create<StorageTexture>(type::TextureDimension::k2dArray, TexelFormat::kRgba32Float,
+                                     subtype, Access::kRead);
 
     ASSERT_TRUE(s->Is<Texture>());
     ASSERT_TRUE(s->Is<StorageTexture>());
@@ -63,8 +63,8 @@
 
 TEST_F(AstStorageTextureTest, U32) {
     auto* subtype = StorageTexture::SubtypeFor(TexelFormat::kRg32Uint, *this);
-    Type* s = create<StorageTexture>(TextureDimension::k2dArray, TexelFormat::kRg32Uint, subtype,
-                                     Access::kRead);
+    Type* s = create<StorageTexture>(type::TextureDimension::k2dArray, TexelFormat::kRg32Uint,
+                                     subtype, Access::kRead);
 
     ASSERT_TRUE(s->Is<Texture>());
     ASSERT_TRUE(s->Is<StorageTexture>());
@@ -73,8 +73,8 @@
 
 TEST_F(AstStorageTextureTest, I32) {
     auto* subtype = StorageTexture::SubtypeFor(TexelFormat::kRgba32Sint, *this);
-    Type* s = create<StorageTexture>(TextureDimension::k2dArray, TexelFormat::kRgba32Sint, subtype,
-                                     Access::kRead);
+    Type* s = create<StorageTexture>(type::TextureDimension::k2dArray, TexelFormat::kRgba32Sint,
+                                     subtype, Access::kRead);
 
     ASSERT_TRUE(s->Is<Texture>());
     ASSERT_TRUE(s->Is<StorageTexture>());
diff --git a/src/tint/ast/texture.cc b/src/tint/ast/texture.cc
index f3c01df..bcfbcb5 100644
--- a/src/tint/ast/texture.cc
+++ b/src/tint/ast/texture.cc
@@ -18,66 +18,39 @@
 
 namespace tint::ast {
 
-std::ostream& operator<<(std::ostream& out, TextureDimension dim) {
+bool IsTextureArray(type::TextureDimension dim) {
     switch (dim) {
-        case TextureDimension::kNone:
-            out << "None";
-            break;
-        case TextureDimension::k1d:
-            out << "1d";
-            break;
-        case TextureDimension::k2d:
-            out << "2d";
-            break;
-        case TextureDimension::k2dArray:
-            out << "2d_array";
-            break;
-        case TextureDimension::k3d:
-            out << "3d";
-            break;
-        case TextureDimension::kCube:
-            out << "cube";
-            break;
-        case TextureDimension::kCubeArray:
-            out << "cube_array";
-            break;
-    }
-    return out;
-}
-
-bool IsTextureArray(TextureDimension dim) {
-    switch (dim) {
-        case TextureDimension::k2dArray:
-        case TextureDimension::kCubeArray:
+        case type::TextureDimension::k2dArray:
+        case type::TextureDimension::kCubeArray:
             return true;
-        case TextureDimension::k2d:
-        case TextureDimension::kNone:
-        case TextureDimension::k1d:
-        case TextureDimension::k3d:
-        case TextureDimension::kCube:
+        case type::TextureDimension::k2d:
+        case type::TextureDimension::kNone:
+        case type::TextureDimension::k1d:
+        case type::TextureDimension::k3d:
+        case type::TextureDimension::kCube:
             return false;
     }
     return false;
 }
 
-int NumCoordinateAxes(TextureDimension dim) {
+int NumCoordinateAxes(type::TextureDimension dim) {
     switch (dim) {
-        case TextureDimension::kNone:
+        case type::TextureDimension::kNone:
             return 0;
-        case TextureDimension::k1d:
+        case type::TextureDimension::k1d:
             return 1;
-        case TextureDimension::k2d:
-        case TextureDimension::k2dArray:
+        case type::TextureDimension::k2d:
+        case type::TextureDimension::k2dArray:
             return 2;
-        case TextureDimension::k3d:
-        case TextureDimension::kCube:
-        case TextureDimension::kCubeArray:
+        case type::TextureDimension::k3d:
+        case type::TextureDimension::kCube:
+        case type::TextureDimension::kCubeArray:
             return 3;
     }
     return 0;
 }
 
-Texture::Texture(ProgramID pid, NodeID nid, const Source& src, TextureDimension d)
+Texture::Texture(ProgramID pid, NodeID nid, const Source& src, type::TextureDimension d)
     : Base(pid, nid, src), dim(d) {}
 
 Texture::Texture(Texture&&) = default;
diff --git a/src/tint/ast/texture.h b/src/tint/ast/texture.h
index fcfa334..be78ba9 100644
--- a/src/tint/ast/texture.h
+++ b/src/tint/ast/texture.h
@@ -16,35 +16,13 @@
 #define SRC_TINT_AST_TEXTURE_H_
 
 #include "src/tint/ast/type.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::ast {
 
-/// The dimensionality of the texture
-enum class TextureDimension {
-    /// Invalid texture
-    kNone = -1,
-    /// 1 dimensional texture
-    k1d,
-    /// 2 dimensional texture
-    k2d,
-    /// 2 dimensional array texture
-    k2dArray,
-    /// 3 dimensional texture
-    k3d,
-    /// cube texture
-    kCube,
-    /// cube array texture
-    kCubeArray,
-};
-
-/// @param out the std::ostream to write to
-/// @param dim the TextureDimension
-/// @return the std::ostream so calls can be chained
-std::ostream& operator<<(std::ostream& out, TextureDimension dim);
-
-/// @param dim the TextureDimension to query
-/// @return true if the given TextureDimension is an array texture
-bool IsTextureArray(TextureDimension dim);
+/// @param dim the type::TextureDimension to query
+/// @return true if the given type::TextureDimension is an array texture
+bool IsTextureArray(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,
@@ -56,9 +34,9 @@
 /// Note: To sample a cube texture, the coordinate has 3 dimensions,
 /// but textureDimensions on a cube or cube array returns a 2-element
 /// size, representing the (x,y) size of each cube face, in texels.
-/// @param dim the TextureDimension to query
+/// @param dim the type::TextureDimension to query
 /// @return number of dimensions in a coordinate for the dimensionality
-int NumCoordinateAxes(TextureDimension dim);
+int NumCoordinateAxes(type::TextureDimension dim);
 
 /// A texture type.
 class Texture : public Castable<Texture, Type> {
@@ -68,13 +46,13 @@
     /// @param nid the unique node identifier
     /// @param src the source of this node
     /// @param dim the dimensionality of the texture
-    Texture(ProgramID pid, NodeID nid, const Source& src, TextureDimension dim);
+    Texture(ProgramID pid, NodeID nid, const Source& src, type::TextureDimension dim);
     /// Move constructor
     Texture(Texture&&);
     ~Texture() override;
 
     /// The texture dimension
-    const TextureDimension dim;
+    const type::TextureDimension dim;
 };
 
 }  // namespace tint::ast
diff --git a/src/tint/ast/texture_test.cc b/src/tint/ast/texture_test.cc
index 7b7c0b0..cad2884 100644
--- a/src/tint/ast/texture_test.cc
+++ b/src/tint/ast/texture_test.cc
@@ -33,23 +33,23 @@
 using AstTextureTypeTest = TestHelper;
 
 TEST_F(AstTextureTypeTest, IsTextureArray) {
-    EXPECT_EQ(false, IsTextureArray(TextureDimension::kNone));
-    EXPECT_EQ(false, IsTextureArray(TextureDimension::k1d));
-    EXPECT_EQ(false, IsTextureArray(TextureDimension::k2d));
-    EXPECT_EQ(true, IsTextureArray(TextureDimension::k2dArray));
-    EXPECT_EQ(false, IsTextureArray(TextureDimension::k3d));
-    EXPECT_EQ(false, IsTextureArray(TextureDimension::kCube));
-    EXPECT_EQ(true, IsTextureArray(TextureDimension::kCubeArray));
+    EXPECT_EQ(false, IsTextureArray(type::TextureDimension::kNone));
+    EXPECT_EQ(false, IsTextureArray(type::TextureDimension::k1d));
+    EXPECT_EQ(false, IsTextureArray(type::TextureDimension::k2d));
+    EXPECT_EQ(true, IsTextureArray(type::TextureDimension::k2dArray));
+    EXPECT_EQ(false, IsTextureArray(type::TextureDimension::k3d));
+    EXPECT_EQ(false, IsTextureArray(type::TextureDimension::kCube));
+    EXPECT_EQ(true, IsTextureArray(type::TextureDimension::kCubeArray));
 }
 
 TEST_F(AstTextureTypeTest, NumCoordinateAxes) {
-    EXPECT_EQ(0, NumCoordinateAxes(TextureDimension::kNone));
-    EXPECT_EQ(1, NumCoordinateAxes(TextureDimension::k1d));
-    EXPECT_EQ(2, NumCoordinateAxes(TextureDimension::k2d));
-    EXPECT_EQ(2, NumCoordinateAxes(TextureDimension::k2dArray));
-    EXPECT_EQ(3, NumCoordinateAxes(TextureDimension::k3d));
-    EXPECT_EQ(3, NumCoordinateAxes(TextureDimension::kCube));
-    EXPECT_EQ(3, NumCoordinateAxes(TextureDimension::kCubeArray));
+    EXPECT_EQ(0, NumCoordinateAxes(type::TextureDimension::kNone));
+    EXPECT_EQ(1, NumCoordinateAxes(type::TextureDimension::k1d));
+    EXPECT_EQ(2, NumCoordinateAxes(type::TextureDimension::k2d));
+    EXPECT_EQ(2, NumCoordinateAxes(type::TextureDimension::k2dArray));
+    EXPECT_EQ(3, NumCoordinateAxes(type::TextureDimension::k3d));
+    EXPECT_EQ(3, NumCoordinateAxes(type::TextureDimension::kCube));
+    EXPECT_EQ(3, NumCoordinateAxes(type::TextureDimension::kCubeArray));
 }
 
 }  // namespace
diff --git a/src/tint/inspector/inspector_test.cc b/src/tint/inspector/inspector_test.cc
index d6c635d..98f75b6 100644
--- a/src/tint/inspector/inspector_test.cc
+++ b/src/tint/inspector/inspector_test.cc
@@ -27,6 +27,7 @@
 #include "src/tint/type/external_texture.h"
 #include "src/tint/type/multisampled_texture.h"
 #include "src/tint/type/sampled_texture.h"
+#include "src/tint/type/texture_dimension.h"
 #include "tint/tint.h"
 
 using namespace tint::number_suffixes;  // NOLINT
@@ -76,7 +77,7 @@
 class InspectorGetSampledArrayTextureResourceBindingsTest : public InspectorBuilder,
                                                             public testing::Test {};
 struct GetSampledTextureTestParams {
-    ast::TextureDimension type_dim;
+    type::TextureDimension type_dim;
     inspector::ResourceBinding::TextureDimension inspector_dim;
     inspector::ResourceBinding::SampledKind sampled_kind;
 };
@@ -100,7 +101,7 @@
 class InspectorGetStorageTextureResourceBindingsTest : public InspectorBuilder,
                                                        public testing::Test {};
 struct GetDepthTextureTestParams {
-    ast::TextureDimension type_dim;
+    type::TextureDimension type_dim;
     inspector::ResourceBinding::TextureDimension inspector_dim;
 };
 class InspectorGetDepthTextureResourceBindingsTestWithParam
@@ -110,7 +111,7 @@
 class InspectorGetDepthMultisampledTextureResourceBindingsTest : public InspectorBuilder,
                                                                  public testing::Test {};
 
-typedef std::tuple<ast::TextureDimension, ResourceBinding::TextureDimension> DimensionParams;
+typedef std::tuple<type::TextureDimension, ResourceBinding::TextureDimension> DimensionParams;
 typedef std::tuple<ast::TexelFormat, ResourceBinding::TexelFormat, ResourceBinding::SampledKind>
     TexelFormatParams;
 typedef std::tuple<DimensionParams, TexelFormatParams> GetStorageTextureTestParams;
@@ -1784,14 +1785,14 @@
                                                 MemberInfo{0, ty.i32()},
                                             });
 
-    auto* s_texture_type = ty.sampled_texture(ast::TextureDimension::k1d, ty.f32());
+    auto* s_texture_type = ty.sampled_texture(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(),
                                      utils::Empty);
 
-    auto* cs_depth_texture_type = ty.depth_texture(ast::TextureDimension::k2d);
+    auto* cs_depth_texture_type = ty.depth_texture(type::TextureDimension::k2d);
     AddResource("cs_texture", cs_depth_texture_type, 3, 1);
     AddComparisonSampler("cs_var", 3, 2);
     AddGlobalVariable("cs_coords", ty.vec2<f32>());
@@ -1799,14 +1800,15 @@
     MakeComparisonSamplerReferenceBodyFunction("cs_func", "cs_texture", "cs_var", "cs_coords",
                                                "cs_depth", ty.f32(), utils::Empty);
 
-    auto* depth_ms_texture_type = ty.depth_multisampled_texture(ast::TextureDimension::k2d);
+    auto* depth_ms_texture_type = ty.depth_multisampled_texture(type::TextureDimension::k2d);
     AddResource("depth_ms_texture", depth_ms_texture_type, 3, 3);
     Func("depth_ms_func", utils::Empty, ty.void_(),
          utils::Vector{
              Ignore("depth_ms_texture"),
          });
 
-    auto* st_type = MakeStorageTextureTypes(ast::TextureDimension::k2d, ast::TexelFormat::kR32Uint);
+    auto* st_type =
+        MakeStorageTextureTypes(type::TextureDimension::k2d, ast::TexelFormat::kR32Uint);
     AddStorageTexture("st_var", st_type, 4, 0);
     MakeStorageTextureBodyFunction("st_func", "st_var", ty.vec2<u32>(), utils::Empty);
 
@@ -2586,7 +2588,7 @@
 }
 
 TEST_F(InspectorGetSamplerResourceBindingsTest, Simple) {
-    auto* sampled_texture_type = ty.sampled_texture(ast::TextureDimension::k1d, ty.f32());
+    auto* sampled_texture_type = ty.sampled_texture(type::TextureDimension::k1d, ty.f32());
     AddResource("foo_texture", sampled_texture_type, 0, 0);
     AddSampler("foo_sampler", 0, 1);
     AddGlobalVariable("foo_coords", ty.f32());
@@ -2621,7 +2623,7 @@
 }
 
 TEST_F(InspectorGetSamplerResourceBindingsTest, InFunction) {
-    auto* sampled_texture_type = ty.sampled_texture(ast::TextureDimension::k1d, ty.f32());
+    auto* sampled_texture_type = ty.sampled_texture(type::TextureDimension::k1d, ty.f32());
     AddResource("foo_texture", sampled_texture_type, 0, 0);
     AddSampler("foo_sampler", 0, 1);
     AddGlobalVariable("foo_coords", ty.f32());
@@ -2646,7 +2648,7 @@
 }
 
 TEST_F(InspectorGetSamplerResourceBindingsTest, UnknownEntryPoint) {
-    auto* sampled_texture_type = ty.sampled_texture(ast::TextureDimension::k1d, ty.f32());
+    auto* sampled_texture_type = ty.sampled_texture(type::TextureDimension::k1d, ty.f32());
     AddResource("foo_texture", sampled_texture_type, 0, 0);
     AddSampler("foo_sampler", 0, 1);
     AddGlobalVariable("foo_coords", ty.f32());
@@ -2663,7 +2665,7 @@
 }
 
 TEST_F(InspectorGetSamplerResourceBindingsTest, SkipsComparisonSamplers) {
-    auto* depth_texture_type = ty.depth_texture(ast::TextureDimension::k2d);
+    auto* depth_texture_type = ty.depth_texture(type::TextureDimension::k2d);
     AddResource("foo_texture", depth_texture_type, 0, 0);
     AddComparisonSampler("foo_sampler", 0, 1);
     AddGlobalVariable("foo_coords", ty.vec2<f32>());
@@ -2684,7 +2686,7 @@
 }
 
 TEST_F(InspectorGetComparisonSamplerResourceBindingsTest, Simple) {
-    auto* depth_texture_type = ty.depth_texture(ast::TextureDimension::k2d);
+    auto* depth_texture_type = ty.depth_texture(type::TextureDimension::k2d);
     AddResource("foo_texture", depth_texture_type, 0, 0);
     AddComparisonSampler("foo_sampler", 0, 1);
     AddGlobalVariable("foo_coords", ty.vec2<f32>());
@@ -2721,7 +2723,7 @@
 }
 
 TEST_F(InspectorGetComparisonSamplerResourceBindingsTest, InFunction) {
-    auto* depth_texture_type = ty.depth_texture(ast::TextureDimension::k2d);
+    auto* depth_texture_type = ty.depth_texture(type::TextureDimension::k2d);
     AddResource("foo_texture", depth_texture_type, 0, 0);
     AddComparisonSampler("foo_sampler", 0, 1);
     AddGlobalVariable("foo_coords", ty.vec2<f32>());
@@ -2747,7 +2749,7 @@
 }
 
 TEST_F(InspectorGetComparisonSamplerResourceBindingsTest, UnknownEntryPoint) {
-    auto* depth_texture_type = ty.depth_texture(ast::TextureDimension::k2d);
+    auto* depth_texture_type = ty.depth_texture(type::TextureDimension::k2d);
     AddResource("foo_texture", depth_texture_type, 0, 0);
     AddComparisonSampler("foo_sampler", 0, 1);
     AddGlobalVariable("foo_coords", ty.vec2<f32>());
@@ -2766,7 +2768,7 @@
 }
 
 TEST_F(InspectorGetComparisonSamplerResourceBindingsTest, SkipsSamplers) {
-    auto* sampled_texture_type = ty.sampled_texture(ast::TextureDimension::k1d, ty.f32());
+    auto* sampled_texture_type = ty.sampled_texture(type::TextureDimension::k1d, ty.f32());
     AddResource("foo_texture", sampled_texture_type, 0, 0);
     AddSampler("foo_sampler", 0, 1);
     AddGlobalVariable("foo_coords", ty.f32());
@@ -2833,16 +2835,16 @@
 INSTANTIATE_TEST_SUITE_P(
     InspectorGetSampledTextureResourceBindingsTest,
     InspectorGetSampledTextureResourceBindingsTestWithParam,
-    testing::Values(GetSampledTextureTestParams{ast::TextureDimension::k1d,
+    testing::Values(GetSampledTextureTestParams{type::TextureDimension::k1d,
                                                 inspector::ResourceBinding::TextureDimension::k1d,
                                                 inspector::ResourceBinding::SampledKind::kFloat},
-                    GetSampledTextureTestParams{ast::TextureDimension::k2d,
+                    GetSampledTextureTestParams{type::TextureDimension::k2d,
                                                 inspector::ResourceBinding::TextureDimension::k2d,
                                                 inspector::ResourceBinding::SampledKind::kFloat},
-                    GetSampledTextureTestParams{ast::TextureDimension::k3d,
+                    GetSampledTextureTestParams{type::TextureDimension::k3d,
                                                 inspector::ResourceBinding::TextureDimension::k3d,
                                                 inspector::ResourceBinding::SampledKind::kFloat},
-                    GetSampledTextureTestParams{ast::TextureDimension::kCube,
+                    GetSampledTextureTestParams{type::TextureDimension::kCube,
                                                 inspector::ResourceBinding::TextureDimension::kCube,
                                                 inspector::ResourceBinding::SampledKind::kFloat}));
 
@@ -2878,10 +2880,10 @@
     InspectorGetSampledArrayTextureResourceBindingsTest,
     InspectorGetSampledArrayTextureResourceBindingsTestWithParam,
     testing::Values(
-        GetSampledTextureTestParams{ast::TextureDimension::k2dArray,
+        GetSampledTextureTestParams{type::TextureDimension::k2dArray,
                                     inspector::ResourceBinding::TextureDimension::k2dArray,
                                     inspector::ResourceBinding::SampledKind::kFloat},
-        GetSampledTextureTestParams{ast::TextureDimension::kCubeArray,
+        GetSampledTextureTestParams{type::TextureDimension::kCubeArray,
                                     inspector::ResourceBinding::TextureDimension::kCubeArray,
                                     inspector::ResourceBinding::SampledKind::kFloat}));
 
@@ -2924,13 +2926,13 @@
     InspectorGetMultisampledTextureResourceBindingsTest,
     InspectorGetMultisampledTextureResourceBindingsTestWithParam,
     testing::Values(
-        GetMultisampledTextureTestParams{ast::TextureDimension::k2d,
+        GetMultisampledTextureTestParams{type::TextureDimension::k2d,
                                          inspector::ResourceBinding::TextureDimension::k2d,
                                          inspector::ResourceBinding::SampledKind::kFloat},
-        GetMultisampledTextureTestParams{ast::TextureDimension::k2d,
+        GetMultisampledTextureTestParams{type::TextureDimension::k2d,
                                          inspector::ResourceBinding::TextureDimension::k2d,
                                          inspector::ResourceBinding::SampledKind::kSInt},
-        GetMultisampledTextureTestParams{ast::TextureDimension::k2d,
+        GetMultisampledTextureTestParams{type::TextureDimension::k2d,
                                          inspector::ResourceBinding::TextureDimension::k2d,
                                          inspector::ResourceBinding::SampledKind::kUInt}));
 
@@ -2964,7 +2966,7 @@
     TexelFormatParams format_params;
     std::tie(dim_params, format_params) = GetParam();
 
-    ast::TextureDimension dim;
+    type::TextureDimension dim;
     ResourceBinding::TextureDimension expected_dim;
     std::tie(dim, expected_dim) = dim_params;
 
@@ -2978,14 +2980,14 @@
 
     const ast::Type* dim_type = nullptr;
     switch (dim) {
-        case ast::TextureDimension::k1d:
+        case type::TextureDimension::k1d:
             dim_type = ty.u32();
             break;
-        case ast::TextureDimension::k2d:
-        case ast::TextureDimension::k2dArray:
+        case type::TextureDimension::k2d:
+        case type::TextureDimension::k2dArray:
             dim_type = ty.vec2<u32>();
             break;
-        case ast::TextureDimension::k3d:
+        case type::TextureDimension::k3d:
             dim_type = ty.vec3<u32>();
             break;
         default:
@@ -3016,13 +3018,13 @@
 INSTANTIATE_TEST_SUITE_P(
     InspectorGetStorageTextureResourceBindingsTest,
     InspectorGetStorageTextureResourceBindingsTestWithParam,
-    testing::Combine(testing::Values(std::make_tuple(ast::TextureDimension::k1d,
+    testing::Combine(testing::Values(std::make_tuple(type::TextureDimension::k1d,
                                                      ResourceBinding::TextureDimension::k1d),
-                                     std::make_tuple(ast::TextureDimension::k2d,
+                                     std::make_tuple(type::TextureDimension::k2d,
                                                      ResourceBinding::TextureDimension::k2d),
-                                     std::make_tuple(ast::TextureDimension::k2dArray,
+                                     std::make_tuple(type::TextureDimension::k2dArray,
                                                      ResourceBinding::TextureDimension::k2dArray),
-                                     std::make_tuple(ast::TextureDimension::k3d,
+                                     std::make_tuple(type::TextureDimension::k3d,
                                                      ResourceBinding::TextureDimension::k3d)),
                      testing::Values(std::make_tuple(ast::TexelFormat::kR32Float,
                                                      ResourceBinding::TexelFormat::kR32Float,
@@ -3101,17 +3103,17 @@
     InspectorGetDepthTextureResourceBindingsTest,
     InspectorGetDepthTextureResourceBindingsTestWithParam,
     testing::Values(
-        GetDepthTextureTestParams{ast::TextureDimension::k2d,
+        GetDepthTextureTestParams{type::TextureDimension::k2d,
                                   inspector::ResourceBinding::TextureDimension::k2d},
-        GetDepthTextureTestParams{ast::TextureDimension::k2dArray,
+        GetDepthTextureTestParams{type::TextureDimension::k2dArray,
                                   inspector::ResourceBinding::TextureDimension::k2dArray},
-        GetDepthTextureTestParams{ast::TextureDimension::kCube,
+        GetDepthTextureTestParams{type::TextureDimension::kCube,
                                   inspector::ResourceBinding::TextureDimension::kCube},
-        GetDepthTextureTestParams{ast::TextureDimension::kCubeArray,
+        GetDepthTextureTestParams{type::TextureDimension::kCubeArray,
                                   inspector::ResourceBinding::TextureDimension::kCubeArray}));
 
 TEST_F(InspectorGetDepthMultisampledTextureResourceBindingsTest, textureDimensions) {
-    auto* depth_ms_texture_type = ty.depth_multisampled_texture(ast::TextureDimension::k2d);
+    auto* depth_ms_texture_type = ty.depth_multisampled_texture(type::TextureDimension::k2d);
     AddResource("tex", depth_ms_texture_type, 0, 0);
 
     Func("ep", utils::Empty, ty.void_(),
diff --git a/src/tint/inspector/resource_binding.cc b/src/tint/inspector/resource_binding.cc
index 4dd26e0..fbaf47a 100644
--- a/src/tint/inspector/resource_binding.cc
+++ b/src/tint/inspector/resource_binding.cc
@@ -18,6 +18,7 @@
 #include "src/tint/type/f32.h"
 #include "src/tint/type/i32.h"
 #include "src/tint/type/matrix.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/type/type.h"
 #include "src/tint/type/u32.h"
 #include "src/tint/type/vector.h"
@@ -25,21 +26,21 @@
 namespace tint::inspector {
 
 ResourceBinding::TextureDimension TypeTextureDimensionToResourceBindingTextureDimension(
-    const ast::TextureDimension& type_dim) {
+    const type::TextureDimension& type_dim) {
     switch (type_dim) {
-        case ast::TextureDimension::k1d:
+        case type::TextureDimension::k1d:
             return ResourceBinding::TextureDimension::k1d;
-        case ast::TextureDimension::k2d:
+        case type::TextureDimension::k2d:
             return ResourceBinding::TextureDimension::k2d;
-        case ast::TextureDimension::k2dArray:
+        case type::TextureDimension::k2dArray:
             return ResourceBinding::TextureDimension::k2dArray;
-        case ast::TextureDimension::k3d:
+        case type::TextureDimension::k3d:
             return ResourceBinding::TextureDimension::k3d;
-        case ast::TextureDimension::kCube:
+        case type::TextureDimension::kCube:
             return ResourceBinding::TextureDimension::kCube;
-        case ast::TextureDimension::kCubeArray:
+        case type::TextureDimension::kCubeArray:
             return ResourceBinding::TextureDimension::kCubeArray;
-        case ast::TextureDimension::kNone:
+        case type::TextureDimension::kNone:
             return ResourceBinding::TextureDimension::kNone;
     }
     return ResourceBinding::TextureDimension::kNone;
diff --git a/src/tint/inspector/resource_binding.h b/src/tint/inspector/resource_binding.h
index ef22578..386d188 100644
--- a/src/tint/inspector/resource_binding.h
+++ b/src/tint/inspector/resource_binding.h
@@ -18,7 +18,7 @@
 #include <cstdint>
 
 #include "src/tint/ast/storage_texture.h"
-#include "src/tint/ast/texture.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/type/type.h"
 
 namespace tint::inspector {
@@ -104,12 +104,12 @@
     TexelFormat image_format;
 };
 
-/// Convert from internal ast::TextureDimension to public
+/// Convert from internal type::TextureDimension to public
 /// ResourceBinding::TextureDimension
 /// @param type_dim internal value to convert from
 /// @returns the publicly visible equivalent
 ResourceBinding::TextureDimension TypeTextureDimensionToResourceBindingTextureDimension(
-    const ast::TextureDimension& type_dim);
+    const type::TextureDimension& type_dim);
 
 /// Infer ResourceBinding::SampledKind for a given type::Type
 /// @param base_type internal type to infer from
diff --git a/src/tint/inspector/test_inspector_builder.cc b/src/tint/inspector/test_inspector_builder.cc
index 97ae097..81d8f39 100644
--- a/src/tint/inspector/test_inspector_builder.cc
+++ b/src/tint/inspector/test_inspector_builder.cc
@@ -259,17 +259,17 @@
     }
 }
 
-const ast::Type* InspectorBuilder::GetCoordsType(ast::TextureDimension dim,
+const ast::Type* InspectorBuilder::GetCoordsType(type::TextureDimension dim,
                                                  const ast::Type* scalar) {
     switch (dim) {
-        case ast::TextureDimension::k1d:
+        case type::TextureDimension::k1d:
             return scalar;
-        case ast::TextureDimension::k2d:
-        case ast::TextureDimension::k2dArray:
+        case type::TextureDimension::k2d:
+        case type::TextureDimension::k2dArray:
             return create<ast::Vector>(scalar, 2u);
-        case ast::TextureDimension::k3d:
-        case ast::TextureDimension::kCube:
-        case ast::TextureDimension::kCubeArray:
+        case type::TextureDimension::k3d:
+        case type::TextureDimension::kCube:
+        case type::TextureDimension::kCubeArray:
             return create<ast::Vector>(scalar, 3u);
         default:
             [=]() { FAIL() << "Unsupported texture dimension: " << dim; }();
@@ -277,7 +277,7 @@
     return nullptr;
 }
 
-const ast::Type* InspectorBuilder::MakeStorageTextureTypes(ast::TextureDimension dim,
+const ast::Type* InspectorBuilder::MakeStorageTextureTypes(type::TextureDimension dim,
                                                            ast::TexelFormat format) {
     return ty.storage_texture(dim, format, ast::Access::kWrite);
 }
diff --git a/src/tint/inspector/test_inspector_builder.h b/src/tint/inspector/test_inspector_builder.h
index 8439bd6..36c70b7 100644
--- a/src/tint/inspector/test_inspector_builder.h
+++ b/src/tint/inspector/test_inspector_builder.h
@@ -31,6 +31,7 @@
 #include "src/tint/type/external_texture.h"
 #include "src/tint/type/multisampled_texture.h"
 #include "src/tint/type/sampled_texture.h"
+#include "src/tint/type/texture_dimension.h"
 #include "tint/tint.h"
 
 namespace tint::inspector {
@@ -287,13 +288,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
-    const ast::Type* GetCoordsType(ast::TextureDimension dim, const ast::Type* scalar);
+    const ast::Type* GetCoordsType(type::TextureDimension dim, const 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
-    const ast::Type* MakeStorageTextureTypes(ast::TextureDimension dim, ast::TexelFormat format);
+    const ast::Type* MakeStorageTextureTypes(type::TextureDimension dim, ast::TexelFormat format);
 
     /// Adds a storage texture variable to the program
     /// @param name the name of the variable
diff --git a/src/tint/program_builder.h b/src/tint/program_builder.h
index 9b688f0..e593181 100644
--- a/src/tint/program_builder.h
+++ b/src/tint/program_builder.h
@@ -107,6 +107,7 @@
 #include "src/tint/type/pointer.h"
 #include "src/tint/type/sampled_texture.h"
 #include "src/tint/type/storage_texture.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/type/u32.h"
 #include "src/tint/type/vector.h"
 #include "src/tint/type/void.h"
@@ -1012,7 +1013,7 @@
 
         /// @param dims the dimensionality of the texture
         /// @returns the depth texture
-        const ast::DepthTexture* depth_texture(ast::TextureDimension dims) const {
+        const ast::DepthTexture* depth_texture(type::TextureDimension dims) const {
             return builder->create<ast::DepthTexture>(dims);
         }
 
@@ -1020,14 +1021,14 @@
         /// @param dims the dimensionality of the texture
         /// @returns the depth texture
         const ast::DepthTexture* depth_texture(const Source& source,
-                                               ast::TextureDimension dims) const {
+                                               type::TextureDimension dims) const {
             return builder->create<ast::DepthTexture>(source, dims);
         }
 
         /// @param dims the dimensionality of the texture
         /// @returns the multisampled depth texture
         const ast::DepthMultisampledTexture* depth_multisampled_texture(
-            ast::TextureDimension dims) const {
+            type::TextureDimension dims) const {
             return builder->create<ast::DepthMultisampledTexture>(dims);
         }
 
@@ -1036,14 +1037,14 @@
         /// @returns the multisampled depth texture
         const ast::DepthMultisampledTexture* depth_multisampled_texture(
             const Source& source,
-            ast::TextureDimension dims) const {
+            type::TextureDimension dims) const {
             return builder->create<ast::DepthMultisampledTexture>(source, dims);
         }
 
         /// @param dims the dimensionality of the texture
         /// @param subtype the texture subtype.
         /// @returns the sampled texture
-        const ast::SampledTexture* sampled_texture(ast::TextureDimension dims,
+        const ast::SampledTexture* sampled_texture(type::TextureDimension dims,
                                                    const ast::Type* subtype) const {
             return builder->create<ast::SampledTexture>(dims, subtype);
         }
@@ -1053,7 +1054,7 @@
         /// @param subtype the texture subtype.
         /// @returns the sampled texture
         const ast::SampledTexture* sampled_texture(const Source& source,
-                                                   ast::TextureDimension dims,
+                                                   type::TextureDimension dims,
                                                    const ast::Type* subtype) const {
             return builder->create<ast::SampledTexture>(source, dims, subtype);
         }
@@ -1061,7 +1062,7 @@
         /// @param dims the dimensionality of the texture
         /// @param subtype the texture subtype.
         /// @returns the multisampled texture
-        const ast::MultisampledTexture* multisampled_texture(ast::TextureDimension dims,
+        const ast::MultisampledTexture* multisampled_texture(type::TextureDimension dims,
                                                              const ast::Type* subtype) const {
             return builder->create<ast::MultisampledTexture>(dims, subtype);
         }
@@ -1071,7 +1072,7 @@
         /// @param subtype the texture subtype.
         /// @returns the multisampled texture
         const ast::MultisampledTexture* multisampled_texture(const Source& source,
-                                                             ast::TextureDimension dims,
+                                                             type::TextureDimension dims,
                                                              const ast::Type* subtype) const {
             return builder->create<ast::MultisampledTexture>(source, dims, subtype);
         }
@@ -1080,7 +1081,7 @@
         /// @param format the texel format of the texture
         /// @param access the access control of the texture
         /// @returns the storage texture
-        const ast::StorageTexture* storage_texture(ast::TextureDimension dims,
+        const ast::StorageTexture* storage_texture(type::TextureDimension dims,
                                                    ast::TexelFormat format,
                                                    ast::Access access) const {
             auto* subtype = ast::StorageTexture::SubtypeFor(format, *builder);
@@ -1093,7 +1094,7 @@
         /// @param access the access control of the texture
         /// @returns the storage texture
         const ast::StorageTexture* storage_texture(const Source& source,
-                                                   ast::TextureDimension dims,
+                                                   type::TextureDimension dims,
                                                    ast::TexelFormat format,
                                                    ast::Access access) const {
             auto* subtype = ast::StorageTexture::SubtypeFor(format, *builder);
diff --git a/src/tint/reader/spirv/enum_converter.cc b/src/tint/reader/spirv/enum_converter.cc
index 8c70156..2ac571d 100644
--- a/src/tint/reader/spirv/enum_converter.cc
+++ b/src/tint/reader/spirv/enum_converter.cc
@@ -14,6 +14,8 @@
 
 #include "src/tint/reader/spirv/enum_converter.h"
 
+#include "src/tint/type/texture_dimension.h"
+
 namespace tint::reader::spirv {
 
 EnumConverter::EnumConverter(const FailStream& fs) : fail_stream_(fs) {}
@@ -98,34 +100,34 @@
     return ast::BuiltinValue::kUndefined;
 }
 
-ast::TextureDimension EnumConverter::ToDim(spv::Dim dim, bool arrayed) {
+type::TextureDimension EnumConverter::ToDim(spv::Dim dim, bool arrayed) {
     if (arrayed) {
         switch (dim) {
             case spv::Dim::Dim2D:
-                return ast::TextureDimension::k2dArray;
+                return type::TextureDimension::k2dArray;
             case spv::Dim::Cube:
-                return ast::TextureDimension::kCubeArray;
+                return type::TextureDimension::kCubeArray;
             default:
                 break;
         }
         Fail() << "arrayed dimension must be 2D or Cube. Got " << int(dim);
-        return ast::TextureDimension::kNone;
+        return type::TextureDimension::kNone;
     }
     // Assume non-arrayed
     switch (dim) {
         case spv::Dim::Dim1D:
-            return ast::TextureDimension::k1d;
+            return type::TextureDimension::k1d;
         case spv::Dim::Dim2D:
-            return ast::TextureDimension::k2d;
+            return type::TextureDimension::k2d;
         case spv::Dim::Dim3D:
-            return ast::TextureDimension::k3d;
+            return type::TextureDimension::k3d;
         case spv::Dim::Cube:
-            return ast::TextureDimension::kCube;
+            return type::TextureDimension::kCube;
         default:
             break;
     }
     Fail() << "invalid dimension: " << int(dim);
-    return ast::TextureDimension::kNone;
+    return type::TextureDimension::kNone;
 }
 
 ast::TexelFormat EnumConverter::ToTexelFormat(spv::ImageFormat fmt) {
diff --git a/src/tint/reader/spirv/enum_converter.h b/src/tint/reader/spirv/enum_converter.h
index 6b7a889..507fd77 100644
--- a/src/tint/reader/spirv/enum_converter.h
+++ b/src/tint/reader/spirv/enum_converter.h
@@ -22,6 +22,7 @@
 #include "src/tint/ast/pipeline_stage.h"
 #include "src/tint/reader/spirv/fail_stream.h"
 #include "src/tint/type/storage_texture.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::reader::spirv {
 
@@ -57,14 +58,14 @@
     /// @param dim the SPIR-V Dim value
     /// @param arrayed true if the texture is arrayed
     /// @returns a Tint AST texture dimension
-    ast::TextureDimension ToDim(spv::Dim dim, bool arrayed);
+    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
-    ast::TextureDimension ToDim(SpvDim dim, bool arrayed) {
+    type::TextureDimension ToDim(SpvDim dim, bool arrayed) {
         return ToDim(static_cast<spv::Dim>(dim), arrayed);
     }
 
diff --git a/src/tint/reader/spirv/enum_converter_test.cc b/src/tint/reader/spirv/enum_converter_test.cc
index bdb0247..f49abca 100644
--- a/src/tint/reader/spirv/enum_converter_test.cc
+++ b/src/tint/reader/spirv/enum_converter_test.cc
@@ -17,6 +17,7 @@
 #include <string>
 
 #include "gmock/gmock.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::reader::spirv {
 namespace {
@@ -217,7 +218,7 @@
     spv::Dim dim;
     bool arrayed;
     bool expect_success;
-    ast::TextureDimension expected;
+    type::TextureDimension expected;
 };
 inline std::ostream& operator<<(std::ostream& out, DimCase dc) {
     out << "DimCase{ spv::Dim:::" << int(dc.dim) << " arrayed?:" << int(dc.arrayed)
@@ -256,31 +257,31 @@
                          SpvDimTest,
                          testing::Values(
                              // Non-arrayed
-                             DimCase{spv::Dim::Dim1D, false, true, ast::TextureDimension::k1d},
-                             DimCase{spv::Dim::Dim2D, false, true, ast::TextureDimension::k2d},
-                             DimCase{spv::Dim::Dim3D, false, true, ast::TextureDimension::k3d},
-                             DimCase{spv::Dim::Cube, false, true, ast::TextureDimension::kCube},
+                             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, ast::TextureDimension::k2dArray},
+                             DimCase{spv::Dim::Dim2D, true, true, type::TextureDimension::k2dArray},
                              DimCase{spv::Dim::Cube, true, true,
-                                     ast::TextureDimension::kCubeArray}));
+                                     type::TextureDimension::kCubeArray}));
 
 INSTANTIATE_TEST_SUITE_P(
     EnumConverterBad,
     SpvDimTest,
     testing::Values(
         // Invalid SPIR-V dimensionality.
-        DimCase{spv::Dim::Max, false, false, ast::TextureDimension::kNone},
-        DimCase{spv::Dim::Max, true, false, ast::TextureDimension::kNone},
+        DimCase{spv::Dim::Max, false, false, type::TextureDimension::kNone},
+        DimCase{spv::Dim::Max, true, false, type::TextureDimension::kNone},
         // Vulkan non-arrayed dimensionalities not supported by WGSL.
-        DimCase{spv::Dim::Rect, false, false, ast::TextureDimension::kNone},
-        DimCase{spv::Dim::Buffer, false, false, ast::TextureDimension::kNone},
-        DimCase{spv::Dim::SubpassData, false, false, ast::TextureDimension::kNone},
+        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},
         // Arrayed dimensionalities not supported by WGSL
-        DimCase{spv::Dim::Dim3D, true, false, ast::TextureDimension::kNone},
-        DimCase{spv::Dim::Rect, true, false, ast::TextureDimension::kNone},
-        DimCase{spv::Dim::Buffer, true, false, ast::TextureDimension::kNone},
-        DimCase{spv::Dim::SubpassData, true, false, ast::TextureDimension::kNone}));
+        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}));
 
 // TexelFormat
 
diff --git a/src/tint/reader/spirv/function.cc b/src/tint/reader/spirv/function.cc
index a0b257b..0bae341 100644
--- a/src/tint/reader/spirv/function.cc
+++ b/src/tint/reader/spirv/function.cc
@@ -36,6 +36,7 @@
 #include "src/tint/transform/spirv_atomic.h"
 #include "src/tint/type/depth_texture.h"
 #include "src/tint/type/sampled_texture.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/utils/hashmap.h"
 #include "src/tint/utils/hashset.h"
 
@@ -5619,9 +5620,9 @@
                           << inst.PrettyPrint();
         }
         switch (texture_type->dims) {
-            case ast::TextureDimension::k2d:
-            case ast::TextureDimension::k2dArray:
-            case ast::TextureDimension::k3d:
+            case type::TextureDimension::k2d:
+            case type::TextureDimension::k2dArray:
+            case type::TextureDimension::k3d:
                 break;
             default:
                 return Fail() << "ConstOffset is only permitted for 2D, 2D Arrayed, "
@@ -5749,8 +5750,8 @@
             const ast::Expression* dims_call =
                 create<ast::CallExpression>(Source{}, dims_ident, dims_args);
             auto dims = texture_type->dims;
-            if ((dims == ast::TextureDimension::kCube) ||
-                (dims == ast::TextureDimension::kCubeArray)) {
+            if ((dims == type::TextureDimension::kCube) ||
+                (dims == type::TextureDimension::kCubeArray)) {
                 // textureDimension returns a 3-element vector but SPIR-V expects 2.
                 dims_call =
                     create<ast::MemberAccessorExpression>(Source{}, dims_call, PrefixSwizzle(2));
@@ -5952,7 +5953,7 @@
     if (!texture_type) {
         return {};
     }
-    ast::TextureDimension dim = texture_type->dims;
+    type::TextureDimension dim = texture_type->dims;
     // Number of regular coordinates.
     uint32_t num_axes = static_cast<uint32_t>(ast::NumCoordinateAxes(dim));
     bool is_arrayed = ast::IsTextureArray(dim);
diff --git a/src/tint/reader/spirv/parser_impl.cc b/src/tint/reader/spirv/parser_impl.cc
index 4fa4b2f..84e07ed 100644
--- a/src/tint/reader/spirv/parser_impl.cc
+++ b/src/tint/reader/spirv/parser_impl.cc
@@ -30,6 +30,7 @@
 #include "src/tint/type/depth_texture.h"
 #include "src/tint/type/multisampled_texture.h"
 #include "src/tint/type/sampled_texture.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/utils/unique_vector.h"
 
 namespace tint::reader::spirv {
@@ -2481,9 +2482,9 @@
             }
         }
 
-        const ast::TextureDimension dim =
+        const type::TextureDimension dim =
             enum_converter_.ToDim(image_type->dim(), image_type->is_arrayed());
-        if (dim == ast::TextureDimension::kNone) {
+        if (dim == type::TextureDimension::kNone) {
             return nullptr;
         }
 
@@ -2506,7 +2507,7 @@
                     ast_handle_type = ty_.DepthTexture(dim);
                 }
             } else if (image_type->is_multisampled()) {
-                if (dim != ast::TextureDimension::k2d) {
+                if (dim != 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/reader/spirv/parser_type.cc b/src/tint/reader/spirv/parser_type.cc
index 04036f2..ef46c18 100644
--- a/src/tint/reader/spirv/parser_type.cc
+++ b/src/tint/reader/spirv/parser_type.cc
@@ -19,6 +19,7 @@
 #include <utility>
 
 #include "src/tint/program_builder.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/utils/hash.h"
 #include "src/tint/utils/map.h"
 #include "src/tint/utils/string.h"
@@ -222,24 +223,24 @@
     return b.ty.sampler(kind);
 }
 
-Texture::Texture(ast::TextureDimension d) : dims(d) {}
+Texture::Texture(type::TextureDimension d) : dims(d) {}
 Texture::Texture(const Texture&) = default;
 
-DepthTexture::DepthTexture(ast::TextureDimension d) : Base(d) {}
+DepthTexture::DepthTexture(type::TextureDimension d) : Base(d) {}
 DepthTexture::DepthTexture(const DepthTexture&) = default;
 
 const ast::Type* DepthTexture::Build(ProgramBuilder& b) const {
     return b.ty.depth_texture(dims);
 }
 
-DepthMultisampledTexture::DepthMultisampledTexture(ast::TextureDimension d) : Base(d) {}
+DepthMultisampledTexture::DepthMultisampledTexture(type::TextureDimension d) : Base(d) {}
 DepthMultisampledTexture::DepthMultisampledTexture(const DepthMultisampledTexture&) = default;
 
 const ast::Type* DepthMultisampledTexture::Build(ProgramBuilder& b) const {
     return b.ty.depth_multisampled_texture(dims);
 }
 
-MultisampledTexture::MultisampledTexture(ast::TextureDimension d, const Type* t)
+MultisampledTexture::MultisampledTexture(type::TextureDimension d, const Type* t)
     : Base(d), type(t) {}
 MultisampledTexture::MultisampledTexture(const MultisampledTexture&) = default;
 
@@ -247,14 +248,14 @@
     return b.ty.multisampled_texture(dims, type->Build(b));
 }
 
-SampledTexture::SampledTexture(ast::TextureDimension d, const Type* t) : Base(d), type(t) {}
+SampledTexture::SampledTexture(type::TextureDimension d, const Type* t) : Base(d), type(t) {}
 SampledTexture::SampledTexture(const SampledTexture&) = default;
 
 const ast::Type* SampledTexture::Build(ProgramBuilder& b) const {
     return b.ty.sampled_texture(dims, type->Build(b));
 }
 
-StorageTexture::StorageTexture(ast::TextureDimension d, ast::TexelFormat f, ast::Access a)
+StorageTexture::StorageTexture(type::TextureDimension d, ast::TexelFormat f, ast::Access a)
     : Base(d), format(f), access(a) {}
 StorageTexture::StorageTexture(const StorageTexture&) = default;
 
@@ -494,26 +495,26 @@
     return state->samplers_.Get(kind);
 }
 
-const spirv::DepthTexture* TypeManager::DepthTexture(ast::TextureDimension dims) {
+const spirv::DepthTexture* TypeManager::DepthTexture(type::TextureDimension dims) {
     return state->depth_textures_.Get(dims);
 }
 
 const spirv::DepthMultisampledTexture* TypeManager::DepthMultisampledTexture(
-    ast::TextureDimension dims) {
+    type::TextureDimension dims) {
     return state->depth_multisampled_textures_.Get(dims);
 }
 
-const spirv::MultisampledTexture* TypeManager::MultisampledTexture(ast::TextureDimension dims,
+const spirv::MultisampledTexture* TypeManager::MultisampledTexture(type::TextureDimension dims,
                                                                    const Type* ty) {
     return state->multisampled_textures_.Get(dims, ty);
 }
 
-const spirv::SampledTexture* TypeManager::SampledTexture(ast::TextureDimension dims,
+const spirv::SampledTexture* TypeManager::SampledTexture(type::TextureDimension dims,
                                                          const Type* ty) {
     return state->sampled_textures_.Get(dims, ty);
 }
 
-const spirv::StorageTexture* TypeManager::StorageTexture(ast::TextureDimension dims,
+const spirv::StorageTexture* TypeManager::StorageTexture(type::TextureDimension dims,
                                                          ast::TexelFormat fmt,
                                                          ast::Access access) {
     return state->storage_textures_.Get(dims, fmt, access);
diff --git a/src/tint/reader/spirv/parser_type.h b/src/tint/reader/spirv/parser_type.h
index 43c311c..4d42292 100644
--- a/src/tint/reader/spirv/parser_type.h
+++ b/src/tint/reader/spirv/parser_type.h
@@ -23,8 +23,8 @@
 #include "src/tint/ast/address_space.h"
 #include "src/tint/ast/sampler.h"
 #include "src/tint/ast/storage_texture.h"
-#include "src/tint/ast/texture.h"
 #include "src/tint/castable.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/utils/block_allocator.h"
 
 // Forward declarations
@@ -331,21 +331,21 @@
 
     /// Constructor
     /// @param d the texture dimensions
-    explicit Texture(ast::TextureDimension d);
+    explicit Texture(type::TextureDimension d);
 
     /// Copy constructor
     /// @param other the other type to copy
     Texture(const Texture& other);
 
     /// the texture dimensions
-    ast::TextureDimension const dims;
+    type::TextureDimension const dims;
 };
 
 /// `texture_depth_D` type
 struct DepthTexture final : public Castable<DepthTexture, Texture> {
     /// Constructor
     /// @param d the texture dimensions
-    explicit DepthTexture(ast::TextureDimension d);
+    explicit DepthTexture(type::TextureDimension d);
 
     /// Copy constructor
     /// @param other the other type to copy
@@ -365,7 +365,7 @@
 struct DepthMultisampledTexture final : public Castable<DepthMultisampledTexture, Texture> {
     /// Constructor
     /// @param d the texture dimensions
-    explicit DepthMultisampledTexture(ast::TextureDimension d);
+    explicit DepthMultisampledTexture(type::TextureDimension d);
 
     /// Copy constructor
     /// @param other the other type to copy
@@ -386,7 +386,7 @@
     /// Constructor
     /// @param d the texture dimensions
     /// @param t the multisampled texture type
-    MultisampledTexture(ast::TextureDimension d, const Type* t);
+    MultisampledTexture(type::TextureDimension d, const Type* t);
 
     /// Copy constructor
     /// @param other the other type to copy
@@ -410,7 +410,7 @@
     /// Constructor
     /// @param d the texture dimensions
     /// @param t the sampled texture type
-    SampledTexture(ast::TextureDimension d, const Type* t);
+    SampledTexture(type::TextureDimension d, const Type* t);
 
     /// Copy constructor
     /// @param other the other type to copy
@@ -435,7 +435,7 @@
     /// @param d the texture dimensions
     /// @param f the storage image format
     /// @param a the access control
-    StorageTexture(ast::TextureDimension d, ast::TexelFormat f, ast::Access a);
+    StorageTexture(type::TextureDimension d, ast::TexelFormat f, ast::Access a);
 
     /// Copy constructor
     /// @param other the other type to copy
@@ -595,27 +595,27 @@
     /// @param d the texture dimensions
     /// @return a DepthTexture type. Repeated calls with the same arguments will
     /// return the same pointer.
-    const spirv::DepthTexture* DepthTexture(ast::TextureDimension d);
+    const spirv::DepthTexture* DepthTexture(type::TextureDimension d);
     /// @param d the texture dimensions
     /// @return a DepthMultisampledTexture type. Repeated calls with the same
     /// arguments will return the same pointer.
-    const spirv::DepthMultisampledTexture* DepthMultisampledTexture(ast::TextureDimension d);
+    const spirv::DepthMultisampledTexture* DepthMultisampledTexture(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 spirv::MultisampledTexture* MultisampledTexture(ast::TextureDimension d, const Type* t);
+    const spirv::MultisampledTexture* MultisampledTexture(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 spirv::SampledTexture* SampledTexture(ast::TextureDimension d, const Type* t);
+    const spirv::SampledTexture* SampledTexture(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 spirv::StorageTexture* StorageTexture(ast::TextureDimension d,
+    const spirv::StorageTexture* StorageTexture(type::TextureDimension d,
                                                 ast::TexelFormat f,
                                                 ast::Access a);
 
diff --git a/src/tint/reader/spirv/parser_type_test.cc b/src/tint/reader/spirv/parser_type_test.cc
index 90a8da2..392b637 100644
--- a/src/tint/reader/spirv/parser_type_test.cc
+++ b/src/tint/reader/spirv/parser_type_test.cc
@@ -15,6 +15,7 @@
 #include "gtest/gtest.h"
 
 #include "src/tint/reader/spirv/parser_type.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::reader::spirv {
 namespace {
@@ -36,15 +37,15 @@
     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(ast::SamplerKind::kSampler), ty.Sampler(ast::SamplerKind::kSampler));
-    EXPECT_EQ(ty.DepthTexture(ast::TextureDimension::k2d),
-              ty.DepthTexture(ast::TextureDimension::k2d));
-    EXPECT_EQ(ty.MultisampledTexture(ast::TextureDimension::k2d, ty.I32()),
-              ty.MultisampledTexture(ast::TextureDimension::k2d, ty.I32()));
-    EXPECT_EQ(ty.SampledTexture(ast::TextureDimension::k2d, ty.I32()),
-              ty.SampledTexture(ast::TextureDimension::k2d, ty.I32()));
-    EXPECT_EQ(ty.StorageTexture(ast::TextureDimension::k2d, ast::TexelFormat::kR32Uint,
+    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, ast::TexelFormat::kR32Uint,
                                 ast::Access::kRead),
-              ty.StorageTexture(ast::TextureDimension::k2d, ast::TexelFormat::kR32Uint,
+              ty.StorageTexture(type::TextureDimension::k2d, ast::TexelFormat::kR32Uint,
                                 ast::Access::kRead));
 }
 
@@ -69,27 +70,27 @@
     EXPECT_NE(ty.Struct(sym_a, {ty.I32()}), ty.Struct(sym_b, {ty.I32()}));
     EXPECT_NE(ty.Sampler(ast::SamplerKind::kSampler),
               ty.Sampler(ast::SamplerKind::kComparisonSampler));
-    EXPECT_NE(ty.DepthTexture(ast::TextureDimension::k2d),
-              ty.DepthTexture(ast::TextureDimension::k1d));
-    EXPECT_NE(ty.MultisampledTexture(ast::TextureDimension::k2d, ty.I32()),
-              ty.MultisampledTexture(ast::TextureDimension::k3d, ty.I32()));
-    EXPECT_NE(ty.MultisampledTexture(ast::TextureDimension::k2d, ty.I32()),
-              ty.MultisampledTexture(ast::TextureDimension::k2d, ty.U32()));
-    EXPECT_NE(ty.SampledTexture(ast::TextureDimension::k2d, ty.I32()),
-              ty.SampledTexture(ast::TextureDimension::k3d, ty.I32()));
-    EXPECT_NE(ty.SampledTexture(ast::TextureDimension::k2d, ty.I32()),
-              ty.SampledTexture(ast::TextureDimension::k2d, ty.U32()));
-    EXPECT_NE(ty.StorageTexture(ast::TextureDimension::k2d, ast::TexelFormat::kR32Uint,
+    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, ast::TexelFormat::kR32Uint,
                                 ast::Access::kRead),
-              ty.StorageTexture(ast::TextureDimension::k3d, ast::TexelFormat::kR32Uint,
+              ty.StorageTexture(type::TextureDimension::k3d, ast::TexelFormat::kR32Uint,
                                 ast::Access::kRead));
-    EXPECT_NE(ty.StorageTexture(ast::TextureDimension::k2d, ast::TexelFormat::kR32Uint,
+    EXPECT_NE(ty.StorageTexture(type::TextureDimension::k2d, ast::TexelFormat::kR32Uint,
                                 ast::Access::kRead),
-              ty.StorageTexture(ast::TextureDimension::k2d, ast::TexelFormat::kR32Sint,
+              ty.StorageTexture(type::TextureDimension::k2d, ast::TexelFormat::kR32Sint,
                                 ast::Access::kRead));
-    EXPECT_NE(ty.StorageTexture(ast::TextureDimension::k2d, ast::TexelFormat::kR32Uint,
+    EXPECT_NE(ty.StorageTexture(type::TextureDimension::k2d, ast::TexelFormat::kR32Uint,
                                 ast::Access::kRead),
-              ty.StorageTexture(ast::TextureDimension::k2d, ast::TexelFormat::kR32Uint,
+              ty.StorageTexture(type::TextureDimension::k2d, ast::TexelFormat::kR32Uint,
                                 ast::Access::kWrite));
 }
 
diff --git a/src/tint/reader/wgsl/parser_impl.cc b/src/tint/reader/wgsl/parser_impl.cc
index d35a87e..132e294 100644
--- a/src/tint/reader/wgsl/parser_impl.cc
+++ b/src/tint/reader/wgsl/parser_impl.cc
@@ -43,6 +43,7 @@
 #include "src/tint/type/external_texture.h"
 #include "src/tint/type/multisampled_texture.h"
 #include "src/tint/type/sampled_texture.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/utils/reverse.h"
 #include "src/tint/utils/string.h"
 
@@ -806,29 +807,29 @@
 //  | TEXTURE_SAMPLED_3D
 //  | TEXTURE_SAMPLED_CUBE
 //  | TEXTURE_SAMPLED_CUBE_ARRAY
-Maybe<const ast::TextureDimension> ParserImpl::sampled_texture_type() {
+Maybe<const type::TextureDimension> ParserImpl::sampled_texture_type() {
     if (match(Token::Type::kTextureSampled1d)) {
-        return ast::TextureDimension::k1d;
+        return type::TextureDimension::k1d;
     }
 
     if (match(Token::Type::kTextureSampled2d)) {
-        return ast::TextureDimension::k2d;
+        return type::TextureDimension::k2d;
     }
 
     if (match(Token::Type::kTextureSampled2dArray)) {
-        return ast::TextureDimension::k2dArray;
+        return type::TextureDimension::k2dArray;
     }
 
     if (match(Token::Type::kTextureSampled3d)) {
-        return ast::TextureDimension::k3d;
+        return type::TextureDimension::k3d;
     }
 
     if (match(Token::Type::kTextureSampledCube)) {
-        return ast::TextureDimension::kCube;
+        return type::TextureDimension::kCube;
     }
 
     if (match(Token::Type::kTextureSampledCubeArray)) {
-        return ast::TextureDimension::kCubeArray;
+        return type::TextureDimension::kCubeArray;
     }
 
     return Failure::kNoMatch;
@@ -847,9 +848,9 @@
 
 // multisampled_texture_type
 //  : TEXTURE_MULTISAMPLED_2D
-Maybe<const ast::TextureDimension> ParserImpl::multisampled_texture_type() {
+Maybe<const type::TextureDimension> ParserImpl::multisampled_texture_type() {
     if (match(Token::Type::kTextureMultisampled2d)) {
-        return ast::TextureDimension::k2d;
+        return type::TextureDimension::k2d;
     }
 
     return Failure::kNoMatch;
@@ -860,18 +861,18 @@
 //  | TEXTURE_STORAGE_2D
 //  | TEXTURE_STORAGE_2D_ARRAY
 //  | TEXTURE_STORAGE_3D
-Maybe<const ast::TextureDimension> ParserImpl::storage_texture_type() {
+Maybe<const type::TextureDimension> ParserImpl::storage_texture_type() {
     if (match(Token::Type::kTextureStorage1d)) {
-        return ast::TextureDimension::k1d;
+        return type::TextureDimension::k1d;
     }
     if (match(Token::Type::kTextureStorage2d)) {
-        return ast::TextureDimension::k2d;
+        return type::TextureDimension::k2d;
     }
     if (match(Token::Type::kTextureStorage2dArray)) {
-        return ast::TextureDimension::k2dArray;
+        return type::TextureDimension::k2dArray;
     }
     if (match(Token::Type::kTextureStorage3d)) {
-        return ast::TextureDimension::k3d;
+        return type::TextureDimension::k3d;
     }
 
     return Failure::kNoMatch;
@@ -886,19 +887,19 @@
 Maybe<const ast::Type*> ParserImpl::depth_texture_type() {
     Source source;
     if (match(Token::Type::kTextureDepth2d, &source)) {
-        return builder_.ty.depth_texture(source, ast::TextureDimension::k2d);
+        return builder_.ty.depth_texture(source, type::TextureDimension::k2d);
     }
     if (match(Token::Type::kTextureDepth2dArray, &source)) {
-        return builder_.ty.depth_texture(source, ast::TextureDimension::k2dArray);
+        return builder_.ty.depth_texture(source, type::TextureDimension::k2dArray);
     }
     if (match(Token::Type::kTextureDepthCube, &source)) {
-        return builder_.ty.depth_texture(source, ast::TextureDimension::kCube);
+        return builder_.ty.depth_texture(source, type::TextureDimension::kCube);
     }
     if (match(Token::Type::kTextureDepthCubeArray, &source)) {
-        return builder_.ty.depth_texture(source, ast::TextureDimension::kCubeArray);
+        return builder_.ty.depth_texture(source, type::TextureDimension::kCubeArray);
     }
     if (match(Token::Type::kTextureDepthMultisampled2d, &source)) {
-        return builder_.ty.depth_multisampled_texture(source, ast::TextureDimension::k2d);
+        return builder_.ty.depth_multisampled_texture(source, type::TextureDimension::k2d);
     }
     return Failure::kNoMatch;
 }
diff --git a/src/tint/reader/wgsl/parser_impl.h b/src/tint/reader/wgsl/parser_impl.h
index 5f64853..23e74bf 100644
--- a/src/tint/reader/wgsl/parser_impl.h
+++ b/src/tint/reader/wgsl/parser_impl.h
@@ -27,6 +27,7 @@
 #include "src/tint/reader/wgsl/parser_impl_detail.h"
 #include "src/tint/reader/wgsl/token.h"
 #include "src/tint/type/storage_texture.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::ast {
 class BreakStatement;
@@ -486,14 +487,14 @@
     /// Parses a `multisampled_texture_type` grammar element
     /// @returns returns the multisample texture dimension or kNone if none
     /// matched.
-    Maybe<const ast::TextureDimension> multisampled_texture_type();
+    Maybe<const type::TextureDimension> multisampled_texture_type();
     /// Parses a `sampled_texture_type` grammar element
     /// @returns returns the sample texture dimension or kNone if none matched.
-    Maybe<const ast::TextureDimension> sampled_texture_type();
+    Maybe<const type::TextureDimension> sampled_texture_type();
     /// Parses a `storage_texture_type` grammar element
     /// @returns returns the storage texture dimension.
     /// Returns kNone if none matched.
-    Maybe<const ast::TextureDimension> storage_texture_type();
+    Maybe<const type::TextureDimension> storage_texture_type();
     /// Parses a `depth_texture_type` grammar element
     /// @returns the parsed Type or nullptr if none matched.
     Maybe<const ast::Type*> depth_texture_type();
diff --git a/src/tint/reader/wgsl/parser_impl_depth_texture_test.cc b/src/tint/reader/wgsl/parser_impl_depth_texture_test.cc
index fbd8ffb..dc8ddbf 100644
--- a/src/tint/reader/wgsl/parser_impl_depth_texture_test.cc
+++ b/src/tint/reader/wgsl/parser_impl_depth_texture_test.cc
@@ -14,6 +14,7 @@
 
 #include "src/tint/reader/wgsl/parser_impl_test_helper.h"
 #include "src/tint/type/depth_texture.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::reader::wgsl {
 namespace {
@@ -34,7 +35,7 @@
     ASSERT_NE(t.value, nullptr);
     ASSERT_TRUE(t->Is<ast::Texture>());
     ASSERT_TRUE(t->Is<ast::DepthTexture>());
-    EXPECT_EQ(t->As<ast::Texture>()->dim, ast::TextureDimension::k2d);
+    EXPECT_EQ(t->As<ast::Texture>()->dim, type::TextureDimension::k2d);
     EXPECT_FALSE(p->has_error());
     EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 1u}, {1u, 17u}}));
 }
@@ -47,7 +48,7 @@
     ASSERT_NE(t.value, nullptr);
     ASSERT_TRUE(t->Is<ast::Texture>());
     ASSERT_TRUE(t->Is<ast::DepthTexture>());
-    EXPECT_EQ(t->As<ast::Texture>()->dim, ast::TextureDimension::k2dArray);
+    EXPECT_EQ(t->As<ast::Texture>()->dim, type::TextureDimension::k2dArray);
     EXPECT_FALSE(p->has_error());
     EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 1u}, {1u, 23u}}));
 }
@@ -60,7 +61,7 @@
     ASSERT_NE(t.value, nullptr);
     ASSERT_TRUE(t->Is<ast::Texture>());
     ASSERT_TRUE(t->Is<ast::DepthTexture>());
-    EXPECT_EQ(t->As<ast::Texture>()->dim, ast::TextureDimension::kCube);
+    EXPECT_EQ(t->As<ast::Texture>()->dim, type::TextureDimension::kCube);
     EXPECT_FALSE(p->has_error());
     EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 1u}, {1u, 19u}}));
 }
@@ -73,7 +74,7 @@
     ASSERT_NE(t.value, nullptr);
     ASSERT_TRUE(t->Is<ast::Texture>());
     ASSERT_TRUE(t->Is<ast::DepthTexture>());
-    EXPECT_EQ(t->As<ast::Texture>()->dim, ast::TextureDimension::kCubeArray);
+    EXPECT_EQ(t->As<ast::Texture>()->dim, type::TextureDimension::kCubeArray);
     EXPECT_FALSE(p->has_error());
     EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 1u}, {1u, 25u}}));
 }
@@ -86,7 +87,7 @@
     ASSERT_NE(t.value, nullptr);
     ASSERT_TRUE(t->Is<ast::Texture>());
     ASSERT_TRUE(t->Is<ast::DepthMultisampledTexture>());
-    EXPECT_EQ(t->As<ast::Texture>()->dim, ast::TextureDimension::k2d);
+    EXPECT_EQ(t->As<ast::Texture>()->dim, type::TextureDimension::k2d);
     EXPECT_FALSE(p->has_error());
     EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 1u}, {1u, 30u}}));
 }
diff --git a/src/tint/reader/wgsl/parser_impl_sampled_texture_test.cc b/src/tint/reader/wgsl/parser_impl_sampled_texture_test.cc
index 6aa1aab..5a2d38a 100644
--- a/src/tint/reader/wgsl/parser_impl_sampled_texture_test.cc
+++ b/src/tint/reader/wgsl/parser_impl_sampled_texture_test.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "src/tint/reader/wgsl/parser_impl_test_helper.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::reader::wgsl {
 namespace {
@@ -30,7 +31,7 @@
     auto t = p->sampled_texture_type();
     EXPECT_TRUE(t.matched);
     EXPECT_FALSE(t.errored);
-    EXPECT_EQ(t.value, ast::TextureDimension::k1d);
+    EXPECT_EQ(t.value, type::TextureDimension::k1d);
     EXPECT_FALSE(p->has_error());
 }
 
@@ -39,7 +40,7 @@
     auto t = p->sampled_texture_type();
     EXPECT_TRUE(t.matched);
     EXPECT_FALSE(t.errored);
-    EXPECT_EQ(t.value, ast::TextureDimension::k2d);
+    EXPECT_EQ(t.value, type::TextureDimension::k2d);
     EXPECT_FALSE(p->has_error());
 }
 
@@ -48,7 +49,7 @@
     auto t = p->sampled_texture_type();
     EXPECT_TRUE(t.matched);
     EXPECT_FALSE(t.errored);
-    EXPECT_EQ(t.value, ast::TextureDimension::k2dArray);
+    EXPECT_EQ(t.value, type::TextureDimension::k2dArray);
     EXPECT_FALSE(p->has_error());
 }
 
@@ -57,7 +58,7 @@
     auto t = p->sampled_texture_type();
     EXPECT_TRUE(t.matched);
     EXPECT_FALSE(t.errored);
-    EXPECT_EQ(t.value, ast::TextureDimension::k3d);
+    EXPECT_EQ(t.value, type::TextureDimension::k3d);
     EXPECT_FALSE(p->has_error());
 }
 
@@ -66,7 +67,7 @@
     auto t = p->sampled_texture_type();
     EXPECT_TRUE(t.matched);
     EXPECT_FALSE(t.errored);
-    EXPECT_EQ(t.value, ast::TextureDimension::kCube);
+    EXPECT_EQ(t.value, type::TextureDimension::kCube);
     EXPECT_FALSE(p->has_error());
 }
 
@@ -75,7 +76,7 @@
     auto t = p->sampled_texture_type();
     EXPECT_TRUE(t.matched);
     EXPECT_FALSE(t.errored);
-    EXPECT_EQ(t.value, ast::TextureDimension::kCubeArray);
+    EXPECT_EQ(t.value, type::TextureDimension::kCubeArray);
     EXPECT_FALSE(p->has_error());
 }
 
diff --git a/src/tint/reader/wgsl/parser_impl_storage_texture_test.cc b/src/tint/reader/wgsl/parser_impl_storage_texture_test.cc
index 528f3a4..e1c25b6 100644
--- a/src/tint/reader/wgsl/parser_impl_storage_texture_test.cc
+++ b/src/tint/reader/wgsl/parser_impl_storage_texture_test.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "src/tint/reader/wgsl/parser_impl_test_helper.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::reader::wgsl {
 namespace {
@@ -30,7 +31,7 @@
     auto t = p->storage_texture_type();
     EXPECT_TRUE(t.matched);
     EXPECT_FALSE(t.errored);
-    EXPECT_EQ(t.value, ast::TextureDimension::k1d);
+    EXPECT_EQ(t.value, type::TextureDimension::k1d);
     EXPECT_FALSE(p->has_error());
 }
 
@@ -39,7 +40,7 @@
     auto t = p->storage_texture_type();
     EXPECT_TRUE(t.matched);
     EXPECT_FALSE(t.errored);
-    EXPECT_EQ(t.value, ast::TextureDimension::k2d);
+    EXPECT_EQ(t.value, type::TextureDimension::k2d);
     EXPECT_FALSE(p->has_error());
 }
 
@@ -48,7 +49,7 @@
     auto t = p->storage_texture_type();
     EXPECT_TRUE(t.matched);
     EXPECT_FALSE(t.errored);
-    EXPECT_EQ(t.value, ast::TextureDimension::k2dArray);
+    EXPECT_EQ(t.value, type::TextureDimension::k2dArray);
     EXPECT_FALSE(p->has_error());
 }
 
@@ -57,7 +58,7 @@
     auto t = p->storage_texture_type();
     EXPECT_TRUE(t.matched);
     EXPECT_FALSE(t.errored);
-    EXPECT_EQ(t.value, ast::TextureDimension::k3d);
+    EXPECT_EQ(t.value, type::TextureDimension::k3d);
     EXPECT_FALSE(p->has_error());
 }
 
diff --git a/src/tint/reader/wgsl/parser_impl_texture_sampler_test.cc b/src/tint/reader/wgsl/parser_impl_texture_sampler_test.cc
index 01a4241..41fab41 100644
--- a/src/tint/reader/wgsl/parser_impl_texture_sampler_test.cc
+++ b/src/tint/reader/wgsl/parser_impl_texture_sampler_test.cc
@@ -16,6 +16,7 @@
 #include "src/tint/type/depth_texture.h"
 #include "src/tint/type/multisampled_texture.h"
 #include "src/tint/type/sampled_texture.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::reader::wgsl {
 namespace {
@@ -62,7 +63,7 @@
     ASSERT_NE(t.value, nullptr);
     ASSERT_TRUE(t->Is<ast::Texture>());
     ASSERT_TRUE(t->Is<ast::DepthTexture>());
-    EXPECT_EQ(t->As<ast::Texture>()->dim, ast::TextureDimension::k2d);
+    EXPECT_EQ(t->As<ast::Texture>()->dim, type::TextureDimension::k2d);
     EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 1u}, {1u, 17u}}));
 }
 
@@ -76,7 +77,7 @@
     ASSERT_TRUE(t->Is<ast::Texture>());
     ASSERT_TRUE(t->Is<ast::SampledTexture>());
     ASSERT_TRUE(t->As<ast::SampledTexture>()->type->Is<ast::F32>());
-    EXPECT_EQ(t->As<ast::Texture>()->dim, ast::TextureDimension::k1d);
+    EXPECT_EQ(t->As<ast::Texture>()->dim, type::TextureDimension::k1d);
     EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 1u}, {1u, 16u}}));
 }
 
@@ -90,7 +91,7 @@
     ASSERT_TRUE(t->Is<ast::Texture>());
     ASSERT_TRUE(t->Is<ast::SampledTexture>());
     ASSERT_TRUE(t->As<ast::SampledTexture>()->type->Is<ast::I32>());
-    EXPECT_EQ(t->As<ast::Texture>()->dim, ast::TextureDimension::k2d);
+    EXPECT_EQ(t->As<ast::Texture>()->dim, type::TextureDimension::k2d);
     EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 1u}, {1u, 16u}}));
 }
 
@@ -104,7 +105,7 @@
     ASSERT_TRUE(t->Is<ast::Texture>());
     ASSERT_TRUE(t->Is<ast::SampledTexture>());
     ASSERT_TRUE(t->As<ast::SampledTexture>()->type->Is<ast::U32>());
-    EXPECT_EQ(t->As<ast::Texture>()->dim, ast::TextureDimension::k3d);
+    EXPECT_EQ(t->As<ast::Texture>()->dim, type::TextureDimension::k3d);
     EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 1u}, {1u, 16u}}));
 }
 
@@ -148,7 +149,7 @@
     ASSERT_TRUE(t->Is<ast::Texture>());
     ASSERT_TRUE(t->Is<ast::MultisampledTexture>());
     ASSERT_TRUE(t->As<ast::MultisampledTexture>()->type->Is<ast::I32>());
-    EXPECT_EQ(t->As<ast::Texture>()->dim, ast::TextureDimension::k2d);
+    EXPECT_EQ(t->As<ast::Texture>()->dim, type::TextureDimension::k2d);
     EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 1u}, {1u, 29u}}));
 }
 
@@ -192,7 +193,7 @@
     ASSERT_TRUE(t->Is<ast::StorageTexture>());
     EXPECT_EQ(t->As<ast::StorageTexture>()->format, ast::TexelFormat::kRg32Float);
     EXPECT_EQ(t->As<ast::StorageTexture>()->access, ast::Access::kRead);
-    EXPECT_EQ(t->As<ast::Texture>()->dim, ast::TextureDimension::k1d);
+    EXPECT_EQ(t->As<ast::Texture>()->dim, type::TextureDimension::k1d);
     EXPECT_EQ(t->source.range, (Source::Range{{1u, 1u}, {1u, 36u}}));
 }
 
@@ -208,7 +209,7 @@
     ASSERT_TRUE(t->Is<ast::StorageTexture>());
     EXPECT_EQ(t->As<ast::StorageTexture>()->format, ast::TexelFormat::kR32Uint);
     EXPECT_EQ(t->As<ast::StorageTexture>()->access, ast::Access::kWrite);
-    EXPECT_EQ(t->As<ast::Texture>()->dim, ast::TextureDimension::k2d);
+    EXPECT_EQ(t->As<ast::Texture>()->dim, type::TextureDimension::k2d);
     EXPECT_EQ(t->source.range, (Source::Range{{1u, 1u}, {1u, 35u}}));
 }
 
diff --git a/src/tint/resolver/assignment_validation_test.cc b/src/tint/resolver/assignment_validation_test.cc
index ce8b314..d7ad488 100644
--- a/src/tint/resolver/assignment_validation_test.cc
+++ b/src/tint/resolver/assignment_validation_test.cc
@@ -17,6 +17,7 @@
 #include "gmock/gmock.h"
 #include "src/tint/resolver/resolver_test_helper.h"
 #include "src/tint/type/storage_texture.h"
+#include "src/tint/type/texture_dimension.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
@@ -230,7 +231,7 @@
     // a = b;
 
     auto make_type = [&] {
-        return ty.storage_texture(ast::TextureDimension::k1d, ast::TexelFormat::kRgba8Unorm,
+        return ty.storage_texture(type::TextureDimension::k1d, ast::TexelFormat::kRgba8Unorm,
                                   ast::Access::kWrite);
     };
 
@@ -360,7 +361,7 @@
     auto* U = Structure("U", utils::Vector{
                                  Member("i", ty.i32()),
                              });
-    GlobalVar("tex", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()), Group(0_a),
+    GlobalVar("tex", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Group(0_a),
               Binding(0_a));
     GlobalVar("smp", ty.sampler(ast::SamplerKind::kSampler), Group(0_a), Binding(1_a));
     GlobalVar("u", ty.Of(U), ast::AddressSpace::kUniform, Group(0_a), Binding(2_a));
diff --git a/src/tint/resolver/attribute_validation_test.cc b/src/tint/resolver/attribute_validation_test.cc
index 762eea9..3c01f86 100644
--- a/src/tint/resolver/attribute_validation_test.cc
+++ b/src/tint/resolver/attribute_validation_test.cc
@@ -16,6 +16,7 @@
 #include "src/tint/resolver/resolver.h"
 #include "src/tint/resolver/resolver_test_helper.h"
 #include "src/tint/transform/add_block_attribute.h"
+#include "src/tint/type/texture_dimension.h"
 
 #include "gmock/gmock.h"
 
@@ -1166,7 +1167,7 @@
 }
 
 TEST_F(ResourceAttributeTest, TextureMissingBinding) {
-    GlobalVar(Source{{12, 34}}, "G", ty.depth_texture(ast::TextureDimension::k2d));
+    GlobalVar(Source{{12, 34}}, "G", ty.depth_texture(type::TextureDimension::k2d));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(),
@@ -1198,9 +1199,9 @@
 }
 
 TEST_F(ResourceAttributeTest, BindingPointUsedTwiceByEntryPoint) {
-    GlobalVar(Source{{12, 34}}, "A", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()),
+    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(ast::TextureDimension::k2d, ty.f32()),
+    GlobalVar(Source{{56, 78}}, "B", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()),
               Binding(1_a), Group(2_a));
 
     Func("F", utils::Empty, ty.void_(),
@@ -1220,9 +1221,9 @@
 }
 
 TEST_F(ResourceAttributeTest, BindingPointUsedTwiceByDifferentEntryPoints) {
-    GlobalVar(Source{{12, 34}}, "A", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()),
+    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(ast::TextureDimension::k2d, ty.f32()),
+    GlobalVar(Source{{56, 78}}, "B", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()),
               Binding(1_a), Group(2_a));
 
     Func("F_A", utils::Empty, ty.void_(),
@@ -1582,7 +1583,7 @@
 TEST_F(GroupAndBindingTest, Const_I32) {
     GlobalConst("b", Expr(4_i));
     GlobalConst("g", Expr(2_i));
-    GlobalVar("val", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()), Binding("b"),
+    GlobalVar("val", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Binding("b"),
               Group("g"));
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1591,7 +1592,7 @@
 TEST_F(GroupAndBindingTest, Const_U32) {
     GlobalConst("b", Expr(4_u));
     GlobalConst("g", Expr(2_u));
-    GlobalVar("val", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()), Binding("b"),
+    GlobalVar("val", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Binding("b"),
               Group("g"));
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1600,14 +1601,14 @@
 TEST_F(GroupAndBindingTest, Const_AInt) {
     GlobalConst("b", Expr(4_a));
     GlobalConst("g", Expr(2_a));
-    GlobalVar("val", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()), Binding("b"),
+    GlobalVar("val", ty.sampled_texture(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(ast::TextureDimension::k2d, ty.f32()),
+    GlobalVar("val", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()),
               Binding(Construct(ty.u32(), Call(Source{{12, 34}}, "dpdx", 1_a))), Group(1_i));
 
     EXPECT_FALSE(r()->Resolve());
@@ -1617,7 +1618,7 @@
 }
 
 TEST_F(GroupAndBindingTest, Binding_Negative) {
-    GlobalVar("val", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()),
+    GlobalVar("val", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()),
               Binding(Source{{12, 34}}, -2_i), Group(1_i));
 
     EXPECT_FALSE(r()->Resolve());
@@ -1625,7 +1626,7 @@
 }
 
 TEST_F(GroupAndBindingTest, Binding_F32) {
-    GlobalVar("val", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()),
+    GlobalVar("val", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()),
               Binding(Source{{12, 34}}, 2.0_f), Group(1_u));
 
     EXPECT_FALSE(r()->Resolve());
@@ -1633,7 +1634,7 @@
 }
 
 TEST_F(GroupAndBindingTest, Binding_AFloat) {
-    GlobalVar("val", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()),
+    GlobalVar("val", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()),
               Binding(Source{{12, 34}}, 2.0_a), Group(1_u));
 
     EXPECT_FALSE(r()->Resolve());
@@ -1641,7 +1642,7 @@
 }
 
 TEST_F(GroupAndBindingTest, Group_NonConstant) {
-    GlobalVar("val", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()), Binding(2_u),
+    GlobalVar("val", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Binding(2_u),
               Group(Construct(ty.u32(), Call(Source{{12, 34}}, "dpdx", 1_a))));
 
     EXPECT_FALSE(r()->Resolve());
@@ -1651,7 +1652,7 @@
 }
 
 TEST_F(GroupAndBindingTest, Group_Negative) {
-    GlobalVar("val", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()), Binding(2_u),
+    GlobalVar("val", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Binding(2_u),
               Group(Source{{12, 34}}, -1_i));
 
     EXPECT_FALSE(r()->Resolve());
@@ -1659,7 +1660,7 @@
 }
 
 TEST_F(GroupAndBindingTest, Group_F32) {
-    GlobalVar("val", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()), Binding(2_u),
+    GlobalVar("val", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Binding(2_u),
               Group(Source{{12, 34}}, 1.0_f));
 
     EXPECT_FALSE(r()->Resolve());
@@ -1667,7 +1668,7 @@
 }
 
 TEST_F(GroupAndBindingTest, Group_AFloat) {
-    GlobalVar("val", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()), Binding(2_u),
+    GlobalVar("val", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Binding(2_u),
               Group(Source{{12, 34}}, 1.0_a));
 
     EXPECT_FALSE(r()->Resolve());
diff --git a/src/tint/resolver/builtin_test.cc b/src/tint/resolver/builtin_test.cc
index 955b945..b2b1e30 100644
--- a/src/tint/resolver/builtin_test.cc
+++ b/src/tint/resolver/builtin_test.cc
@@ -36,6 +36,7 @@
 #include "src/tint/sem/variable.h"
 #include "src/tint/type/sampled_texture.h"
 #include "src/tint/type/test_helper.h"
+#include "src/tint/type/texture_dimension.h"
 
 using ::testing::ElementsAre;
 using ::testing::HasSubstr;
@@ -2102,7 +2103,7 @@
 }
 
 struct TextureTestParams {
-    ast::TextureDimension dim;
+    type::TextureDimension dim;
     Texture type = Texture::kF32;
     ast::TexelFormat format = ast::TexelFormat::kR32Float;
 };
@@ -2118,16 +2119,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
-    const ast::Type* GetCoordsType(ast::TextureDimension dim, const ast::Type* scalar) {
+    const ast::Type* GetCoordsType(type::TextureDimension dim, const ast::Type* scalar) {
         switch (dim) {
-            case ast::TextureDimension::k1d:
+            case type::TextureDimension::k1d:
                 return scalar;
-            case ast::TextureDimension::k2d:
-            case ast::TextureDimension::k2dArray:
+            case type::TextureDimension::k2d:
+            case type::TextureDimension::k2dArray:
                 return ty.vec(scalar, 2);
-            case ast::TextureDimension::k3d:
-            case ast::TextureDimension::kCube:
-            case ast::TextureDimension::kCubeArray:
+            case type::TextureDimension::k3d:
+            case type::TextureDimension::kCube:
+            case type::TextureDimension::kCubeArray:
                 return ty.vec(scalar, 3);
             default:
                 [=]() { FAIL() << "Unsupported texture dimension: " << dim; }();
@@ -2169,7 +2170,7 @@
 
     add_call_param("texture", texture_type, &call_params);
     add_call_param("coords", coords_type, &call_params);
-    if (dim == ast::TextureDimension::k2dArray) {
+    if (dim == type::TextureDimension::k2dArray) {
         add_call_param("array_index", ty.i32(), &call_params);
     }
     add_call_param("level", ty.i32(), &call_params);
@@ -2193,10 +2194,10 @@
 
 INSTANTIATE_TEST_SUITE_P(ResolverTest,
                          ResolverBuiltinTest_SampledTextureOperation,
-                         testing::Values(TextureTestParams{ast::TextureDimension::k1d},
-                                         TextureTestParams{ast::TextureDimension::k2d},
-                                         TextureTestParams{ast::TextureDimension::k2dArray},
-                                         TextureTestParams{ast::TextureDimension::k3d}));
+                         testing::Values(TextureTestParams{type::TextureDimension::k1d},
+                                         TextureTestParams{type::TextureDimension::k2d},
+                                         TextureTestParams{type::TextureDimension::k2dArray},
+                                         TextureTestParams{type::TextureDimension::k3d}));
 
 using ResolverBuiltinTest_Texture = ResolverTestWithParam<ast::builtin::test::TextureOverloadCase>;
 
@@ -2469,20 +2470,20 @@
         switch (param.texture_dimension) {
             default:
                 FAIL() << "invalid texture dimensions: " << param.texture_dimension;
-            case ast::TextureDimension::k1d:
+            case type::TextureDimension::k1d:
                 EXPECT_TRUE(TypeOf(call)->Is<type::U32>());
                 break;
-            case ast::TextureDimension::k2d:
-            case ast::TextureDimension::k2dArray:
-            case ast::TextureDimension::kCube:
-            case ast::TextureDimension::kCubeArray: {
+            case type::TextureDimension::k2d:
+            case type::TextureDimension::k2dArray:
+            case type::TextureDimension::kCube:
+            case type::TextureDimension::kCubeArray: {
                 auto* vec = As<type::Vector>(TypeOf(call));
                 ASSERT_NE(vec, nullptr);
                 EXPECT_EQ(vec->Width(), 2u);
                 EXPECT_TRUE(vec->type()->Is<type::U32>());
                 break;
             }
-            case ast::TextureDimension::k3d: {
+            case type::TextureDimension::k3d: {
                 auto* vec = As<type::Vector>(TypeOf(call));
                 ASSERT_NE(vec, nullptr);
                 EXPECT_EQ(vec->Width(), 3u);
diff --git a/src/tint/resolver/dependency_graph_test.cc b/src/tint/resolver/dependency_graph_test.cc
index 81e79ff..b73033c 100644
--- a/src/tint/resolver/dependency_graph_test.cc
+++ b/src/tint/resolver/dependency_graph_test.cc
@@ -19,6 +19,7 @@
 #include "gmock/gmock.h"
 #include "src/tint/resolver/dependency_graph.h"
 #include "src/tint/resolver/resolver_test_helper.h"
+#include "src/tint/type/texture_dimension.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
@@ -493,12 +494,12 @@
         }
         case SymbolUseKind::GlobalVarSampledTexElemType: {
             auto* node = b.ty.type_name(source, symbol);
-            b.GlobalVar(b.Sym(), b.ty.sampled_texture(ast::TextureDimension::k2d, node));
+            b.GlobalVar(b.Sym(), b.ty.sampled_texture(type::TextureDimension::k2d, node));
             return node;
         }
         case SymbolUseKind::GlobalVarMultisampledTexElemType: {
             auto* node = b.ty.type_name(source, symbol);
-            b.GlobalVar(b.Sym(), b.ty.multisampled_texture(ast::TextureDimension::k2d, node));
+            b.GlobalVar(b.Sym(), b.ty.multisampled_texture(type::TextureDimension::k2d, node));
             return node;
         }
         case SymbolUseKind::GlobalVarValue: {
@@ -1290,12 +1291,12 @@
     GlobalVar(Sym(), ty.vec3(T));
     GlobalVar(Sym(), ty.mat3x2(T));
     GlobalVar(Sym(), ty.pointer(T, ast::AddressSpace::kPrivate));
-    GlobalVar(Sym(), ty.sampled_texture(ast::TextureDimension::k2d, T));
-    GlobalVar(Sym(), ty.depth_texture(ast::TextureDimension::k2d));
-    GlobalVar(Sym(), ty.depth_multisampled_texture(ast::TextureDimension::k2d));
+    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.external_texture());
-    GlobalVar(Sym(), ty.multisampled_texture(ast::TextureDimension::k2d, T));
-    GlobalVar(Sym(), ty.storage_texture(ast::TextureDimension::k2d, ast::TexelFormat::kR32Float,
+    GlobalVar(Sym(), ty.multisampled_texture(type::TextureDimension::k2d, T));
+    GlobalVar(Sym(), ty.storage_texture(type::TextureDimension::k2d, ast::TexelFormat::kR32Float,
                                         ast::Access::kRead));  //
     GlobalVar(Sym(), ty.sampler(ast::SamplerKind::kSampler));
 
diff --git a/src/tint/resolver/intrinsic_table.cc b/src/tint/resolver/intrinsic_table.cc
index 4b507b8..129fcc3 100644
--- a/src/tint/resolver/intrinsic_table.cc
+++ b/src/tint/resolver/intrinsic_table.cc
@@ -34,6 +34,7 @@
 #include "src/tint/type/multisampled_texture.h"
 #include "src/tint/type/sampled_texture.h"
 #include "src/tint/type/storage_texture.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/utils/hash.h"
 #include "src/tint/utils/hashmap.h"
 #include "src/tint/utils/math.h"
@@ -605,7 +606,7 @@
 
 bool match_texture(MatchState&,
                    const type::Type* ty,
-                   ast::TextureDimension dim,
+                   type::TextureDimension dim,
                    const type::Type*& T) {
     if (ty->Is<Any>()) {
         T = ty;
@@ -632,17 +633,17 @@
         return state.builder.create<type::SampledTexture>(dim, T);                  \
     }
 
-DECLARE_SAMPLED_TEXTURE(1d, ast::TextureDimension::k1d)
-DECLARE_SAMPLED_TEXTURE(2d, ast::TextureDimension::k2d)
-DECLARE_SAMPLED_TEXTURE(2d_array, ast::TextureDimension::k2dArray)
-DECLARE_SAMPLED_TEXTURE(3d, ast::TextureDimension::k3d)
-DECLARE_SAMPLED_TEXTURE(cube, ast::TextureDimension::kCube)
-DECLARE_SAMPLED_TEXTURE(cube_array, ast::TextureDimension::kCubeArray)
+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)
 #undef DECLARE_SAMPLED_TEXTURE
 
 bool match_texture_multisampled(MatchState&,
                                 const type::Type* ty,
-                                ast::TextureDimension dim,
+                                type::TextureDimension dim,
                                 const type::Type*& T) {
     if (ty->Is<Any>()) {
         T = ty;
@@ -667,10 +668,10 @@
         return state.builder.create<type::MultisampledTexture>(dim, T);                      \
     }
 
-DECLARE_MULTISAMPLED_TEXTURE(2d, ast::TextureDimension::k2d)
+DECLARE_MULTISAMPLED_TEXTURE(2d, type::TextureDimension::k2d)
 #undef DECLARE_MULTISAMPLED_TEXTURE
 
-bool match_texture_depth(MatchState&, const type::Type* ty, ast::TextureDimension dim) {
+bool match_texture_depth(MatchState&, const type::Type* ty, type::TextureDimension dim) {
     if (ty->Is<Any>()) {
         return true;
     }
@@ -685,10 +686,10 @@
         return state.builder.create<type::DepthTexture>(dim);                           \
     }
 
-DECLARE_DEPTH_TEXTURE(2d, ast::TextureDimension::k2d)
-DECLARE_DEPTH_TEXTURE(2d_array, ast::TextureDimension::k2dArray)
-DECLARE_DEPTH_TEXTURE(cube, ast::TextureDimension::kCube)
-DECLARE_DEPTH_TEXTURE(cube_array, ast::TextureDimension::kCubeArray)
+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)
 #undef DECLARE_DEPTH_TEXTURE
 
 bool match_texture_depth_multisampled_2d(MatchState&, const type::Type* ty) {
@@ -696,17 +697,17 @@
         return true;
     }
     return ty->Is([&](const type::DepthMultisampledTexture* t) {
-        return t->dim() == ast::TextureDimension::k2d;
+        return t->dim() == type::TextureDimension::k2d;
     });
 }
 
 type::DepthMultisampledTexture* build_texture_depth_multisampled_2d(MatchState& state) {
-    return state.builder.create<type::DepthMultisampledTexture>(ast::TextureDimension::k2d);
+    return state.builder.create<type::DepthMultisampledTexture>(type::TextureDimension::k2d);
 }
 
 bool match_texture_storage(MatchState&,
                            const type::Type* ty,
-                           ast::TextureDimension dim,
+                           type::TextureDimension dim,
                            Number& F,
                            Number& A) {
     if (ty->Is<Any>()) {
@@ -737,10 +738,10 @@
         return state.builder.create<type::StorageTexture>(dim, format, access, T);                 \
     }
 
-DECLARE_STORAGE_TEXTURE(1d, ast::TextureDimension::k1d)
-DECLARE_STORAGE_TEXTURE(2d, ast::TextureDimension::k2d)
-DECLARE_STORAGE_TEXTURE(2d_array, ast::TextureDimension::k2dArray)
-DECLARE_STORAGE_TEXTURE(3d, ast::TextureDimension::k3d)
+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)
 #undef DECLARE_STORAGE_TEXTURE
 
 bool match_texture_external(MatchState&, const type::Type* ty) {
diff --git a/src/tint/resolver/intrinsic_table_test.cc b/src/tint/resolver/intrinsic_table_test.cc
index bb17bae..fbd00af 100644
--- a/src/tint/resolver/intrinsic_table_test.cc
+++ b/src/tint/resolver/intrinsic_table_test.cc
@@ -30,6 +30,7 @@
 #include "src/tint/type/sampled_texture.h"
 #include "src/tint/type/storage_texture.h"
 #include "src/tint/type/test_helper.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::resolver {
 namespace {
@@ -97,7 +98,7 @@
     auto* f32 = create<type::F32>();
     auto* i32 = create<type::I32>();
     auto* vec4_f32 = create<type::Vector>(f32, 4u);
-    auto* tex = create<type::SampledTexture>(ast::TextureDimension::k1d, f32);
+    auto* tex = create<type::SampledTexture>(type::TextureDimension::k1d, f32);
     auto result = table->Lookup(BuiltinType::kTextureLoad, utils::Vector{tex, i32, i32},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_NE(result.sem, nullptr) << Diagnostics().str();
@@ -115,7 +116,7 @@
 
 TEST_F(IntrinsicTableTest, MismatchI32) {
     auto* f32 = create<type::F32>();
-    auto* tex = create<type::SampledTexture>(ast::TextureDimension::k1d, f32);
+    auto* tex = create<type::SampledTexture>(type::TextureDimension::k1d, f32);
     auto result = table->Lookup(BuiltinType::kTextureLoad, utils::Vector{tex, f32},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_EQ(result.sem, nullptr);
@@ -280,7 +281,7 @@
     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>(ast::TextureDimension::k2d, f32);
+    auto* tex = create<type::SampledTexture>(type::TextureDimension::k2d, f32);
     auto* sampler = create<type::Sampler>(ast::SamplerKind::kSampler);
     auto result = table->Lookup(BuiltinType::kTextureSample, utils::Vector{tex, sampler, vec2_f32},
                                 sem::EvaluationStage::kConstant, Source{});
@@ -300,7 +301,7 @@
 TEST_F(IntrinsicTableTest, MismatchSampler) {
     auto* f32 = create<type::F32>();
     auto* vec2_f32 = create<type::Vector>(f32, 2u);
-    auto* tex = create<type::SampledTexture>(ast::TextureDimension::k2d, f32);
+    auto* tex = create<type::SampledTexture>(type::TextureDimension::k2d, f32);
     auto result = table->Lookup(BuiltinType::kTextureSample, utils::Vector{tex, f32, vec2_f32},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_EQ(result.sem, nullptr);
@@ -312,7 +313,7 @@
     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>(ast::TextureDimension::k2d, f32);
+    auto* tex = create<type::SampledTexture>(type::TextureDimension::k2d, f32);
     auto result = table->Lookup(BuiltinType::kTextureLoad, utils::Vector{tex, vec2_i32, i32},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_NE(result.sem, nullptr) << Diagnostics().str();
@@ -333,7 +334,7 @@
     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>(ast::TextureDimension::k2d, f32);
+    auto* tex = create<type::MultisampledTexture>(type::TextureDimension::k2d, f32);
     auto result = table->Lookup(BuiltinType::kTextureLoad, utils::Vector{tex, vec2_i32, i32},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_NE(result.sem, nullptr) << Diagnostics().str();
@@ -353,7 +354,7 @@
     auto* f32 = create<type::F32>();
     auto* i32 = create<type::I32>();
     auto* vec2_i32 = create<type::Vector>(i32, 2u);
-    auto* tex = create<type::DepthTexture>(ast::TextureDimension::k2d);
+    auto* tex = create<type::DepthTexture>(type::TextureDimension::k2d);
     auto result = table->Lookup(BuiltinType::kTextureLoad, utils::Vector{tex, vec2_i32, i32},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_NE(result.sem, nullptr) << Diagnostics().str();
@@ -373,7 +374,7 @@
     auto* f32 = create<type::F32>();
     auto* i32 = create<type::I32>();
     auto* vec2_i32 = create<type::Vector>(i32, 2u);
-    auto* tex = create<type::DepthMultisampledTexture>(ast::TextureDimension::k2d);
+    auto* tex = create<type::DepthMultisampledTexture>(type::TextureDimension::k2d);
     auto result = table->Lookup(BuiltinType::kTextureLoad, utils::Vector{tex, vec2_i32, i32},
                                 sem::EvaluationStage::kConstant, Source{});
     ASSERT_NE(result.sem, nullptr) << Diagnostics().str();
@@ -415,7 +416,7 @@
     auto* vec4_f32 = create<type::Vector>(f32, 4u);
     auto* subtype = type::StorageTexture::SubtypeFor(ast::TexelFormat::kR32Float, Types());
     auto* tex = create<type::StorageTexture>(
-        ast::TextureDimension::k2d, ast::TexelFormat::kR32Float, ast::Access::kWrite, subtype);
+        type::TextureDimension::k2d, ast::TexelFormat::kR32Float, ast::Access::kWrite, subtype);
 
     auto result = table->Lookup(BuiltinType::kTextureStore, utils::Vector{tex, vec2_i32, vec4_f32},
                                 sem::EvaluationStage::kConstant, Source{});
@@ -629,7 +630,7 @@
 }
 
 TEST_F(IntrinsicTableTest, OverloadOrderByMatchingParameter) {
-    auto* tex = create<type::DepthTexture>(ast::TextureDimension::k2d);
+    auto* tex = create<type::DepthTexture>(type::TextureDimension::k2d);
     auto* bool_ = create<type::Bool>();
     table->Lookup(BuiltinType::kTextureDimensions, utils::Vector{tex, bool_},
                   sem::EvaluationStage::kConstant, Source{});
diff --git a/src/tint/resolver/load_test.cc b/src/tint/resolver/load_test.cc
index fea60ff5..a97b011 100644
--- a/src/tint/resolver/load_test.cc
+++ b/src/tint/resolver/load_test.cc
@@ -12,14 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "src/tint/sem/load.h"
+#include "gmock/gmock.h"
 #include "src/tint/resolver/resolver.h"
 #include "src/tint/resolver/resolver_test_helper.h"
 #include "src/tint/sem/test_helper.h"
-
-#include "src/tint/sem/load.h"
 #include "src/tint/type/reference.h"
-
-#include "gmock/gmock.h"
+#include "src/tint/type/texture_dimension.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
@@ -220,12 +219,12 @@
     //   return textureSampleLevel(tp, sp, vec2(), 0);
     // }
     // f(t, s);
-    GlobalVar("t", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()),
+    GlobalVar("t", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()),
               utils::Vector{Group(0_a), Binding(0_a)});
     GlobalVar("s", ty.sampler(ast::SamplerKind::kSampler), utils::Vector{Group(0_a), Binding(1_a)});
     Func("f",
          utils::Vector{
-             Param("tp", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32())),
+             Param("tp", ty.sampled_texture(type::TextureDimension::k2d, ty.f32())),
              Param("sp", ty.sampler(ast::SamplerKind::kSampler)),
          },
          ty.vec4<f32>(),
diff --git a/src/tint/resolver/ptr_ref_validation_test.cc b/src/tint/resolver/ptr_ref_validation_test.cc
index efd77a6..a79a546 100644
--- a/src/tint/resolver/ptr_ref_validation_test.cc
+++ b/src/tint/resolver/ptr_ref_validation_test.cc
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "gmock/gmock.h"
 #include "src/tint/ast/bitcast_expression.h"
 #include "src/tint/resolver/resolver.h"
 #include "src/tint/resolver/resolver_test_helper.h"
 #include "src/tint/type/reference.h"
-
-#include "gmock/gmock.h"
+#include "src/tint/type/texture_dimension.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
@@ -54,7 +54,7 @@
 TEST_F(ResolverPtrRefValidationTest, AddressOfHandle) {
     // @group(0) @binding(0) var t: texture_3d<f32>;
     // &t
-    GlobalVar("t", ty.sampled_texture(ast::TextureDimension::k3d, ty.f32()), Group(0_a),
+    GlobalVar("t", ty.sampled_texture(type::TextureDimension::k3d, ty.f32()), Group(0_a),
               Binding(0_a));
     auto* expr = AddressOf(Expr(Source{{12, 34}}, "t"));
     WrapInFunction(expr);
@@ -94,7 +94,7 @@
 TEST_F(ResolverPtrRefValidationTest, IndirectOfAddressOfHandle) {
     // @group(0) @binding(0) var t: texture_3d<f32>;
     // *&t
-    GlobalVar("t", ty.sampled_texture(ast::TextureDimension::k3d, ty.f32()), Group(0_a),
+    GlobalVar("t", ty.sampled_texture(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/resolver/resolver_test.cc b/src/tint/resolver/resolver_test.cc
index e5538c5..a5a9148 100644
--- a/src/tint/resolver/resolver_test.cc
+++ b/src/tint/resolver/resolver_test.cc
@@ -44,6 +44,7 @@
 #include "src/tint/sem/variable.h"
 #include "src/tint/type/reference.h"
 #include "src/tint/type/sampled_texture.h"
+#include "src/tint/type/texture_dimension.h"
 
 using ::testing::ElementsAre;
 using ::testing::HasSubstr;
@@ -1886,7 +1887,7 @@
 }
 
 TEST_F(ResolverTest, AddressSpace_SetForTexture) {
-    auto* t = ty.sampled_texture(ast::TextureDimension::k1d, ty.f32());
+    auto* t = ty.sampled_texture(type::TextureDimension::k1d, ty.f32());
     auto* var = GlobalVar("var", t, Binding(0_a), Group(0_a));
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -2123,7 +2124,7 @@
 }
 
 TEST_F(ResolverTest, TextureSampler_TextureSample) {
-    GlobalVar("t", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()), Group(1_a),
+    GlobalVar("t", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Group(1_a),
               Binding(1_a));
     GlobalVar("s", ty.sampler(ast::SamplerKind::kSampler), Group(1_a), Binding(2_a));
 
@@ -2141,7 +2142,7 @@
 }
 
 TEST_F(ResolverTest, TextureSampler_TextureSampleInFunction) {
-    GlobalVar("t", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()), Group(1_a),
+    GlobalVar("t", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Group(1_a),
               Binding(1_a));
     GlobalVar("s", ty.sampler(ast::SamplerKind::kSampler), Group(1_a), Binding(2_a));
 
@@ -2167,7 +2168,7 @@
 }
 
 TEST_F(ResolverTest, TextureSampler_TextureSampleFunctionDiamondSameVariables) {
-    GlobalVar("t", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()), Group(1_a),
+    GlobalVar("t", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Group(1_a),
               Binding(1_a));
     GlobalVar("s", ty.sampler(ast::SamplerKind::kSampler), Group(1_a), Binding(2_a));
 
@@ -2202,9 +2203,9 @@
 }
 
 TEST_F(ResolverTest, TextureSampler_TextureSampleFunctionDiamondDifferentVariables) {
-    GlobalVar("t1", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()), Group(1_a),
+    GlobalVar("t1", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Group(1_a),
               Binding(1_a));
-    GlobalVar("t2", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()), Group(1_a),
+    GlobalVar("t2", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Group(1_a),
               Binding(2_a));
     GlobalVar("s", ty.sampler(ast::SamplerKind::kSampler), Group(1_a), Binding(3_a));
 
@@ -2241,7 +2242,7 @@
 }
 
 TEST_F(ResolverTest, TextureSampler_TextureDimensions) {
-    GlobalVar("t", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()), Group(1_a),
+    GlobalVar("t", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Group(1_a),
               Binding(2_a));
 
     auto* call = Call("textureDimensions", "t");
@@ -2270,7 +2271,7 @@
     //     return textureSampleLevel(*tl, *sl, c, 0.0);
     // }
     GlobalVar("s", ty.sampler(ast::SamplerKind::kSampler), Group(0_a), Binding(0_a));
-    GlobalVar("t", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()), Group(0_a),
+    GlobalVar("t", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Group(0_a),
               Binding(1_a));
     GlobalVar("c", ty.vec2<f32>(), ast::AddressSpace::kUniform, Group(0_a), Binding(2_a));
 
@@ -2289,7 +2290,7 @@
          utils::Vector{
              Param("sl", ty.pointer(ty.sampler(ast::SamplerKind::kSampler),
                                     ast::AddressSpace::kFunction)),
-             Param("tl", ty.pointer(ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()),
+             Param("tl", ty.pointer(ty.sampled_texture(type::TextureDimension::k2d, ty.f32()),
                                     ast::AddressSpace::kFunction)),
          },
          ty.vec4<f32>(),
diff --git a/src/tint/resolver/root_identifier_test.cc b/src/tint/resolver/root_identifier_test.cc
index 934feae..adf9239 100644
--- a/src/tint/resolver/root_identifier_test.cc
+++ b/src/tint/resolver/root_identifier_test.cc
@@ -17,6 +17,7 @@
 #include "src/tint/resolver/resolver_test_helper.h"
 #include "src/tint/sem/index_accessor_expression.h"
 #include "src/tint/sem/member_accessor_expression.h"
+#include "src/tint/type/texture_dimension.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
@@ -70,7 +71,7 @@
 }
 
 TEST_F(ResolverRootIdentifierTest, GlobalTextureVar) {
-    auto* a = GlobalVar("a", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()),
+    auto* a = GlobalVar("a", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()),
                         ast::AddressSpace::kNone, Group(0_a), Binding(0_a));
     auto* expr = Expr(a);
     WrapInFunction(Call("textureDimensions", expr));
diff --git a/src/tint/resolver/side_effects_test.cc b/src/tint/resolver/side_effects_test.cc
index 8265586..e367714 100644
--- a/src/tint/resolver/side_effects_test.cc
+++ b/src/tint/resolver/side_effects_test.cc
@@ -19,6 +19,7 @@
 #include "src/tint/sem/expression.h"
 #include "src/tint/sem/index_accessor_expression.h"
 #include "src/tint/sem/member_accessor_expression.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/utils/vector.h"
 
 using namespace tint::number_suffixes;  // NOLINT
@@ -180,16 +181,16 @@
     GlobalVar("a", ty.atomic(ty.i32()), ast::AddressSpace::kStorage, ast::Access::kReadWrite,
               Group(0_a), Binding(AInt(next_binding++)));
     if (c.pipeline_stage != ast::PipelineStage::kCompute) {
-        GlobalVar("t2d", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()), Group(0_a),
+        GlobalVar("t2d", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()), Group(0_a),
                   Binding(AInt(next_binding++)));
-        GlobalVar("tdepth2d", ty.depth_texture(ast::TextureDimension::k2d), Group(0_a),
+        GlobalVar("tdepth2d", ty.depth_texture(type::TextureDimension::k2d), Group(0_a),
                   Binding(AInt(next_binding++)));
-        GlobalVar("t2d_arr", ty.sampled_texture(ast::TextureDimension::k2dArray, ty.f32()),
+        GlobalVar("t2d_arr", ty.sampled_texture(type::TextureDimension::k2dArray, ty.f32()),
                   Group(0_a), Binding(AInt(next_binding++)));
-        GlobalVar("t2d_multi", ty.multisampled_texture(ast::TextureDimension::k2d, ty.f32()),
+        GlobalVar("t2d_multi", ty.multisampled_texture(type::TextureDimension::k2d, ty.f32()),
                   Group(0_a), Binding(AInt(next_binding++)));
         GlobalVar("tstorage2d",
-                  ty.storage_texture(ast::TextureDimension::k2d, ast::TexelFormat::kR32Float,
+                  ty.storage_texture(type::TextureDimension::k2d, ast::TexelFormat::kR32Float,
                                      ast::Access::kWrite),
                   Group(0_a), Binding(AInt(next_binding++)));
         GlobalVar("s2d", ty.sampler(ast::SamplerKind::kSampler), Group(0_a),
diff --git a/src/tint/resolver/type_validation_test.cc b/src/tint/resolver/type_validation_test.cc
index ebd40b0..bfc9d23 100644
--- a/src/tint/resolver/type_validation_test.cc
+++ b/src/tint/resolver/type_validation_test.cc
@@ -19,6 +19,7 @@
 #include "src/tint/resolver/resolver_test_helper.h"
 #include "src/tint/type/multisampled_texture.h"
 #include "src/tint/type/storage_texture.h"
+#include "src/tint/type/texture_dimension.h"
 
 #include "gmock/gmock.h"
 
@@ -856,7 +857,7 @@
 }
 
 TEST_F(ResolverTypeValidationTest, ArrayOfNonStorableType) {
-    auto* tex_ty = ty.sampled_texture(Source{{12, 34}}, ast::TextureDimension::k2d, ty.f32());
+    auto* tex_ty = ty.sampled_texture(Source{{12, 34}}, type::TextureDimension::k2d, ty.f32());
     GlobalVar("arr", ty.array(tex_ty, 4_i), ast::AddressSpace::kPrivate);
 
     EXPECT_FALSE(r()->Resolve());
@@ -964,7 +965,7 @@
 
 namespace SampledTextureTests {
 struct DimensionParams {
-    ast::TextureDimension dim;
+    type::TextureDimension dim;
     bool is_valid;
 };
 
@@ -979,12 +980,12 @@
 INSTANTIATE_TEST_SUITE_P(ResolverTypeValidationTest,
                          SampledTextureDimensionTest,
                          testing::Values(  //
-                             DimensionParams{ast::TextureDimension::k1d, true},
-                             DimensionParams{ast::TextureDimension::k2d, true},
-                             DimensionParams{ast::TextureDimension::k2dArray, true},
-                             DimensionParams{ast::TextureDimension::k3d, true},
-                             DimensionParams{ast::TextureDimension::kCube, true},
-                             DimensionParams{ast::TextureDimension::kCubeArray, true}));
+                             DimensionParams{type::TextureDimension::k1d, true},
+                             DimensionParams{type::TextureDimension::k2d, true},
+                             DimensionParams{type::TextureDimension::k2dArray, true},
+                             DimensionParams{type::TextureDimension::k3d, true},
+                             DimensionParams{type::TextureDimension::kCube, true},
+                             DimensionParams{type::TextureDimension::kCubeArray, true}));
 
 using MultisampledTextureDimensionTest = ResolverTestWithParam<DimensionParams>;
 TEST_P(MultisampledTextureDimensionTest, All) {
@@ -1002,12 +1003,12 @@
 INSTANTIATE_TEST_SUITE_P(ResolverTypeValidationTest,
                          MultisampledTextureDimensionTest,
                          testing::Values(  //
-                             DimensionParams{ast::TextureDimension::k1d, false},
-                             DimensionParams{ast::TextureDimension::k2d, true},
-                             DimensionParams{ast::TextureDimension::k2dArray, false},
-                             DimensionParams{ast::TextureDimension::k3d, false},
-                             DimensionParams{ast::TextureDimension::kCube, false},
-                             DimensionParams{ast::TextureDimension::kCubeArray, false}));
+                             DimensionParams{type::TextureDimension::k1d, false},
+                             DimensionParams{type::TextureDimension::k2d, true},
+                             DimensionParams{type::TextureDimension::k2dArray, false},
+                             DimensionParams{type::TextureDimension::k3d, false},
+                             DimensionParams{type::TextureDimension::kCube, false},
+                             DimensionParams{type::TextureDimension::kCubeArray, false}));
 
 struct TypeParams {
     builder::ast_type_func_ptr type_func;
@@ -1047,7 +1048,7 @@
     Enable(ast::Extension::kF16);
     GlobalVar(
         "a",
-        ty.sampled_texture(Source{{12, 34}}, ast::TextureDimension::k2d, params.type_func(*this)),
+        ty.sampled_texture(Source{{12, 34}}, type::TextureDimension::k2d, params.type_func(*this)),
         Group(0_a), Binding(0_a));
 
     if (params.is_valid) {
@@ -1066,7 +1067,7 @@
     auto& params = GetParam();
     Enable(ast::Extension::kF16);
     GlobalVar("a",
-              ty.multisampled_texture(Source{{12, 34}}, ast::TextureDimension::k2d,
+              ty.multisampled_texture(Source{{12, 34}}, type::TextureDimension::k2d,
                                       params.type_func(*this)),
               Group(0_a), Binding(0_a));
 
@@ -1086,17 +1087,17 @@
 
 namespace StorageTextureTests {
 struct DimensionParams {
-    ast::TextureDimension dim;
+    type::TextureDimension dim;
     bool is_valid;
 };
 
 static constexpr DimensionParams Dimension_cases[] = {
-    DimensionParams{ast::TextureDimension::k1d, true},
-    DimensionParams{ast::TextureDimension::k2d, true},
-    DimensionParams{ast::TextureDimension::k2dArray, true},
-    DimensionParams{ast::TextureDimension::k3d, true},
-    DimensionParams{ast::TextureDimension::kCube, false},
-    DimensionParams{ast::TextureDimension::kCubeArray, false}};
+    DimensionParams{type::TextureDimension::k1d, true},
+    DimensionParams{type::TextureDimension::k2d, true},
+    DimensionParams{type::TextureDimension::k2dArray, true},
+    DimensionParams{type::TextureDimension::k3d, true},
+    DimensionParams{type::TextureDimension::kCube, false},
+    DimensionParams{type::TextureDimension::kCubeArray, false}};
 
 using StorageTextureDimensionTest = ResolverTestWithParam<DimensionParams>;
 TEST_P(StorageTextureDimensionTest, All) {
@@ -1156,18 +1157,20 @@
     // @group(0) @binding(3)
     // var d : texture_storage_3d<*, write>;
 
-    auto* st_a = ty.storage_texture(Source{{12, 34}}, ast::TextureDimension::k1d, params.format,
+    auto* st_a = ty.storage_texture(Source{{12, 34}}, type::TextureDimension::k1d, params.format,
                                     ast::Access::kWrite);
     GlobalVar("a", st_a, Group(0_a), Binding(0_a));
 
-    auto* st_b = ty.storage_texture(ast::TextureDimension::k2d, params.format, ast::Access::kWrite);
+    auto* st_b =
+        ty.storage_texture(type::TextureDimension::k2d, params.format, ast::Access::kWrite);
     GlobalVar("b", st_b, Group(0_a), Binding(1_a));
 
     auto* st_c =
-        ty.storage_texture(ast::TextureDimension::k2dArray, params.format, ast::Access::kWrite);
+        ty.storage_texture(type::TextureDimension::k2dArray, params.format, ast::Access::kWrite);
     GlobalVar("c", st_c, Group(0_a), Binding(2_a));
 
-    auto* st_d = ty.storage_texture(ast::TextureDimension::k3d, params.format, ast::Access::kWrite);
+    auto* st_d =
+        ty.storage_texture(type::TextureDimension::k3d, params.format, ast::Access::kWrite);
     GlobalVar("d", st_d, Group(0_a), Binding(3_a));
 
     if (params.is_valid) {
@@ -1189,7 +1192,7 @@
     // @group(0) @binding(0)
     // var a : texture_storage_1d<ru32int>;
 
-    auto* st = ty.storage_texture(Source{{12, 34}}, ast::TextureDimension::k1d,
+    auto* st = ty.storage_texture(Source{{12, 34}}, type::TextureDimension::k1d,
                                   ast::TexelFormat::kR32Uint, ast::Access::kUndefined);
 
     GlobalVar("a", st, Group(0_a), Binding(0_a));
@@ -1202,7 +1205,7 @@
     // @group(0) @binding(0)
     // var a : texture_storage_1d<ru32int, read_write>;
 
-    auto* st = ty.storage_texture(Source{{12, 34}}, ast::TextureDimension::k1d,
+    auto* st = ty.storage_texture(Source{{12, 34}}, type::TextureDimension::k1d,
                                   ast::TexelFormat::kR32Uint, ast::Access::kReadWrite);
 
     GlobalVar("a", st, Group(0_a), Binding(0_a));
@@ -1216,7 +1219,7 @@
     // @group(0) @binding(0)
     // var a : texture_storage_1d<ru32int, read>;
 
-    auto* st = ty.storage_texture(Source{{12, 34}}, ast::TextureDimension::k1d,
+    auto* st = ty.storage_texture(Source{{12, 34}}, type::TextureDimension::k1d,
                                   ast::TexelFormat::kR32Uint, ast::Access::kRead);
 
     GlobalVar("a", st, Group(0_a), Binding(0_a));
@@ -1230,7 +1233,7 @@
     // @group(0) @binding(0)
     // var a : texture_storage_1d<ru32int, write>;
 
-    auto* st = ty.storage_texture(ast::TextureDimension::k1d, ast::TexelFormat::kR32Uint,
+    auto* st = ty.storage_texture(type::TextureDimension::k1d, ast::TexelFormat::kR32Uint,
                                   ast::Access::kWrite);
 
     GlobalVar("a", st, Group(0_a), Binding(0_a));
diff --git a/src/tint/resolver/validation_test.cc b/src/tint/resolver/validation_test.cc
index b476602..7f41be6 100644
--- a/src/tint/resolver/validation_test.cc
+++ b/src/tint/resolver/validation_test.cc
@@ -37,6 +37,7 @@
 #include "src/tint/sem/statement.h"
 #include "src/tint/sem/variable.h"
 #include "src/tint/type/sampled_texture.h"
+#include "src/tint/type/texture_dimension.h"
 
 using ::testing::ElementsAre;
 using ::testing::HasSubstr;
@@ -345,7 +346,7 @@
 }
 
 TEST_F(ResolverValidationTest, AddressSpace_TextureExplicitAddressSpace) {
-    auto* t = ty.sampled_texture(ast::TextureDimension::k1d, ty.f32());
+    auto* t = ty.sampled_texture(type::TextureDimension::k1d, ty.f32());
     GlobalVar(Source{{12, 34}}, "var", t, ast::AddressSpace::kHandle, Binding(0_a), Group(0_a));
 
     EXPECT_FALSE(r()->Resolve()) << r()->error();
diff --git a/src/tint/resolver/validator.cc b/src/tint/resolver/validator.cc
index c25129a..556350e 100644
--- a/src/tint/resolver/validator.cc
+++ b/src/tint/resolver/validator.cc
@@ -73,6 +73,7 @@
 #include "src/tint/type/sampled_texture.h"
 #include "src/tint/type/sampler.h"
 #include "src/tint/type/storage_texture.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/utils/defer.h"
 #include "src/tint/utils/map.h"
 #include "src/tint/utils/math.h"
@@ -84,12 +85,12 @@
 namespace tint::resolver {
 namespace {
 
-bool IsValidStorageTextureDimension(ast::TextureDimension dim) {
+bool IsValidStorageTextureDimension(type::TextureDimension dim) {
     switch (dim) {
-        case ast::TextureDimension::k1d:
-        case ast::TextureDimension::k2d:
-        case ast::TextureDimension::k2dArray:
-        case ast::TextureDimension::k3d:
+        case type::TextureDimension::k1d:
+        case type::TextureDimension::k2d:
+        case type::TextureDimension::k2dArray:
+        case type::TextureDimension::k3d:
             return true;
         default:
             return false;
@@ -331,7 +332,7 @@
 
 bool Validator::MultisampledTexture(const type::MultisampledTexture* t,
                                     const Source& source) const {
-    if (t->dim() != ast::TextureDimension::k2d) {
+    if (t->dim() != type::TextureDimension::k2d) {
         AddError("only 2d multisampled textures are supported", source);
         return false;
     }
diff --git a/src/tint/resolver/variable_test.cc b/src/tint/resolver/variable_test.cc
index 552ad08..744fb99 100644
--- a/src/tint/resolver/variable_test.cc
+++ b/src/tint/resolver/variable_test.cc
@@ -12,11 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "gmock/gmock.h"
 #include "src/tint/resolver/resolver.h"
 #include "src/tint/resolver/resolver_test_helper.h"
 #include "src/tint/type/reference.h"
-
-#include "gmock/gmock.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::resolver {
 namespace {
@@ -1044,7 +1044,7 @@
     auto* storage =
         GlobalVar("sb", ty.Of(buf), ast::AddressSpace::kStorage, Binding(1_a), Group(0_a));
     auto* handle =
-        GlobalVar("h", ty.depth_texture(ast::TextureDimension::k2d), Binding(2_a), Group(0_a));
+        GlobalVar("h", ty.depth_texture(type::TextureDimension::k2d), Binding(2_a), Group(0_a));
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
diff --git a/src/tint/resolver/variable_validation_test.cc b/src/tint/resolver/variable_validation_test.cc
index cf35e4c..c4232e2 100644
--- a/src/tint/resolver/variable_validation_test.cc
+++ b/src/tint/resolver/variable_validation_test.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "gmock/gmock.h"
 #include "src/tint/resolver/resolver.h"
 #include "src/tint/resolver/resolver_test_helper.h"
-
-#include "gmock/gmock.h"
+#include "src/tint/type/texture_dimension.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
@@ -123,8 +123,8 @@
 TEST_F(ResolverVariableValidationTest, LetTypeNotConstructible) {
     // @group(0) @binding(0) var t1 : texture_2d<f32>;
     // let t2 : t1;
-    auto* t1 = GlobalVar("t1", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()), Group(0_a),
-                         Binding(0_a));
+    auto* t1 = GlobalVar("t1", ty.sampled_texture(type::TextureDimension::k2d, ty.f32()),
+                         Group(0_a), Binding(0_a));
     auto* t2 = Let(Source{{56, 78}}, "t2", Expr(t1));
     WrapInFunction(t2);
 
diff --git a/src/tint/transform/builtin_polyfill.cc b/src/tint/transform/builtin_polyfill.cc
index dbd6f6e..2c0f2a9 100644
--- a/src/tint/transform/builtin_polyfill.cc
+++ b/src/tint/transform/builtin_polyfill.cc
@@ -22,6 +22,7 @@
 #include "src/tint/program_builder.h"
 #include "src/tint/sem/builtin.h"
 #include "src/tint/sem/call.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/utils/map.h"
 
 using namespace tint::number_suffixes;  // NOLINT
@@ -638,7 +639,7 @@
         };
         b.Func(name,
                utils::Vector{
-                   b.Param("t", b.ty.sampled_texture(ast::TextureDimension::k2d, b.ty.f32())),
+                   b.Param("t", b.ty.sampled_texture(type::TextureDimension::k2d, b.ty.f32())),
                    b.Param("s", b.ty.sampler(ast::SamplerKind::kSampler)),
                    b.Param("coord", b.ty.vec2<f32>()),
                },
diff --git a/src/tint/transform/multiplanar_external_texture.cc b/src/tint/transform/multiplanar_external_texture.cc
index d81d186..7a2200e 100644
--- a/src/tint/transform/multiplanar_external_texture.cc
+++ b/src/tint/transform/multiplanar_external_texture.cc
@@ -22,6 +22,7 @@
 #include "src/tint/sem/call.h"
 #include "src/tint/sem/function.h"
 #include "src/tint/sem/variable.h"
+#include "src/tint/type/texture_dimension.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::transform::MultiplanarExternalTexture);
 TINT_INSTANTIATE_TYPEINFO(tint::transform::MultiplanarExternalTexture::NewBindingPoints);
@@ -140,7 +141,7 @@
             auto& syms = new_binding_symbols[sem_var];
             syms.plane_0 = ctx.Clone(global->symbol);
             syms.plane_1 = b.Symbols().New("ext_tex_plane_1");
-            b.GlobalVar(syms.plane_1, b.ty.sampled_texture(ast::TextureDimension::k2d, b.ty.f32()),
+            b.GlobalVar(syms.plane_1, b.ty.sampled_texture(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.type_name("ExternalTextureParams"),
@@ -152,7 +153,7 @@
             const ast::Expression* cloned_initializer = ctx.Clone(global->initializer);
 
             auto* replacement =
-                b.Var(syms.plane_0, b.ty.sampled_texture(ast::TextureDimension::k2d, b.ty.f32()),
+                b.Var(syms.plane_0, b.ty.sampled_texture(type::TextureDimension::k2d, b.ty.f32()),
                       cloned_initializer, cloned_attributes);
             ctx.Replace(global, replacement);
         }
@@ -178,7 +179,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(ast::TextureDimension::k2d, b.ty.f32());
+                        return b.ty.sampled_texture(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()));
@@ -419,17 +420,18 @@
             texture_sample_external_sym = b.Symbols().New("textureSampleExternal");
 
             // Emit the textureSampleExternal function.
-            b.Func(
-                texture_sample_external_sym,
-                utils::Vector{
-                    b.Param("plane0", b.ty.sampled_texture(ast::TextureDimension::k2d, b.ty.f32())),
-                    b.Param("plane1", b.ty.sampled_texture(ast::TextureDimension::k2d, b.ty.f32())),
-                    b.Param("smp", b.ty.sampler(ast::SamplerKind::kSampler)),
-                    b.Param("coord", b.ty.vec2(b.ty.f32())),
-                    b.Param("params", b.ty.type_name(params_struct_sym)),
-                },
-                b.ty.vec4(b.ty.f32()),
-                buildTextureBuiltinBody(sem::BuiltinType::kTextureSampleBaseClampToEdge));
+            b.Func(texture_sample_external_sym,
+                   utils::Vector{
+                       b.Param("plane0",
+                               b.ty.sampled_texture(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(ast::SamplerKind::kSampler)),
+                       b.Param("coord", b.ty.vec2(b.ty.f32())),
+                       b.Param("params", b.ty.type_name(params_struct_sym)),
+                   },
+                   b.ty.vec4(b.ty.f32()),
+                   buildTextureBuiltinBody(sem::BuiltinType::kTextureSampleBaseClampToEdge));
         }
 
         const ast::IdentifierExpression* exp = b.Expr(texture_sample_external_sym);
@@ -467,16 +469,17 @@
             auto name = b.Symbols().New("textureLoadExternal");
 
             // Emit the textureLoadExternal() function.
-            b.Func(
-                name,
-                utils::Vector{
-                    b.Param("plane0", b.ty.sampled_texture(ast::TextureDimension::k2d, b.ty.f32())),
-                    b.Param("plane1", b.ty.sampled_texture(ast::TextureDimension::k2d, b.ty.f32())),
-                    b.Param("coord", CreateASTTypeFor(ctx, coord_ty)),
-                    b.Param("params", b.ty.type_name(params_struct_sym)),
-                },
-                b.ty.vec4(b.ty.f32()),  //
-                buildTextureBuiltinBody(sem::BuiltinType::kTextureLoad));
+            b.Func(name,
+                   utils::Vector{
+                       b.Param("plane0",
+                               b.ty.sampled_texture(type::TextureDimension::k2d, b.ty.f32())),
+                       b.Param("plane1",
+                               b.ty.sampled_texture(type::TextureDimension::k2d, b.ty.f32())),
+                       b.Param("coord", CreateASTTypeFor(ctx, coord_ty)),
+                       b.Param("params", b.ty.type_name(params_struct_sym)),
+                   },
+                   b.ty.vec4(b.ty.f32()),  //
+                   buildTextureBuiltinBody(sem::BuiltinType::kTextureLoad));
 
             return name;
         });
diff --git a/src/tint/transform/texture_1d_to_2d.cc b/src/tint/transform/texture_1d_to_2d.cc
index 85cd512..4de6188 100644
--- a/src/tint/transform/texture_1d_to_2d.cc
+++ b/src/tint/transform/texture_1d_to_2d.cc
@@ -19,6 +19,7 @@
 #include "src/tint/program_builder.h"
 #include "src/tint/sem/function.h"
 #include "src/tint/sem/statement.h"
+#include "src/tint/type/texture_dimension.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::transform::Texture1DTo2D);
 
@@ -36,7 +37,7 @@
                 auto texture = signature.Parameter(sem::ParameterUsage::kTexture);
                 if (texture) {
                     auto* tex = texture->Type()->As<type::Texture>();
-                    if (tex->dim() == ast::TextureDimension::k1d) {
+                    if (tex->dim() == type::TextureDimension::k1d) {
                         return true;
                     }
                 }
@@ -47,10 +48,10 @@
         if (Switch(
                 program->Sem().Get(var->type),
                 [&](const type::SampledTexture* tex) {
-                    return tex->dim() == ast::TextureDimension::k1d;
+                    return tex->dim() == type::TextureDimension::k1d;
                 },
                 [&](const type::StorageTexture* storage_tex) {
-                    return storage_tex->dim() == ast::TextureDimension::k1d;
+                    return storage_tex->dim() == type::TextureDimension::k1d;
                 })) {
             return true;
         }
@@ -94,18 +95,18 @@
             const ast::Variable* r = Switch(
                 sem.Get(v->type),
                 [&](const type::SampledTexture* tex) -> const ast::Variable* {
-                    if (tex->dim() == ast::TextureDimension::k1d) {
+                    if (tex->dim() == type::TextureDimension::k1d) {
                         auto* type = ctx.dst->create<ast::SampledTexture>(
-                            ast::TextureDimension::k2d, CreateASTTypeFor(ctx, tex->type()));
+                            type::TextureDimension::k2d, CreateASTTypeFor(ctx, tex->type()));
                         return create_var(v, type);
                     } else {
                         return nullptr;
                     }
                 },
                 [&](const type::StorageTexture* storage_tex) -> const ast::Variable* {
-                    if (storage_tex->dim() == ast::TextureDimension::k1d) {
+                    if (storage_tex->dim() == type::TextureDimension::k1d) {
                         auto* type = ctx.dst->create<ast::StorageTexture>(
-                            ast::TextureDimension::k2d, storage_tex->texel_format(),
+                            type::TextureDimension::k2d, storage_tex->texel_format(),
                             CreateASTTypeFor(ctx, storage_tex->type()), storage_tex->access());
                         return create_var(v, type);
                     } else {
@@ -131,7 +132,7 @@
                 return nullptr;
             }
             auto* tex = texture->Type()->As<type::Texture>();
-            if (tex->dim() != ast::TextureDimension::k1d) {
+            if (tex->dim() != type::TextureDimension::k1d) {
                 return nullptr;
             }
 
diff --git a/src/tint/type/array.cc b/src/tint/type/array.cc
index 6e1d297..dedf986 100644
--- a/src/tint/type/array.cc
+++ b/src/tint/type/array.cc
@@ -16,10 +16,10 @@
 
 #include <string>
 
-#include "src/tint/ast/variable.h"
 #include "src/tint/debug.h"
 #include "src/tint/symbol_table.h"
 #include "src/tint/type/manager.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/utils/hash.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::Array);
diff --git a/src/tint/type/depth_multisampled_texture.cc b/src/tint/type/depth_multisampled_texture.cc
index 7e80eb1..43d30a8 100644
--- a/src/tint/type/depth_multisampled_texture.cc
+++ b/src/tint/type/depth_multisampled_texture.cc
@@ -15,6 +15,7 @@
 #include "src/tint/type/depth_multisampled_texture.h"
 
 #include "src/tint/program_builder.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/utils/hash.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::DepthMultisampledTexture);
@@ -22,13 +23,13 @@
 namespace tint::type {
 namespace {
 
-bool IsValidDepthDimension(ast::TextureDimension dim) {
-    return dim == ast::TextureDimension::k2d;
+bool IsValidDepthDimension(TextureDimension dim) {
+    return dim == TextureDimension::k2d;
 }
 
 }  // namespace
 
-DepthMultisampledTexture::DepthMultisampledTexture(ast::TextureDimension dim)
+DepthMultisampledTexture::DepthMultisampledTexture(TextureDimension dim)
     : Base(utils::Hash(TypeInfo::Of<DepthMultisampledTexture>().full_hashcode, dim), dim) {
     TINT_ASSERT(Type, IsValidDepthDimension(dim));
 }
diff --git a/src/tint/type/depth_multisampled_texture.h b/src/tint/type/depth_multisampled_texture.h
index d91b463..31efaeb 100644
--- a/src/tint/type/depth_multisampled_texture.h
+++ b/src/tint/type/depth_multisampled_texture.h
@@ -18,6 +18,7 @@
 #include <string>
 
 #include "src/tint/type/texture.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::type {
 
@@ -26,7 +27,7 @@
   public:
     /// Constructor
     /// @param dim the dimensionality of the texture
-    explicit DepthMultisampledTexture(ast::TextureDimension dim);
+    explicit DepthMultisampledTexture(TextureDimension dim);
 
     /// Destructor
     ~DepthMultisampledTexture() override;
diff --git a/src/tint/type/depth_multisampled_texture_test.cc b/src/tint/type/depth_multisampled_texture_test.cc
index fa94d93..c0830c6 100644
--- a/src/tint/type/depth_multisampled_texture_test.cc
+++ b/src/tint/type/depth_multisampled_texture_test.cc
@@ -18,6 +18,7 @@
 #include "src/tint/type/sampled_texture.h"
 #include "src/tint/type/storage_texture.h"
 #include "src/tint/type/test_helper.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::type {
 namespace {
@@ -25,22 +26,22 @@
 using DepthMultisampledTextureTest = TestHelper;
 
 TEST_F(DepthMultisampledTextureTest, Creation) {
-    auto* a = create<DepthMultisampledTexture>(ast::TextureDimension::k2d);
-    auto* b = create<DepthMultisampledTexture>(ast::TextureDimension::k2d);
+    auto* a = create<DepthMultisampledTexture>(TextureDimension::k2d);
+    auto* b = create<DepthMultisampledTexture>(TextureDimension::k2d);
 
     EXPECT_EQ(a, b);
 }
 
 TEST_F(DepthMultisampledTextureTest, Hash) {
-    auto* a = create<DepthMultisampledTexture>(ast::TextureDimension::k2d);
-    auto* b = create<DepthMultisampledTexture>(ast::TextureDimension::k2d);
+    auto* a = create<DepthMultisampledTexture>(TextureDimension::k2d);
+    auto* b = create<DepthMultisampledTexture>(TextureDimension::k2d);
 
     EXPECT_EQ(a->unique_hash, b->unique_hash);
 }
 
 TEST_F(DepthMultisampledTextureTest, Equals) {
-    auto* a = create<DepthMultisampledTexture>(ast::TextureDimension::k2d);
-    auto* b = create<DepthMultisampledTexture>(ast::TextureDimension::k2d);
+    auto* a = create<DepthMultisampledTexture>(TextureDimension::k2d);
+    auto* b = create<DepthMultisampledTexture>(TextureDimension::k2d);
 
     EXPECT_TRUE(a->Equals(*a));
     EXPECT_TRUE(a->Equals(*b));
@@ -48,23 +49,23 @@
 }
 
 TEST_F(DepthMultisampledTextureTest, Dim) {
-    DepthMultisampledTexture d(ast::TextureDimension::k2d);
-    EXPECT_EQ(d.dim(), ast::TextureDimension::k2d);
+    DepthMultisampledTexture d(TextureDimension::k2d);
+    EXPECT_EQ(d.dim(), TextureDimension::k2d);
 }
 
 TEST_F(DepthMultisampledTextureTest, FriendlyName) {
-    DepthMultisampledTexture d(ast::TextureDimension::k2d);
+    DepthMultisampledTexture d(TextureDimension::k2d);
     EXPECT_EQ(d.FriendlyName(Symbols()), "texture_depth_multisampled_2d");
 }
 
 TEST_F(DepthMultisampledTextureTest, Clone) {
-    auto* a = create<DepthMultisampledTexture>(ast::TextureDimension::k2d);
+    auto* a = create<DepthMultisampledTexture>(TextureDimension::k2d);
 
     type::Manager mgr;
     type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* dt = a->Clone(ctx);
-    EXPECT_EQ(dt->dim(), ast::TextureDimension::k2d);
+    EXPECT_EQ(dt->dim(), TextureDimension::k2d);
 }
 
 }  // namespace
diff --git a/src/tint/type/depth_texture.cc b/src/tint/type/depth_texture.cc
index 2295b39..214b407 100644
--- a/src/tint/type/depth_texture.cc
+++ b/src/tint/type/depth_texture.cc
@@ -15,6 +15,7 @@
 #include "src/tint/type/depth_texture.h"
 
 #include "src/tint/program_builder.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/utils/hash.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::DepthTexture);
@@ -22,14 +23,14 @@
 namespace tint::type {
 namespace {
 
-bool IsValidDepthDimension(ast::TextureDimension dim) {
-    return dim == ast::TextureDimension::k2d || dim == ast::TextureDimension::k2dArray ||
-           dim == ast::TextureDimension::kCube || dim == ast::TextureDimension::kCubeArray;
+bool IsValidDepthDimension(TextureDimension dim) {
+    return dim == TextureDimension::k2d || dim == TextureDimension::k2dArray ||
+           dim == TextureDimension::kCube || dim == TextureDimension::kCubeArray;
 }
 
 }  // namespace
 
-DepthTexture::DepthTexture(ast::TextureDimension dim)
+DepthTexture::DepthTexture(TextureDimension dim)
     : Base(utils::Hash(TypeInfo::Of<DepthTexture>().full_hashcode, dim), dim) {
     TINT_ASSERT(Type, IsValidDepthDimension(dim));
 }
diff --git a/src/tint/type/depth_texture.h b/src/tint/type/depth_texture.h
index 21cd780..70a0b73 100644
--- a/src/tint/type/depth_texture.h
+++ b/src/tint/type/depth_texture.h
@@ -18,6 +18,7 @@
 #include <string>
 
 #include "src/tint/type/texture.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::type {
 
@@ -26,7 +27,7 @@
   public:
     /// Constructor
     /// @param dim the dimensionality of the texture
-    explicit DepthTexture(ast::TextureDimension dim);
+    explicit DepthTexture(TextureDimension dim);
 
     /// Destructor
     ~DepthTexture() override;
diff --git a/src/tint/type/depth_texture_test.cc b/src/tint/type/depth_texture_test.cc
index 18dda3d..4ff970a 100644
--- a/src/tint/type/depth_texture_test.cc
+++ b/src/tint/type/depth_texture_test.cc
@@ -18,6 +18,7 @@
 #include "src/tint/type/sampled_texture.h"
 #include "src/tint/type/storage_texture.h"
 #include "src/tint/type/test_helper.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::type {
 namespace {
@@ -25,25 +26,25 @@
 using DepthTextureTest = TestHelper;
 
 TEST_F(DepthTextureTest, Creation) {
-    auto* a = create<DepthTexture>(ast::TextureDimension::k2d);
-    auto* b = create<DepthTexture>(ast::TextureDimension::k2d);
-    auto* c = create<DepthTexture>(ast::TextureDimension::k2dArray);
+    auto* a = create<DepthTexture>(TextureDimension::k2d);
+    auto* b = create<DepthTexture>(TextureDimension::k2d);
+    auto* c = create<DepthTexture>(TextureDimension::k2dArray);
 
     EXPECT_EQ(a, b);
     EXPECT_NE(a, c);
 }
 
 TEST_F(DepthTextureTest, Hash) {
-    auto* a = create<DepthTexture>(ast::TextureDimension::k2d);
-    auto* b = create<DepthTexture>(ast::TextureDimension::k2d);
+    auto* a = create<DepthTexture>(TextureDimension::k2d);
+    auto* b = create<DepthTexture>(TextureDimension::k2d);
 
     EXPECT_EQ(a->unique_hash, b->unique_hash);
 }
 
 TEST_F(DepthTextureTest, Equals) {
-    auto* a = create<DepthTexture>(ast::TextureDimension::k2d);
-    auto* b = create<DepthTexture>(ast::TextureDimension::k2d);
-    auto* c = create<DepthTexture>(ast::TextureDimension::k2dArray);
+    auto* a = create<DepthTexture>(TextureDimension::k2d);
+    auto* b = create<DepthTexture>(TextureDimension::k2d);
+    auto* c = create<DepthTexture>(TextureDimension::k2dArray);
 
     EXPECT_TRUE(a->Equals(*b));
     EXPECT_FALSE(a->Equals(*c));
@@ -51,7 +52,7 @@
 }
 
 TEST_F(DepthTextureTest, IsTexture) {
-    DepthTexture d(ast::TextureDimension::kCube);
+    DepthTexture d(TextureDimension::kCube);
     Texture* ty = &d;
     EXPECT_TRUE(ty->Is<DepthTexture>());
     EXPECT_FALSE(ty->Is<ExternalTexture>());
@@ -60,23 +61,23 @@
 }
 
 TEST_F(DepthTextureTest, Dim) {
-    DepthTexture d(ast::TextureDimension::kCube);
-    EXPECT_EQ(d.dim(), ast::TextureDimension::kCube);
+    DepthTexture d(TextureDimension::kCube);
+    EXPECT_EQ(d.dim(), TextureDimension::kCube);
 }
 
 TEST_F(DepthTextureTest, FriendlyName) {
-    DepthTexture d(ast::TextureDimension::kCube);
+    DepthTexture d(TextureDimension::kCube);
     EXPECT_EQ(d.FriendlyName(Symbols()), "texture_depth_cube");
 }
 
 TEST_F(DepthTextureTest, Clone) {
-    auto* a = create<DepthTexture>(ast::TextureDimension::k2d);
+    auto* a = create<DepthTexture>(TextureDimension::k2d);
 
     type::Manager mgr;
     type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* dt = a->Clone(ctx);
-    EXPECT_EQ(dt->dim(), ast::TextureDimension::k2d);
+    EXPECT_EQ(dt->dim(), TextureDimension::k2d);
 }
 
 }  // namespace
diff --git a/src/tint/type/external_texture.cc b/src/tint/type/external_texture.cc
index 77ac5ba..bfd2edc 100644
--- a/src/tint/type/external_texture.cc
+++ b/src/tint/type/external_texture.cc
@@ -15,6 +15,7 @@
 #include "src/tint/type/external_texture.h"
 
 #include "src/tint/program_builder.h"
+#include "src/tint/type/texture_dimension.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::ExternalTexture);
 
@@ -22,7 +23,7 @@
 
 ExternalTexture::ExternalTexture()
     : Base(static_cast<size_t>(TypeInfo::Of<ExternalTexture>().full_hashcode),
-           ast::TextureDimension::k2d) {}
+           TextureDimension::k2d) {}
 
 ExternalTexture::~ExternalTexture() = default;
 
diff --git a/src/tint/type/external_texture_test.cc b/src/tint/type/external_texture_test.cc
index e9ea95d..0752590 100644
--- a/src/tint/type/external_texture_test.cc
+++ b/src/tint/type/external_texture_test.cc
@@ -19,6 +19,7 @@
 #include "src/tint/type/sampled_texture.h"
 #include "src/tint/type/storage_texture.h"
 #include "src/tint/type/test_helper.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::type {
 namespace {
@@ -58,7 +59,7 @@
 TEST_F(ExternalTextureTest, Dim) {
     F32 f32;
     ExternalTexture s;
-    EXPECT_EQ(s.dim(), ast::TextureDimension::k2d);
+    EXPECT_EQ(s.dim(), TextureDimension::k2d);
 }
 
 TEST_F(ExternalTextureTest, FriendlyName) {
diff --git a/src/tint/type/multisampled_texture.cc b/src/tint/type/multisampled_texture.cc
index 47d3e21..801a891 100644
--- a/src/tint/type/multisampled_texture.cc
+++ b/src/tint/type/multisampled_texture.cc
@@ -15,13 +15,14 @@
 #include "src/tint/type/multisampled_texture.h"
 
 #include "src/tint/program_builder.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/utils/hash.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::MultisampledTexture);
 
 namespace tint::type {
 
-MultisampledTexture::MultisampledTexture(ast::TextureDimension dim, const Type* type)
+MultisampledTexture::MultisampledTexture(TextureDimension dim, const Type* type)
     : Base(utils::Hash(TypeInfo::Of<MultisampledTexture>().full_hashcode, dim, type), dim),
       type_(type) {
     TINT_ASSERT(Type, type_);
diff --git a/src/tint/type/multisampled_texture.h b/src/tint/type/multisampled_texture.h
index 3048590..c5e66d7 100644
--- a/src/tint/type/multisampled_texture.h
+++ b/src/tint/type/multisampled_texture.h
@@ -18,6 +18,7 @@
 #include <string>
 
 #include "src/tint/type/texture.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::type {
 
@@ -27,7 +28,7 @@
     /// Constructor
     /// @param dim the dimensionality of the texture
     /// @param type the data type of the multisampled texture
-    MultisampledTexture(ast::TextureDimension dim, const Type* type);
+    MultisampledTexture(TextureDimension dim, const Type* type);
 
     /// Destructor
     ~MultisampledTexture() override;
diff --git a/src/tint/type/multisampled_texture_test.cc b/src/tint/type/multisampled_texture_test.cc
index b3b671a..1a4c2b0 100644
--- a/src/tint/type/multisampled_texture_test.cc
+++ b/src/tint/type/multisampled_texture_test.cc
@@ -19,6 +19,7 @@
 #include "src/tint/type/sampled_texture.h"
 #include "src/tint/type/storage_texture.h"
 #include "src/tint/type/test_helper.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::type {
 namespace {
@@ -26,26 +27,26 @@
 using MultisampledTextureTest = TestHelper;
 
 TEST_F(MultisampledTextureTest, Creation) {
-    auto* a = create<MultisampledTexture>(ast::TextureDimension::k2d, create<F32>());
-    auto* b = create<MultisampledTexture>(ast::TextureDimension::k2d, create<F32>());
-    auto* c = create<MultisampledTexture>(ast::TextureDimension::k3d, create<F32>());
-    auto* d = create<MultisampledTexture>(ast::TextureDimension::k2d, create<I32>());
+    auto* a = create<MultisampledTexture>(TextureDimension::k2d, create<F32>());
+    auto* b = create<MultisampledTexture>(TextureDimension::k2d, create<F32>());
+    auto* c = create<MultisampledTexture>(TextureDimension::k3d, create<F32>());
+    auto* d = create<MultisampledTexture>(TextureDimension::k2d, create<I32>());
     EXPECT_EQ(a, b);
     EXPECT_NE(a, c);
     EXPECT_NE(a, d);
 }
 
 TEST_F(MultisampledTextureTest, Hash) {
-    auto* a = create<MultisampledTexture>(ast::TextureDimension::k2d, create<F32>());
-    auto* b = create<MultisampledTexture>(ast::TextureDimension::k2d, create<F32>());
+    auto* a = create<MultisampledTexture>(TextureDimension::k2d, create<F32>());
+    auto* b = create<MultisampledTexture>(TextureDimension::k2d, create<F32>());
     EXPECT_EQ(a->unique_hash, b->unique_hash);
 }
 
 TEST_F(MultisampledTextureTest, Equals) {
-    auto* a = create<MultisampledTexture>(ast::TextureDimension::k2d, create<F32>());
-    auto* b = create<MultisampledTexture>(ast::TextureDimension::k2d, create<F32>());
-    auto* c = create<MultisampledTexture>(ast::TextureDimension::k3d, create<F32>());
-    auto* d = create<MultisampledTexture>(ast::TextureDimension::k2d, create<I32>());
+    auto* a = create<MultisampledTexture>(TextureDimension::k2d, create<F32>());
+    auto* b = create<MultisampledTexture>(TextureDimension::k2d, create<F32>());
+    auto* c = create<MultisampledTexture>(TextureDimension::k3d, create<F32>());
+    auto* d = create<MultisampledTexture>(TextureDimension::k2d, create<I32>());
     EXPECT_TRUE(a->Equals(*b));
     EXPECT_FALSE(a->Equals(*c));
     EXPECT_FALSE(a->Equals(*d));
@@ -54,7 +55,7 @@
 
 TEST_F(MultisampledTextureTest, IsTexture) {
     F32 f32;
-    MultisampledTexture s(ast::TextureDimension::kCube, &f32);
+    MultisampledTexture s(TextureDimension::kCube, &f32);
     Texture* ty = &s;
     EXPECT_FALSE(ty->Is<DepthTexture>());
     EXPECT_FALSE(ty->Is<ExternalTexture>());
@@ -65,30 +66,30 @@
 
 TEST_F(MultisampledTextureTest, Dim) {
     F32 f32;
-    MultisampledTexture s(ast::TextureDimension::k3d, &f32);
-    EXPECT_EQ(s.dim(), ast::TextureDimension::k3d);
+    MultisampledTexture s(TextureDimension::k3d, &f32);
+    EXPECT_EQ(s.dim(), TextureDimension::k3d);
 }
 
 TEST_F(MultisampledTextureTest, Type) {
     F32 f32;
-    MultisampledTexture s(ast::TextureDimension::k3d, &f32);
+    MultisampledTexture s(TextureDimension::k3d, &f32);
     EXPECT_EQ(s.type(), &f32);
 }
 
 TEST_F(MultisampledTextureTest, FriendlyName) {
     F32 f32;
-    MultisampledTexture s(ast::TextureDimension::k3d, &f32);
+    MultisampledTexture s(TextureDimension::k3d, &f32);
     EXPECT_EQ(s.FriendlyName(Symbols()), "texture_multisampled_3d<f32>");
 }
 
 TEST_F(MultisampledTextureTest, Clone) {
-    auto* a = create<MultisampledTexture>(ast::TextureDimension::k2d, create<F32>());
+    auto* a = create<MultisampledTexture>(TextureDimension::k2d, create<F32>());
 
     type::Manager mgr;
     type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* mt = a->Clone(ctx);
-    EXPECT_EQ(mt->dim(), ast::TextureDimension::k2d);
+    EXPECT_EQ(mt->dim(), TextureDimension::k2d);
     EXPECT_TRUE(mt->type()->Is<F32>());
 }
 
diff --git a/src/tint/type/sampled_texture.cc b/src/tint/type/sampled_texture.cc
index 7651b410..323aaa4 100644
--- a/src/tint/type/sampled_texture.cc
+++ b/src/tint/type/sampled_texture.cc
@@ -15,13 +15,14 @@
 #include "src/tint/type/sampled_texture.h"
 
 #include "src/tint/program_builder.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/utils/hash.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::SampledTexture);
 
 namespace tint::type {
 
-SampledTexture::SampledTexture(ast::TextureDimension dim, const Type* type)
+SampledTexture::SampledTexture(TextureDimension dim, const Type* type)
     : Base(utils::Hash(TypeInfo::Of<SampledTexture>().full_hashcode, dim, type), dim), type_(type) {
     TINT_ASSERT(Type, type_);
 }
diff --git a/src/tint/type/sampled_texture.h b/src/tint/type/sampled_texture.h
index 1f37790..1a83165 100644
--- a/src/tint/type/sampled_texture.h
+++ b/src/tint/type/sampled_texture.h
@@ -18,6 +18,7 @@
 #include <string>
 
 #include "src/tint/type/texture.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::type {
 
@@ -27,7 +28,7 @@
     /// Constructor
     /// @param dim the dimensionality of the texture
     /// @param type the data type of the sampled texture
-    SampledTexture(ast::TextureDimension dim, const Type* type);
+    SampledTexture(TextureDimension dim, const Type* type);
 
     /// Destructor
     ~SampledTexture() override;
diff --git a/src/tint/type/sampled_texture_test.cc b/src/tint/type/sampled_texture_test.cc
index 78ab2d3..2363541 100644
--- a/src/tint/type/sampled_texture_test.cc
+++ b/src/tint/type/sampled_texture_test.cc
@@ -18,6 +18,7 @@
 #include "src/tint/type/external_texture.h"
 #include "src/tint/type/storage_texture.h"
 #include "src/tint/type/test_helper.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::type {
 namespace {
@@ -25,13 +26,13 @@
 using SampledTextureTest = TestHelper;
 
 TEST_F(SampledTextureTest, Creation) {
-    auto* a = create<SampledTexture>(ast::TextureDimension::kCube, create<F32>());
-    auto* b = create<SampledTexture>(ast::TextureDimension::kCube, create<F32>());
-    auto* c = create<SampledTexture>(ast::TextureDimension::k2d, create<F32>());
-    auto* d = create<SampledTexture>(ast::TextureDimension::kCube, create<I32>());
+    auto* a = create<SampledTexture>(TextureDimension::kCube, create<F32>());
+    auto* b = create<SampledTexture>(TextureDimension::kCube, create<F32>());
+    auto* c = create<SampledTexture>(TextureDimension::k2d, create<F32>());
+    auto* d = create<SampledTexture>(TextureDimension::kCube, create<I32>());
 
     EXPECT_TRUE(a->type()->Is<F32>());
-    EXPECT_EQ(a->dim(), ast::TextureDimension::kCube);
+    EXPECT_EQ(a->dim(), TextureDimension::kCube);
 
     EXPECT_EQ(a, b);
     EXPECT_NE(a, c);
@@ -39,17 +40,17 @@
 }
 
 TEST_F(SampledTextureTest, Hash) {
-    auto* a = create<SampledTexture>(ast::TextureDimension::kCube, create<F32>());
-    auto* b = create<SampledTexture>(ast::TextureDimension::kCube, create<F32>());
+    auto* a = create<SampledTexture>(TextureDimension::kCube, create<F32>());
+    auto* b = create<SampledTexture>(TextureDimension::kCube, create<F32>());
 
     EXPECT_EQ(a->unique_hash, b->unique_hash);
 }
 
 TEST_F(SampledTextureTest, Equals) {
-    auto* a = create<SampledTexture>(ast::TextureDimension::kCube, create<F32>());
-    auto* b = create<SampledTexture>(ast::TextureDimension::kCube, create<F32>());
-    auto* c = create<SampledTexture>(ast::TextureDimension::k2d, create<F32>());
-    auto* d = create<SampledTexture>(ast::TextureDimension::kCube, create<I32>());
+    auto* a = create<SampledTexture>(TextureDimension::kCube, create<F32>());
+    auto* b = create<SampledTexture>(TextureDimension::kCube, create<F32>());
+    auto* c = create<SampledTexture>(TextureDimension::k2d, create<F32>());
+    auto* d = create<SampledTexture>(TextureDimension::kCube, create<I32>());
 
     EXPECT_TRUE(a->Equals(*b));
     EXPECT_FALSE(a->Equals(*c));
@@ -59,7 +60,7 @@
 
 TEST_F(SampledTextureTest, IsTexture) {
     F32 f32;
-    SampledTexture s(ast::TextureDimension::kCube, &f32);
+    SampledTexture s(TextureDimension::kCube, &f32);
     Texture* ty = &s;
     EXPECT_FALSE(ty->Is<DepthTexture>());
     EXPECT_FALSE(ty->Is<ExternalTexture>());
@@ -69,30 +70,30 @@
 
 TEST_F(SampledTextureTest, Dim) {
     F32 f32;
-    SampledTexture s(ast::TextureDimension::k3d, &f32);
-    EXPECT_EQ(s.dim(), ast::TextureDimension::k3d);
+    SampledTexture s(TextureDimension::k3d, &f32);
+    EXPECT_EQ(s.dim(), TextureDimension::k3d);
 }
 
 TEST_F(SampledTextureTest, Type) {
     F32 f32;
-    SampledTexture s(ast::TextureDimension::k3d, &f32);
+    SampledTexture s(TextureDimension::k3d, &f32);
     EXPECT_EQ(s.type(), &f32);
 }
 
 TEST_F(SampledTextureTest, FriendlyName) {
     F32 f32;
-    SampledTexture s(ast::TextureDimension::k3d, &f32);
+    SampledTexture s(TextureDimension::k3d, &f32);
     EXPECT_EQ(s.FriendlyName(Symbols()), "texture_3d<f32>");
 }
 
 TEST_F(SampledTextureTest, Clone) {
-    auto* a = create<SampledTexture>(ast::TextureDimension::kCube, create<F32>());
+    auto* a = create<SampledTexture>(TextureDimension::kCube, create<F32>());
 
     type::Manager mgr;
     type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* mt = a->Clone(ctx);
-    EXPECT_EQ(mt->dim(), ast::TextureDimension::kCube);
+    EXPECT_EQ(mt->dim(), TextureDimension::kCube);
     EXPECT_TRUE(mt->type()->Is<F32>());
 }
 
diff --git a/src/tint/type/storage_texture.cc b/src/tint/type/storage_texture.cc
index a47b094..3742681 100644
--- a/src/tint/type/storage_texture.cc
+++ b/src/tint/type/storage_texture.cc
@@ -21,7 +21,7 @@
 
 namespace tint::type {
 
-StorageTexture::StorageTexture(ast::TextureDimension dim,
+StorageTexture::StorageTexture(TextureDimension dim,
                                ast::TexelFormat format,
                                ast::Access access,
                                Type* subtype)
diff --git a/src/tint/type/storage_texture.h b/src/tint/type/storage_texture.h
index 276e045..5c07bf9 100644
--- a/src/tint/type/storage_texture.h
+++ b/src/tint/type/storage_texture.h
@@ -20,6 +20,7 @@
 #include "src/tint/ast/access.h"
 #include "src/tint/ast/storage_texture.h"
 #include "src/tint/type/texture.h"
+#include "src/tint/type/texture_dimension.h"
 
 // Forward declarations
 namespace tint::type {
@@ -36,7 +37,7 @@
     /// @param format the texel format of the texture
     /// @param access the access control type of the texture
     /// @param subtype the storage subtype. Use SubtypeFor() to calculate this.
-    StorageTexture(ast::TextureDimension dim,
+    StorageTexture(TextureDimension dim,
                    ast::TexelFormat format,
                    ast::Access access,
                    Type* subtype);
diff --git a/src/tint/type/storage_texture_test.cc b/src/tint/type/storage_texture_test.cc
index ad8a975..96d5d19 100644
--- a/src/tint/type/storage_texture_test.cc
+++ b/src/tint/type/storage_texture_test.cc
@@ -18,31 +18,30 @@
 #include "src/tint/type/external_texture.h"
 #include "src/tint/type/sampled_texture.h"
 #include "src/tint/type/test_helper.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::type {
 namespace {
 
 struct StorageTextureTest : public TestHelper {
-    StorageTexture* Create(ast::TextureDimension dims, ast::TexelFormat fmt, ast::Access access) {
+    StorageTexture* Create(TextureDimension dims, ast::TexelFormat fmt, ast::Access access) {
         auto* subtype = StorageTexture::SubtypeFor(fmt, Types());
         return create<StorageTexture>(dims, fmt, access, subtype);
     }
 };
 
 TEST_F(StorageTextureTest, Creation) {
-    auto* a = Create(ast::TextureDimension::kCube, ast::TexelFormat::kRgba32Float,
-                     ast::Access::kReadWrite);
-    auto* b = Create(ast::TextureDimension::kCube, ast::TexelFormat::kRgba32Float,
-                     ast::Access::kReadWrite);
+    auto* a =
+        Create(TextureDimension::kCube, ast::TexelFormat::kRgba32Float, ast::Access::kReadWrite);
+    auto* b =
+        Create(TextureDimension::kCube, ast::TexelFormat::kRgba32Float, ast::Access::kReadWrite);
     auto* c =
-        Create(ast::TextureDimension::k2d, ast::TexelFormat::kRgba32Float, ast::Access::kReadWrite);
-    auto* d =
-        Create(ast::TextureDimension::kCube, ast::TexelFormat::kR32Float, ast::Access::kReadWrite);
-    auto* e =
-        Create(ast::TextureDimension::kCube, ast::TexelFormat::kRgba32Float, ast::Access::kRead);
+        Create(TextureDimension::k2d, ast::TexelFormat::kRgba32Float, ast::Access::kReadWrite);
+    auto* d = Create(TextureDimension::kCube, ast::TexelFormat::kR32Float, ast::Access::kReadWrite);
+    auto* e = Create(TextureDimension::kCube, ast::TexelFormat::kRgba32Float, ast::Access::kRead);
 
     EXPECT_TRUE(a->type()->Is<F32>());
-    EXPECT_EQ(a->dim(), ast::TextureDimension::kCube);
+    EXPECT_EQ(a->dim(), TextureDimension::kCube);
 
     EXPECT_EQ(a, b);
     EXPECT_NE(a, c);
@@ -51,25 +50,23 @@
 }
 
 TEST_F(StorageTextureTest, Hash) {
-    auto* a = Create(ast::TextureDimension::kCube, ast::TexelFormat::kRgba32Float,
-                     ast::Access::kReadWrite);
-    auto* b = Create(ast::TextureDimension::kCube, ast::TexelFormat::kRgba32Float,
-                     ast::Access::kReadWrite);
+    auto* a =
+        Create(TextureDimension::kCube, ast::TexelFormat::kRgba32Float, ast::Access::kReadWrite);
+    auto* b =
+        Create(TextureDimension::kCube, ast::TexelFormat::kRgba32Float, ast::Access::kReadWrite);
 
     EXPECT_EQ(a->unique_hash, b->unique_hash);
 }
 
 TEST_F(StorageTextureTest, Equals) {
-    auto* a = Create(ast::TextureDimension::kCube, ast::TexelFormat::kRgba32Float,
-                     ast::Access::kReadWrite);
-    auto* b = Create(ast::TextureDimension::kCube, ast::TexelFormat::kRgba32Float,
-                     ast::Access::kReadWrite);
+    auto* a =
+        Create(TextureDimension::kCube, ast::TexelFormat::kRgba32Float, ast::Access::kReadWrite);
+    auto* b =
+        Create(TextureDimension::kCube, ast::TexelFormat::kRgba32Float, ast::Access::kReadWrite);
     auto* c =
-        Create(ast::TextureDimension::k2d, ast::TexelFormat::kRgba32Float, ast::Access::kReadWrite);
-    auto* d =
-        Create(ast::TextureDimension::kCube, ast::TexelFormat::kR32Float, ast::Access::kReadWrite);
-    auto* e =
-        Create(ast::TextureDimension::kCube, ast::TexelFormat::kRgba32Float, ast::Access::kRead);
+        Create(TextureDimension::k2d, ast::TexelFormat::kRgba32Float, ast::Access::kReadWrite);
+    auto* d = Create(TextureDimension::kCube, ast::TexelFormat::kR32Float, ast::Access::kReadWrite);
+    auto* e = Create(TextureDimension::kCube, ast::TexelFormat::kRgba32Float, ast::Access::kRead);
 
     EXPECT_TRUE(a->Equals(*b));
     EXPECT_FALSE(a->Equals(*c));
@@ -79,26 +76,26 @@
 }
 
 TEST_F(StorageTextureTest, Dim) {
-    auto* s = Create(ast::TextureDimension::k2dArray, ast::TexelFormat::kRgba32Float,
-                     ast::Access::kReadWrite);
-    EXPECT_EQ(s->dim(), ast::TextureDimension::k2dArray);
+    auto* s =
+        Create(TextureDimension::k2dArray, ast::TexelFormat::kRgba32Float, ast::Access::kReadWrite);
+    EXPECT_EQ(s->dim(), TextureDimension::k2dArray);
 }
 
 TEST_F(StorageTextureTest, Format) {
-    auto* s = Create(ast::TextureDimension::k2dArray, ast::TexelFormat::kRgba32Float,
-                     ast::Access::kReadWrite);
+    auto* s =
+        Create(TextureDimension::k2dArray, ast::TexelFormat::kRgba32Float, ast::Access::kReadWrite);
     EXPECT_EQ(s->texel_format(), ast::TexelFormat::kRgba32Float);
 }
 
 TEST_F(StorageTextureTest, FriendlyName) {
-    auto* s = Create(ast::TextureDimension::k2dArray, ast::TexelFormat::kRgba32Float,
-                     ast::Access::kReadWrite);
+    auto* s =
+        Create(TextureDimension::k2dArray, ast::TexelFormat::kRgba32Float, ast::Access::kReadWrite);
     EXPECT_EQ(s->FriendlyName(Symbols()), "texture_storage_2d_array<rgba32float, read_write>");
 }
 
 TEST_F(StorageTextureTest, F32) {
-    Type* s = Create(ast::TextureDimension::k2dArray, ast::TexelFormat::kRgba32Float,
-                     ast::Access::kReadWrite);
+    Type* s =
+        Create(TextureDimension::k2dArray, ast::TexelFormat::kRgba32Float, ast::Access::kReadWrite);
 
     auto program = Build();
 
@@ -110,7 +107,7 @@
 
 TEST_F(StorageTextureTest, U32) {
     auto* subtype = StorageTexture::SubtypeFor(ast::TexelFormat::kRg32Uint, Types());
-    Type* s = create<StorageTexture>(ast::TextureDimension::k2dArray, ast::TexelFormat::kRg32Uint,
+    Type* s = create<StorageTexture>(TextureDimension::k2dArray, ast::TexelFormat::kRg32Uint,
                                      ast::Access::kReadWrite, subtype);
 
     auto program = Build();
@@ -123,7 +120,7 @@
 
 TEST_F(StorageTextureTest, I32) {
     auto* subtype = StorageTexture::SubtypeFor(ast::TexelFormat::kRgba32Sint, Types());
-    Type* s = create<StorageTexture>(ast::TextureDimension::k2dArray, ast::TexelFormat::kRgba32Sint,
+    Type* s = create<StorageTexture>(TextureDimension::k2dArray, ast::TexelFormat::kRgba32Sint,
                                      ast::Access::kReadWrite, subtype);
 
     auto program = Build();
@@ -135,14 +132,14 @@
 }
 
 TEST_F(StorageTextureTest, Clone) {
-    auto* a = Create(ast::TextureDimension::kCube, ast::TexelFormat::kRgba32Float,
-                     ast::Access::kReadWrite);
+    auto* a =
+        Create(TextureDimension::kCube, ast::TexelFormat::kRgba32Float, ast::Access::kReadWrite);
 
     type::Manager mgr;
     type::CloneContext ctx{{nullptr}, {nullptr, &mgr}};
 
     auto* mt = a->Clone(ctx);
-    EXPECT_EQ(mt->dim(), ast::TextureDimension::kCube);
+    EXPECT_EQ(mt->dim(), TextureDimension::kCube);
     EXPECT_EQ(mt->texel_format(), ast::TexelFormat::kRgba32Float);
     EXPECT_TRUE(mt->type()->Is<F32>());
 }
diff --git a/src/tint/type/texture.cc b/src/tint/type/texture.cc
index 57ce265..717d63ae5 100644
--- a/src/tint/type/texture.cc
+++ b/src/tint/type/texture.cc
@@ -18,7 +18,7 @@
 
 namespace tint::type {
 
-Texture::Texture(size_t hash, ast::TextureDimension dim) : Base(hash, type::Flags{}), dim_(dim) {}
+Texture::Texture(size_t hash, TextureDimension dim) : Base(hash, type::Flags{}), dim_(dim) {}
 
 Texture::~Texture() = default;
 
diff --git a/src/tint/type/texture.h b/src/tint/type/texture.h
index fc0f72d..3205fd1 100644
--- a/src/tint/type/texture.h
+++ b/src/tint/type/texture.h
@@ -16,6 +16,7 @@
 #define SRC_TINT_TYPE_TEXTURE_H_
 
 #include "src/tint/ast/texture.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/type/type.h"
 
 namespace tint::type {
@@ -26,15 +27,15 @@
     /// Constructor
     /// @param hash the unique hash of the node
     /// @param dim the dimensionality of the texture
-    Texture(size_t hash, ast::TextureDimension dim);
+    Texture(size_t hash, TextureDimension dim);
     /// Destructor
     ~Texture() override;
 
     /// @returns the texture dimension
-    ast::TextureDimension dim() const { return dim_; }
+    TextureDimension dim() const { return dim_; }
 
   private:
-    ast::TextureDimension const dim_;
+    TextureDimension const dim_;
 };
 
 }  // namespace tint::type
diff --git a/src/tint/type/texture_dimension.cc b/src/tint/type/texture_dimension.cc
new file mode 100644
index 0000000..4b4fea9
--- /dev/null
+++ b/src/tint/type/texture_dimension.cc
@@ -0,0 +1,46 @@
+// Copyright 2023 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "src/tint/type/texture_dimension.h"
+
+namespace tint::type {
+
+std::ostream& operator<<(std::ostream& out, type::TextureDimension dim) {
+    switch (dim) {
+        case type::TextureDimension::kNone:
+            out << "None";
+            break;
+        case type::TextureDimension::k1d:
+            out << "1d";
+            break;
+        case type::TextureDimension::k2d:
+            out << "2d";
+            break;
+        case type::TextureDimension::k2dArray:
+            out << "2d_array";
+            break;
+        case type::TextureDimension::k3d:
+            out << "3d";
+            break;
+        case type::TextureDimension::kCube:
+            out << "cube";
+            break;
+        case type::TextureDimension::kCubeArray:
+            out << "cube_array";
+            break;
+    }
+    return out;
+}
+
+}  // namespace tint::type
diff --git a/src/tint/type/texture_dimension.h b/src/tint/type/texture_dimension.h
new file mode 100644
index 0000000..0da2b05
--- /dev/null
+++ b/src/tint/type/texture_dimension.h
@@ -0,0 +1,47 @@
+// Copyright 2023 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef SRC_TINT_TYPE_TEXTURE_DIMENSION_H_
+#define SRC_TINT_TYPE_TEXTURE_DIMENSION_H_
+
+#include <ostream>
+
+namespace tint::type {
+
+/// The dimensionality of the texture
+enum class TextureDimension {
+    /// Invalid texture
+    kNone = -1,
+    /// 1 dimensional texture
+    k1d,
+    /// 2 dimensional texture
+    k2d,
+    /// 2 dimensional array texture
+    k2dArray,
+    /// 3 dimensional texture
+    k3d,
+    /// cube texture
+    kCube,
+    /// cube array texture
+    kCubeArray,
+};
+
+/// @param out the std::ostream to write to
+/// @param dim the type::TextureDimension
+/// @return the std::ostream so calls can be chained
+std::ostream& operator<<(std::ostream& out, type::TextureDimension dim);
+
+}  // namespace tint::type
+
+#endif  // SRC_TINT_TYPE_TEXTURE_DIMENSION_H_
diff --git a/src/tint/type/texture_test.cc b/src/tint/type/texture_test.cc
index ae223a1..607fd4a 100644
--- a/src/tint/type/texture_test.cc
+++ b/src/tint/type/texture_test.cc
@@ -20,7 +20,7 @@
 namespace tint::type {
 namespace {
 
-using TextureTypeDimTest = TestParamHelper<ast::TextureDimension>;
+using TextureTypeDimTest = TestParamHelper<TextureDimension>;
 
 TEST_P(TextureTypeDimTest, DimMustMatch) {
     // Check that the dim() query returns the right dimensionality.
@@ -33,12 +33,12 @@
 
 INSTANTIATE_TEST_SUITE_P(Dimensions,
                          TextureTypeDimTest,
-                         ::testing::Values(ast::TextureDimension::k1d,
-                                           ast::TextureDimension::k2d,
-                                           ast::TextureDimension::k2dArray,
-                                           ast::TextureDimension::k3d,
-                                           ast::TextureDimension::kCube,
-                                           ast::TextureDimension::kCubeArray));
+                         ::testing::Values(TextureDimension::k1d,
+                                           TextureDimension::k2d,
+                                           TextureDimension::k2dArray,
+                                           TextureDimension::k3d,
+                                           TextureDimension::kCube,
+                                           TextureDimension::kCubeArray));
 
 }  // namespace
 }  // namespace tint::type
diff --git a/src/tint/writer/flatten_bindings_test.cc b/src/tint/writer/flatten_bindings_test.cc
index 48d765f..ed929c5 100644
--- a/src/tint/writer/flatten_bindings_test.cc
+++ b/src/tint/writer/flatten_bindings_test.cc
@@ -19,6 +19,7 @@
 #include "gtest/gtest.h"
 #include "src/tint/program_builder.h"
 #include "src/tint/sem/variable.h"
+#include "src/tint/type/texture_dimension.h"
 
 namespace tint::writer {
 namespace {
@@ -95,17 +96,17 @@
                 b.Binding(4_a));
 
     const size_t num_textures = 6;
-    b.GlobalVar("texture1", b.ty.sampled_texture(ast::TextureDimension::k2d, b.ty.f32()),
+    b.GlobalVar("texture1", b.ty.sampled_texture(type::TextureDimension::k2d, b.ty.f32()),
                 b.Group(5_a), b.Binding(5_a));
-    b.GlobalVar("texture2", b.ty.multisampled_texture(ast::TextureDimension::k2d, b.ty.f32()),
+    b.GlobalVar("texture2", b.ty.multisampled_texture(type::TextureDimension::k2d, b.ty.f32()),
                 b.Group(6_a), b.Binding(6_a));
     b.GlobalVar("texture3",
-                b.ty.storage_texture(ast::TextureDimension::k2d, ast::TexelFormat::kR32Float,
+                b.ty.storage_texture(type::TextureDimension::k2d, ast::TexelFormat::kR32Float,
                                      ast::Access::kWrite),
                 b.Group(7_a), b.Binding(7_a));
-    b.GlobalVar("texture4", b.ty.depth_texture(ast::TextureDimension::k2d), b.Group(8_a),
+    b.GlobalVar("texture4", b.ty.depth_texture(type::TextureDimension::k2d), b.Group(8_a),
                 b.Binding(8_a));
-    b.GlobalVar("texture5", b.ty.depth_multisampled_texture(ast::TextureDimension::k2d),
+    b.GlobalVar("texture5", b.ty.depth_multisampled_texture(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/writer/glsl/generator_impl.cc b/src/tint/writer/glsl/generator_impl.cc
index 720423c..2bd041d 100644
--- a/src/tint/writer/glsl/generator_impl.cc
+++ b/src/tint/writer/glsl/generator_impl.cc
@@ -70,6 +70,7 @@
 #include "src/tint/type/multisampled_texture.h"
 #include "src/tint/type/sampled_texture.h"
 #include "src/tint/type/storage_texture.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/utils/defer.h"
 #include "src/tint/utils/map.h"
 #include "src/tint/utils/scoped_assignment.h"
@@ -1406,8 +1407,8 @@
             out << ")";
             // textureSize() on array samplers returns the array size in the
             // final component, so strip it out.
-            if (texture_type->dim() == ast::TextureDimension::k2dArray ||
-                texture_type->dim() == ast::TextureDimension::kCubeArray) {
+            if (texture_type->dim() == type::TextureDimension::k2dArray ||
+                texture_type->dim() == type::TextureDimension::kCubeArray) {
                 out << ".xy";
             }
             return true;
@@ -1548,7 +1549,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() == ast::TextureDimension::kCubeArray) {
+    if (texture_type->dim() == type::TextureDimension::kCubeArray) {
         append_depth_ref_to_coords = false;
     }
 
@@ -2949,22 +2950,22 @@
         out << (storage ? "image" : "sampler");
 
         switch (tex->dim()) {
-            case ast::TextureDimension::k1d:
+            case type::TextureDimension::k1d:
                 out << "1D";
                 break;
-            case ast::TextureDimension::k2d:
+            case type::TextureDimension::k2d:
                 out << ((ms || depth_ms) ? "2DMS" : "2D");
                 break;
-            case ast::TextureDimension::k2dArray:
+            case type::TextureDimension::k2dArray:
                 out << ((ms || depth_ms) ? "2DMSArray" : "2DArray");
                 break;
-            case ast::TextureDimension::k3d:
+            case type::TextureDimension::k3d:
                 out << "3D";
                 break;
-            case ast::TextureDimension::kCube:
+            case type::TextureDimension::kCube:
                 out << "Cube";
                 break;
-            case ast::TextureDimension::kCubeArray:
+            case type::TextureDimension::kCubeArray:
                 out << "CubeArray";
                 break;
             default:
diff --git a/src/tint/writer/glsl/generator_impl_type_test.cc b/src/tint/writer/glsl/generator_impl_type_test.cc
index 9212dbf..fc5b0ce 100644
--- a/src/tint/writer/glsl/generator_impl_type_test.cc
+++ b/src/tint/writer/glsl/generator_impl_type_test.cc
@@ -20,6 +20,7 @@
 #include "src/tint/type/sampled_texture.h"
 #include "src/tint/type/sampler.h"
 #include "src/tint/type/storage_texture.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/writer/glsl/test_helper.h"
 
 using ::testing::HasSubstr;
@@ -299,7 +300,7 @@
 }
 
 struct GlslDepthTextureData {
-    ast::TextureDimension dim;
+    type::TextureDimension dim;
     std::string result;
 };
 inline std::ostream& operator<<(std::ostream& out, GlslDepthTextureData data) {
@@ -331,14 +332,14 @@
     GlslGeneratorImplTest_Type,
     GlslDepthTexturesTest,
     testing::Values(
-        GlslDepthTextureData{ast::TextureDimension::k2d, "sampler2DShadow tex;"},
-        GlslDepthTextureData{ast::TextureDimension::k2dArray, "sampler2DArrayShadow tex;"},
-        GlslDepthTextureData{ast::TextureDimension::kCube, "samplerCubeShadow tex;"},
-        GlslDepthTextureData{ast::TextureDimension::kCubeArray, "samplerCubeArrayShadow tex;"}));
+        GlslDepthTextureData{type::TextureDimension::k2d, "sampler2DShadow tex;"},
+        GlslDepthTextureData{type::TextureDimension::k2dArray, "sampler2DArrayShadow tex;"},
+        GlslDepthTextureData{type::TextureDimension::kCube, "samplerCubeShadow tex;"},
+        GlslDepthTextureData{type::TextureDimension::kCubeArray, "samplerCubeArrayShadow tex;"}));
 
 using GlslDepthMultisampledTexturesTest = TestHelper;
 TEST_F(GlslDepthMultisampledTexturesTest, Emit) {
-    auto* t = ty.depth_multisampled_texture(ast::TextureDimension::k2d);
+    auto* t = ty.depth_multisampled_texture(type::TextureDimension::k2d);
 
     GlobalVar("tex", t, Binding(1_a), Group(2_a));
 
@@ -358,7 +359,7 @@
 
 enum class TextureDataType { F32, U32, I32 };
 struct GlslSampledTextureData {
-    ast::TextureDimension dim;
+    type::TextureDimension dim;
     TextureDataType datatype;
     std::string result;
 };
@@ -403,99 +404,99 @@
                          GlslSampledTexturesTest,
                          testing::Values(
                              GlslSampledTextureData{
-                                 ast::TextureDimension::k1d,
+                                 type::TextureDimension::k1d,
                                  TextureDataType::F32,
                                  "sampler1D tex;",
                              },
                              GlslSampledTextureData{
-                                 ast::TextureDimension::k2d,
+                                 type::TextureDimension::k2d,
                                  TextureDataType::F32,
                                  "sampler2D tex;",
                              },
                              GlslSampledTextureData{
-                                 ast::TextureDimension::k2dArray,
+                                 type::TextureDimension::k2dArray,
                                  TextureDataType::F32,
                                  "sampler2DArray tex;",
                              },
                              GlslSampledTextureData{
-                                 ast::TextureDimension::k3d,
+                                 type::TextureDimension::k3d,
                                  TextureDataType::F32,
                                  "sampler3D tex;",
                              },
                              GlslSampledTextureData{
-                                 ast::TextureDimension::kCube,
+                                 type::TextureDimension::kCube,
                                  TextureDataType::F32,
                                  "samplerCube tex;",
                              },
                              GlslSampledTextureData{
-                                 ast::TextureDimension::kCubeArray,
+                                 type::TextureDimension::kCubeArray,
                                  TextureDataType::F32,
                                  "samplerCubeArray tex;",
                              },
                              GlslSampledTextureData{
-                                 ast::TextureDimension::k1d,
+                                 type::TextureDimension::k1d,
                                  TextureDataType::U32,
                                  "usampler1D tex;",
                              },
                              GlslSampledTextureData{
-                                 ast::TextureDimension::k2d,
+                                 type::TextureDimension::k2d,
                                  TextureDataType::U32,
                                  "usampler2D tex;",
                              },
                              GlslSampledTextureData{
-                                 ast::TextureDimension::k2dArray,
+                                 type::TextureDimension::k2dArray,
                                  TextureDataType::U32,
                                  "usampler2DArray tex;",
                              },
                              GlslSampledTextureData{
-                                 ast::TextureDimension::k3d,
+                                 type::TextureDimension::k3d,
                                  TextureDataType::U32,
                                  "usampler3D tex;",
                              },
                              GlslSampledTextureData{
-                                 ast::TextureDimension::kCube,
+                                 type::TextureDimension::kCube,
                                  TextureDataType::U32,
                                  "usamplerCube tex;",
                              },
                              GlslSampledTextureData{
-                                 ast::TextureDimension::kCubeArray,
+                                 type::TextureDimension::kCubeArray,
                                  TextureDataType::U32,
                                  "usamplerCubeArray tex;",
                              },
                              GlslSampledTextureData{
-                                 ast::TextureDimension::k1d,
+                                 type::TextureDimension::k1d,
                                  TextureDataType::I32,
                                  "isampler1D tex;",
                              },
                              GlslSampledTextureData{
-                                 ast::TextureDimension::k2d,
+                                 type::TextureDimension::k2d,
                                  TextureDataType::I32,
                                  "isampler2D tex;",
                              },
                              GlslSampledTextureData{
-                                 ast::TextureDimension::k2dArray,
+                                 type::TextureDimension::k2dArray,
                                  TextureDataType::I32,
                                  "isampler2DArray tex;",
                              },
                              GlslSampledTextureData{
-                                 ast::TextureDimension::k3d,
+                                 type::TextureDimension::k3d,
                                  TextureDataType::I32,
                                  "isampler3D tex;",
                              },
                              GlslSampledTextureData{
-                                 ast::TextureDimension::kCube,
+                                 type::TextureDimension::kCube,
                                  TextureDataType::I32,
                                  "isamplerCube tex;",
                              },
                              GlslSampledTextureData{
-                                 ast::TextureDimension::kCubeArray,
+                                 type::TextureDimension::kCubeArray,
                                  TextureDataType::I32,
                                  "isamplerCubeArray tex;",
                              }));
 
 TEST_F(GlslGeneratorImplTest_Type, EmitMultisampledTexture) {
     auto* f32 = create<type::F32>();
-    auto* s = create<type::MultisampledTexture>(ast::TextureDimension::k2d, f32);
+    auto* s = create<type::MultisampledTexture>(type::TextureDimension::k2d, f32);
 
     GeneratorImpl& gen = Build();
 
@@ -506,7 +507,7 @@
 }
 
 struct GlslStorageTextureData {
-    ast::TextureDimension dim;
+    type::TextureDimension dim;
     ast::TexelFormat imgfmt;
     std::string result;
 };
@@ -537,31 +538,31 @@
 INSTANTIATE_TEST_SUITE_P(
     GlslGeneratorImplTest_Type,
     GlslStorageTexturesTest,
-    testing::Values(GlslStorageTextureData{ast::TextureDimension::k1d,
+    testing::Values(GlslStorageTextureData{type::TextureDimension::k1d,
                                            ast::TexelFormat::kRgba8Unorm, "image1D tex;"},
-                    GlslStorageTextureData{ast::TextureDimension::k2d,
+                    GlslStorageTextureData{type::TextureDimension::k2d,
                                            ast::TexelFormat::kRgba16Float, "image2D tex;"},
-                    GlslStorageTextureData{ast::TextureDimension::k2dArray,
+                    GlslStorageTextureData{type::TextureDimension::k2dArray,
                                            ast::TexelFormat::kR32Float, "image2DArray tex;"},
-                    GlslStorageTextureData{ast::TextureDimension::k3d, ast::TexelFormat::kRg32Float,
-                                           "image3D tex;"},
-                    GlslStorageTextureData{ast::TextureDimension::k1d,
+                    GlslStorageTextureData{type::TextureDimension::k3d,
+                                           ast::TexelFormat::kRg32Float, "image3D tex;"},
+                    GlslStorageTextureData{type::TextureDimension::k1d,
                                            ast::TexelFormat::kRgba32Float, "image1D tex;"},
-                    GlslStorageTextureData{ast::TextureDimension::k2d,
+                    GlslStorageTextureData{type::TextureDimension::k2d,
                                            ast::TexelFormat::kRgba16Uint, "image2D tex;"},
-                    GlslStorageTextureData{ast::TextureDimension::k2dArray,
+                    GlslStorageTextureData{type::TextureDimension::k2dArray,
                                            ast::TexelFormat::kR32Uint, "image2DArray tex;"},
-                    GlslStorageTextureData{ast::TextureDimension::k3d, ast::TexelFormat::kRg32Uint,
+                    GlslStorageTextureData{type::TextureDimension::k3d, ast::TexelFormat::kRg32Uint,
                                            "image3D tex;"},
-                    GlslStorageTextureData{ast::TextureDimension::k1d,
+                    GlslStorageTextureData{type::TextureDimension::k1d,
                                            ast::TexelFormat::kRgba32Uint, "image1D tex;"},
-                    GlslStorageTextureData{ast::TextureDimension::k2d,
+                    GlslStorageTextureData{type::TextureDimension::k2d,
                                            ast::TexelFormat::kRgba16Sint, "image2D tex;"},
-                    GlslStorageTextureData{ast::TextureDimension::k2dArray,
+                    GlslStorageTextureData{type::TextureDimension::k2dArray,
                                            ast::TexelFormat::kR32Sint, "image2DArray tex;"},
-                    GlslStorageTextureData{ast::TextureDimension::k3d, ast::TexelFormat::kRg32Sint,
+                    GlslStorageTextureData{type::TextureDimension::k3d, ast::TexelFormat::kRg32Sint,
                                            "image3D tex;"},
-                    GlslStorageTextureData{ast::TextureDimension::k1d,
+                    GlslStorageTextureData{type::TextureDimension::k1d,
                                            ast::TexelFormat::kRgba32Sint, "image1D tex;"}));
 
 }  // namespace
diff --git a/src/tint/writer/hlsl/generator_impl.cc b/src/tint/writer/hlsl/generator_impl.cc
index 3bac389..f2b525e 100644
--- a/src/tint/writer/hlsl/generator_impl.cc
+++ b/src/tint/writer/hlsl/generator_impl.cc
@@ -69,6 +69,7 @@
 #include "src/tint/type/multisampled_texture.h"
 #include "src/tint/type/sampled_texture.h"
 #include "src/tint/type/storage_texture.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/utils/compiler_macros.h"
 #include "src/tint/utils/defer.h"
 #include "src/tint/utils/map.h"
@@ -2312,27 +2313,27 @@
             switch (builtin->Type()) {
                 case sem::BuiltinType::kTextureDimensions:
                     switch (texture_type->dim()) {
-                        case ast::TextureDimension::kNone:
+                        case type::TextureDimension::kNone:
                             TINT_ICE(Writer, diagnostics_) << "texture dimension is kNone";
                             return false;
-                        case ast::TextureDimension::k1d:
+                        case type::TextureDimension::k1d:
                             num_dimensions = 1;
                             break;
-                        case ast::TextureDimension::k2d:
+                        case type::TextureDimension::k2d:
                             num_dimensions = is_ms ? 3 : 2;
                             swizzle = is_ms ? ".xy" : "";
                             break;
-                        case ast::TextureDimension::k2dArray:
+                        case type::TextureDimension::k2dArray:
                             num_dimensions = is_ms ? 4 : 3;
                             swizzle = ".xy";
                             break;
-                        case ast::TextureDimension::k3d:
+                        case type::TextureDimension::k3d:
                             num_dimensions = 3;
                             break;
-                        case ast::TextureDimension::kCube:
+                        case type::TextureDimension::kCube:
                             num_dimensions = 2;
                             break;
-                        case ast::TextureDimension::kCubeArray:
+                        case type::TextureDimension::kCubeArray:
                             num_dimensions = 3;
                             swizzle = ".xy";
                             break;
@@ -2343,11 +2344,11 @@
                         default:
                             TINT_ICE(Writer, diagnostics_) << "texture dimension is not arrayed";
                             return false;
-                        case ast::TextureDimension::k2dArray:
+                        case type::TextureDimension::k2dArray:
                             num_dimensions = is_ms ? 4 : 3;
                             swizzle = ".z";
                             break;
-                        case ast::TextureDimension::kCubeArray:
+                        case type::TextureDimension::kCubeArray:
                             num_dimensions = 3;
                             swizzle = ".z";
                             break;
@@ -2359,18 +2360,18 @@
                             TINT_ICE(Writer, diagnostics_)
                                 << "texture dimension does not support mips";
                             return false;
-                        case ast::TextureDimension::k1d:
+                        case type::TextureDimension::k1d:
                             num_dimensions = 2;
                             swizzle = ".y";
                             break;
-                        case ast::TextureDimension::k2d:
-                        case ast::TextureDimension::kCube:
+                        case type::TextureDimension::k2d:
+                        case type::TextureDimension::kCube:
                             num_dimensions = 3;
                             swizzle = ".z";
                             break;
-                        case ast::TextureDimension::k2dArray:
-                        case ast::TextureDimension::k3d:
-                        case ast::TextureDimension::kCubeArray:
+                        case type::TextureDimension::k2dArray:
+                        case type::TextureDimension::k3d:
+                        case type::TextureDimension::kCubeArray:
                             num_dimensions = 4;
                             swizzle = ".w";
                             break;
@@ -2382,11 +2383,11 @@
                             TINT_ICE(Writer, diagnostics_)
                                 << "texture dimension does not support multisampling";
                             return false;
-                        case ast::TextureDimension::k2d:
+                        case type::TextureDimension::k2d:
                             num_dimensions = 3;
                             swizzle = ".z";
                             break;
-                        case ast::TextureDimension::k2dArray:
+                        case type::TextureDimension::k2dArray:
                             num_dimensions = 4;
                             swizzle = ".w";
                             break;
@@ -4051,22 +4052,22 @@
             out << "Texture";
 
             switch (tex->dim()) {
-                case ast::TextureDimension::k1d:
+                case type::TextureDimension::k1d:
                     out << "1D";
                     break;
-                case ast::TextureDimension::k2d:
+                case type::TextureDimension::k2d:
                     out << ((ms || depth_ms) ? "2DMS" : "2D");
                     break;
-                case ast::TextureDimension::k2dArray:
+                case type::TextureDimension::k2dArray:
                     out << ((ms || depth_ms) ? "2DMSArray" : "2DArray");
                     break;
-                case ast::TextureDimension::k3d:
+                case type::TextureDimension::k3d:
                     out << "3D";
                     break;
-                case ast::TextureDimension::kCube:
+                case type::TextureDimension::kCube:
                     out << "Cube";
                     break;
-                case ast::TextureDimension::kCubeArray:
+                case type::TextureDimension::kCubeArray:
                     out << "CubeArray";
                     break;
                 default:
diff --git a/src/tint/writer/hlsl/generator_impl_type_test.cc b/src/tint/writer/hlsl/generator_impl_type_test.cc
index 0b3b75e..715df9a 100644
--- a/src/tint/writer/hlsl/generator_impl_type_test.cc
+++ b/src/tint/writer/hlsl/generator_impl_type_test.cc
@@ -20,6 +20,7 @@
 #include "src/tint/type/sampled_texture.h"
 #include "src/tint/type/sampler.h"
 #include "src/tint/type/storage_texture.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/writer/hlsl/test_helper.h"
 
 using ::testing::HasSubstr;
@@ -295,7 +296,7 @@
 }
 
 struct HlslDepthTextureData {
-    ast::TextureDimension dim;
+    type::TextureDimension dim;
     std::string result;
 };
 inline std::ostream& operator<<(std::ostream& out, HlslDepthTextureData data) {
@@ -326,18 +327,18 @@
 INSTANTIATE_TEST_SUITE_P(
     HlslGeneratorImplTest_Type,
     HlslDepthTexturesTest,
-    testing::Values(HlslDepthTextureData{ast::TextureDimension::k2d,
+    testing::Values(HlslDepthTextureData{type::TextureDimension::k2d,
                                          "Texture2D tex : register(t1, space2);"},
-                    HlslDepthTextureData{ast::TextureDimension::k2dArray,
+                    HlslDepthTextureData{type::TextureDimension::k2dArray,
                                          "Texture2DArray tex : register(t1, space2);"},
-                    HlslDepthTextureData{ast::TextureDimension::kCube,
+                    HlslDepthTextureData{type::TextureDimension::kCube,
                                          "TextureCube tex : register(t1, space2);"},
-                    HlslDepthTextureData{ast::TextureDimension::kCubeArray,
+                    HlslDepthTextureData{type::TextureDimension::kCubeArray,
                                          "TextureCubeArray tex : register(t1, space2);"}));
 
 using HlslDepthMultisampledTexturesTest = TestHelper;
 TEST_F(HlslDepthMultisampledTexturesTest, Emit) {
-    auto* t = ty.depth_multisampled_texture(ast::TextureDimension::k2d);
+    auto* t = ty.depth_multisampled_texture(type::TextureDimension::k2d);
 
     GlobalVar("tex", t, Binding(1_a), Group(2_a));
 
@@ -357,7 +358,7 @@
 
 enum class TextureDataType { F32, U32, I32 };
 struct HlslSampledTextureData {
-    ast::TextureDimension dim;
+    type::TextureDimension dim;
     TextureDataType datatype;
     std::string result;
 };
@@ -402,99 +403,99 @@
                          HlslSampledTexturesTest,
                          testing::Values(
                              HlslSampledTextureData{
-                                 ast::TextureDimension::k1d,
+                                 type::TextureDimension::k1d,
                                  TextureDataType::F32,
                                  "Texture1D<float4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 ast::TextureDimension::k2d,
+                                 type::TextureDimension::k2d,
                                  TextureDataType::F32,
                                  "Texture2D<float4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 ast::TextureDimension::k2dArray,
+                                 type::TextureDimension::k2dArray,
                                  TextureDataType::F32,
                                  "Texture2DArray<float4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 ast::TextureDimension::k3d,
+                                 type::TextureDimension::k3d,
                                  TextureDataType::F32,
                                  "Texture3D<float4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 ast::TextureDimension::kCube,
+                                 type::TextureDimension::kCube,
                                  TextureDataType::F32,
                                  "TextureCube<float4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 ast::TextureDimension::kCubeArray,
+                                 type::TextureDimension::kCubeArray,
                                  TextureDataType::F32,
                                  "TextureCubeArray<float4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 ast::TextureDimension::k1d,
+                                 type::TextureDimension::k1d,
                                  TextureDataType::U32,
                                  "Texture1D<uint4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 ast::TextureDimension::k2d,
+                                 type::TextureDimension::k2d,
                                  TextureDataType::U32,
                                  "Texture2D<uint4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 ast::TextureDimension::k2dArray,
+                                 type::TextureDimension::k2dArray,
                                  TextureDataType::U32,
                                  "Texture2DArray<uint4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 ast::TextureDimension::k3d,
+                                 type::TextureDimension::k3d,
                                  TextureDataType::U32,
                                  "Texture3D<uint4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 ast::TextureDimension::kCube,
+                                 type::TextureDimension::kCube,
                                  TextureDataType::U32,
                                  "TextureCube<uint4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 ast::TextureDimension::kCubeArray,
+                                 type::TextureDimension::kCubeArray,
                                  TextureDataType::U32,
                                  "TextureCubeArray<uint4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 ast::TextureDimension::k1d,
+                                 type::TextureDimension::k1d,
                                  TextureDataType::I32,
                                  "Texture1D<int4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 ast::TextureDimension::k2d,
+                                 type::TextureDimension::k2d,
                                  TextureDataType::I32,
                                  "Texture2D<int4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 ast::TextureDimension::k2dArray,
+                                 type::TextureDimension::k2dArray,
                                  TextureDataType::I32,
                                  "Texture2DArray<int4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 ast::TextureDimension::k3d,
+                                 type::TextureDimension::k3d,
                                  TextureDataType::I32,
                                  "Texture3D<int4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 ast::TextureDimension::kCube,
+                                 type::TextureDimension::kCube,
                                  TextureDataType::I32,
                                  "TextureCube<int4> tex : register(t1, space2);",
                              },
                              HlslSampledTextureData{
-                                 ast::TextureDimension::kCubeArray,
+                                 type::TextureDimension::kCubeArray,
                                  TextureDataType::I32,
                                  "TextureCubeArray<int4> tex : register(t1, space2);",
                              }));
 
 TEST_F(HlslGeneratorImplTest_Type, EmitMultisampledTexture) {
     auto* f32 = create<type::F32>();
-    auto* s = create<type::MultisampledTexture>(ast::TextureDimension::k2d, f32);
+    auto* s = create<type::MultisampledTexture>(type::TextureDimension::k2d, f32);
 
     GeneratorImpl& gen = Build();
 
@@ -505,7 +506,7 @@
 }
 
 struct HlslStorageTextureData {
-    ast::TextureDimension dim;
+    type::TextureDimension dim;
     ast::TexelFormat imgfmt;
     std::string result;
 };
@@ -542,31 +543,31 @@
     HlslGeneratorImplTest_Type,
     HlslStorageTexturesTest,
     testing::Values(
-        HlslStorageTextureData{ast::TextureDimension::k1d, ast::TexelFormat::kRgba8Unorm,
+        HlslStorageTextureData{type::TextureDimension::k1d, ast::TexelFormat::kRgba8Unorm,
                                "RWTexture1D<float4> tex : register(u1, space2);"},
-        HlslStorageTextureData{ast::TextureDimension::k2d, ast::TexelFormat::kRgba16Float,
+        HlslStorageTextureData{type::TextureDimension::k2d, ast::TexelFormat::kRgba16Float,
                                "RWTexture2D<float4> tex : register(u1, space2);"},
-        HlslStorageTextureData{ast::TextureDimension::k2dArray, ast::TexelFormat::kR32Float,
+        HlslStorageTextureData{type::TextureDimension::k2dArray, ast::TexelFormat::kR32Float,
                                "RWTexture2DArray<float4> tex : register(u1, space2);"},
-        HlslStorageTextureData{ast::TextureDimension::k3d, ast::TexelFormat::kRg32Float,
+        HlslStorageTextureData{type::TextureDimension::k3d, ast::TexelFormat::kRg32Float,
                                "RWTexture3D<float4> tex : register(u1, space2);"},
-        HlslStorageTextureData{ast::TextureDimension::k1d, ast::TexelFormat::kRgba32Float,
+        HlslStorageTextureData{type::TextureDimension::k1d, ast::TexelFormat::kRgba32Float,
                                "RWTexture1D<float4> tex : register(u1, space2);"},
-        HlslStorageTextureData{ast::TextureDimension::k2d, ast::TexelFormat::kRgba16Uint,
+        HlslStorageTextureData{type::TextureDimension::k2d, ast::TexelFormat::kRgba16Uint,
                                "RWTexture2D<uint4> tex : register(u1, space2);"},
-        HlslStorageTextureData{ast::TextureDimension::k2dArray, ast::TexelFormat::kR32Uint,
+        HlslStorageTextureData{type::TextureDimension::k2dArray, ast::TexelFormat::kR32Uint,
                                "RWTexture2DArray<uint4> tex : register(u1, space2);"},
-        HlslStorageTextureData{ast::TextureDimension::k3d, ast::TexelFormat::kRg32Uint,
+        HlslStorageTextureData{type::TextureDimension::k3d, ast::TexelFormat::kRg32Uint,
                                "RWTexture3D<uint4> tex : register(u1, space2);"},
-        HlslStorageTextureData{ast::TextureDimension::k1d, ast::TexelFormat::kRgba32Uint,
+        HlslStorageTextureData{type::TextureDimension::k1d, ast::TexelFormat::kRgba32Uint,
                                "RWTexture1D<uint4> tex : register(u1, space2);"},
-        HlslStorageTextureData{ast::TextureDimension::k2d, ast::TexelFormat::kRgba16Sint,
+        HlslStorageTextureData{type::TextureDimension::k2d, ast::TexelFormat::kRgba16Sint,
                                "RWTexture2D<int4> tex : register(u1, space2);"},
-        HlslStorageTextureData{ast::TextureDimension::k2dArray, ast::TexelFormat::kR32Sint,
+        HlslStorageTextureData{type::TextureDimension::k2dArray, ast::TexelFormat::kR32Sint,
                                "RWTexture2DArray<int4> tex : register(u1, space2);"},
-        HlslStorageTextureData{ast::TextureDimension::k3d, ast::TexelFormat::kRg32Sint,
+        HlslStorageTextureData{type::TextureDimension::k3d, ast::TexelFormat::kRg32Sint,
                                "RWTexture3D<int4> tex : register(u1, space2);"},
-        HlslStorageTextureData{ast::TextureDimension::k1d, ast::TexelFormat::kRgba32Sint,
+        HlslStorageTextureData{type::TextureDimension::k1d, ast::TexelFormat::kRgba32Sint,
                                "RWTexture1D<int4> tex : register(u1, space2);"}));
 
 }  // namespace
diff --git a/src/tint/writer/msl/generator_impl.cc b/src/tint/writer/msl/generator_impl.cc
index 4889d7d..771582a 100644
--- a/src/tint/writer/msl/generator_impl.cc
+++ b/src/tint/writer/msl/generator_impl.cc
@@ -72,6 +72,7 @@
 #include "src/tint/type/reference.h"
 #include "src/tint/type/sampled_texture.h"
 #include "src/tint/type/storage_texture.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/type/u32.h"
 #include "src/tint/type/vector.h"
 #include "src/tint/type/void.h"
@@ -1020,25 +1021,25 @@
     };
 
     // MSL requires that `lod` is a constant 0 for 1D textures.
-    bool level_is_constant_zero = texture_type->dim() == ast::TextureDimension::k1d;
+    bool level_is_constant_zero = texture_type->dim() == type::TextureDimension::k1d;
 
     switch (builtin->Type()) {
         case sem::BuiltinType::kTextureDimensions: {
             std::vector<const char*> dims;
             switch (texture_type->dim()) {
-                case ast::TextureDimension::kNone:
+                case type::TextureDimension::kNone:
                     diagnostics_.add_error(diag::System::Writer, "texture dimension is kNone");
                     return false;
-                case ast::TextureDimension::k1d:
+                case type::TextureDimension::k1d:
                     dims = {"width"};
                     break;
-                case ast::TextureDimension::k2d:
-                case ast::TextureDimension::k2dArray:
-                case ast::TextureDimension::kCube:
-                case ast::TextureDimension::kCubeArray:
+                case type::TextureDimension::k2d:
+                case type::TextureDimension::k2dArray:
+                case type::TextureDimension::kCube:
+                case type::TextureDimension::kCubeArray:
                     dims = {"width", "height"};
                     break;
-                case ast::TextureDimension::k3d:
+                case type::TextureDimension::k3d:
                     dims = {"width", "height", "depth"};
                     break;
             }
@@ -1155,14 +1156,14 @@
             if (usage == Usage::kCoords && e->Type()->UnwrapRef()->is_integer_scalar_or_vector()) {
                 casted = true;
                 switch (texture_type->dim()) {
-                    case ast::TextureDimension::k1d:
+                    case type::TextureDimension::k1d:
                         out << "uint(";
                         break;
-                    case ast::TextureDimension::k2d:
-                    case ast::TextureDimension::k2dArray:
+                    case type::TextureDimension::k2d:
+                    case type::TextureDimension::k2dArray:
                         out << "uint2(";
                         break;
-                    case ast::TextureDimension::k3d:
+                    case type::TextureDimension::k3d:
                         out << "uint3(";
                         break;
                     default:
@@ -1212,17 +1213,17 @@
     if (auto* ddx = arg(Usage::kDdx)) {
         auto dim = texture_type->dim();
         switch (dim) {
-            case ast::TextureDimension::k2d:
-            case ast::TextureDimension::k2dArray:
+            case type::TextureDimension::k2d:
+            case type::TextureDimension::k2dArray:
                 maybe_write_comma();
                 out << "gradient2d(";
                 break;
-            case ast::TextureDimension::k3d:
+            case type::TextureDimension::k3d:
                 maybe_write_comma();
                 out << "gradient3d(";
                 break;
-            case ast::TextureDimension::kCube:
-            case ast::TextureDimension::kCubeArray:
+            case type::TextureDimension::kCube:
+            case type::TextureDimension::kCubeArray:
                 maybe_write_comma();
                 out << "gradientcube(";
                 break;
@@ -1257,8 +1258,8 @@
         if (!has_offset) {
             // offset argument may need to be provided if we have a component.
             switch (texture_type->dim()) {
-                case ast::TextureDimension::k2d:
-                case ast::TextureDimension::k2dArray:
+                case type::TextureDimension::k2d:
+                case type::TextureDimension::k2dArray:
                     out << "int2(0), ";
                     break;
                 default:
@@ -2624,22 +2625,22 @@
             }
 
             switch (tex->dim()) {
-                case ast::TextureDimension::k1d:
+                case type::TextureDimension::k1d:
                     out << "1d";
                     break;
-                case ast::TextureDimension::k2d:
+                case type::TextureDimension::k2d:
                     out << "2d";
                     break;
-                case ast::TextureDimension::k2dArray:
+                case type::TextureDimension::k2dArray:
                     out << "2d_array";
                     break;
-                case ast::TextureDimension::k3d:
+                case type::TextureDimension::k3d:
                     out << "3d";
                     break;
-                case ast::TextureDimension::kCube:
+                case type::TextureDimension::kCube:
                     out << "cube";
                     break;
-                case ast::TextureDimension::kCubeArray:
+                case type::TextureDimension::kCubeArray:
                     out << "cube_array";
                     break;
                 default:
diff --git a/src/tint/writer/msl/generator_impl_type_test.cc b/src/tint/writer/msl/generator_impl_type_test.cc
index 3b63013..ef37148 100644
--- a/src/tint/writer/msl/generator_impl_type_test.cc
+++ b/src/tint/writer/msl/generator_impl_type_test.cc
@@ -22,6 +22,7 @@
 #include "src/tint/type/sampled_texture.h"
 #include "src/tint/type/sampler.h"
 #include "src/tint/type/storage_texture.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/writer/msl/test_helper.h"
 
 using ::testing::HasSubstr;
@@ -750,7 +751,7 @@
 }
 
 struct MslDepthTextureData {
-    ast::TextureDimension dim;
+    type::TextureDimension dim;
     std::string result;
 };
 inline std::ostream& operator<<(std::ostream& out, MslDepthTextureData data) {
@@ -773,16 +774,16 @@
     MslGeneratorImplTest,
     MslDepthTexturesTest,
     testing::Values(
-        MslDepthTextureData{ast::TextureDimension::k2d, "depth2d<float, access::sample>"},
-        MslDepthTextureData{ast::TextureDimension::k2dArray,
+        MslDepthTextureData{type::TextureDimension::k2d, "depth2d<float, access::sample>"},
+        MslDepthTextureData{type::TextureDimension::k2dArray,
                             "depth2d_array<float, access::sample>"},
-        MslDepthTextureData{ast::TextureDimension::kCube, "depthcube<float, access::sample>"},
-        MslDepthTextureData{ast::TextureDimension::kCubeArray,
+        MslDepthTextureData{type::TextureDimension::kCube, "depthcube<float, access::sample>"},
+        MslDepthTextureData{type::TextureDimension::kCubeArray,
                             "depthcube_array<float, access::sample>"}));
 
 using MslDepthMultisampledTexturesTest = TestHelper;
 TEST_F(MslDepthMultisampledTexturesTest, Emit) {
-    type::DepthMultisampledTexture s(ast::TextureDimension::k2d);
+    type::DepthMultisampledTexture s(type::TextureDimension::k2d);
 
     GeneratorImpl& gen = Build();
 
@@ -792,7 +793,7 @@
 }
 
 struct MslTextureData {
-    ast::TextureDimension dim;
+    type::TextureDimension dim;
     std::string result;
 };
 inline std::ostream& operator<<(std::ostream& out, MslTextureData data) {
@@ -816,17 +817,17 @@
     MslGeneratorImplTest,
     MslSampledtexturesTest,
     testing::Values(
-        MslTextureData{ast::TextureDimension::k1d, "texture1d<float, access::sample>"},
-        MslTextureData{ast::TextureDimension::k2d, "texture2d<float, access::sample>"},
-        MslTextureData{ast::TextureDimension::k2dArray, "texture2d_array<float, access::sample>"},
-        MslTextureData{ast::TextureDimension::k3d, "texture3d<float, access::sample>"},
-        MslTextureData{ast::TextureDimension::kCube, "texturecube<float, access::sample>"},
-        MslTextureData{ast::TextureDimension::kCubeArray,
+        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,
                        "texturecube_array<float, access::sample>"}));
 
 TEST_F(MslGeneratorImplTest, Emit_TypeMultisampledTexture) {
     auto* u32 = create<type::U32>();
-    auto* ms = create<type::MultisampledTexture>(ast::TextureDimension::k2d, u32);
+    auto* ms = create<type::MultisampledTexture>(type::TextureDimension::k2d, u32);
 
     GeneratorImpl& gen = Build();
 
@@ -836,7 +837,7 @@
 }
 
 struct MslStorageTextureData {
-    ast::TextureDimension dim;
+    type::TextureDimension dim;
     std::string result;
 };
 inline std::ostream& operator<<(std::ostream& out, MslStorageTextureData data) {
@@ -859,11 +860,11 @@
     MslGeneratorImplTest,
     MslStorageTexturesTest,
     testing::Values(
-        MslStorageTextureData{ast::TextureDimension::k1d, "texture1d<float, access::write>"},
-        MslStorageTextureData{ast::TextureDimension::k2d, "texture2d<float, access::write>"},
-        MslStorageTextureData{ast::TextureDimension::k2dArray,
+        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{ast::TextureDimension::k3d, "texture3d<float, access::write>"}));
+        MslStorageTextureData{type::TextureDimension::k3d, "texture3d<float, access::write>"}));
 
 }  // namespace
 }  // namespace tint::writer::msl
diff --git a/src/tint/writer/spirv/builder.cc b/src/tint/writer/spirv/builder.cc
index df5a2e3..0090156 100644
--- a/src/tint/writer/spirv/builder.cc
+++ b/src/tint/writer/spirv/builder.cc
@@ -44,6 +44,7 @@
 #include "src/tint/type/multisampled_texture.h"
 #include "src/tint/type/reference.h"
 #include "src/tint/type/sampled_texture.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/type/vector.h"
 #include "src/tint/utils/compiler_macros.h"
 #include "src/tint/utils/defer.h"
@@ -2785,16 +2786,16 @@
             std::vector<uint32_t> swizzle;
             uint32_t spirv_dims = 0;
             switch (texture_type->dim()) {
-                case ast::TextureDimension::kNone:
+                case type::TextureDimension::kNone:
                     error_ = "texture dimension is kNone";
                     return false;
-                case ast::TextureDimension::k1d:
-                case ast::TextureDimension::k2d:
-                case ast::TextureDimension::k3d:
-                case ast::TextureDimension::kCube:
+                case type::TextureDimension::k1d:
+                case type::TextureDimension::k2d:
+                case type::TextureDimension::k3d:
+                case type::TextureDimension::kCube:
                     break;  // No swizzle needed
-                case ast::TextureDimension::kCubeArray:
-                case ast::TextureDimension::k2dArray:
+                case type::TextureDimension::kCubeArray:
+                case type::TextureDimension::k2dArray:
                     swizzle = {0, 1};  // Strip array index
                     spirv_dims = 3;    // [width, height, array_count]
                     break;
@@ -2825,8 +2826,8 @@
                 default:
                     error_ = "texture is not arrayed";
                     return false;
-                case ast::TextureDimension::k2dArray:
-                case ast::TextureDimension::kCubeArray:
+                case type::TextureDimension::k2dArray:
+                case type::TextureDimension::kCubeArray:
                     spirv_dims = 3;
                     break;
             }
@@ -3764,12 +3765,12 @@
 
     uint32_t array_literal = 0u;
     const auto dim = texture->dim();
-    if (dim == ast::TextureDimension::k2dArray || dim == ast::TextureDimension::kCubeArray) {
+    if (dim == type::TextureDimension::k2dArray || dim == type::TextureDimension::kCubeArray) {
         array_literal = 1u;
     }
 
     uint32_t dim_literal = SpvDim2D;
-    if (dim == ast::TextureDimension::k1d) {
+    if (dim == type::TextureDimension::k1d) {
         dim_literal = SpvDim1D;
         if (texture->Is<type::SampledTexture>()) {
             push_capability(SpvCapabilitySampled1D);
@@ -3777,10 +3778,10 @@
             push_capability(SpvCapabilityImage1D);
         }
     }
-    if (dim == ast::TextureDimension::k3d) {
+    if (dim == type::TextureDimension::k3d) {
         dim_literal = SpvDim3D;
     }
-    if (dim == ast::TextureDimension::kCube || dim == ast::TextureDimension::kCubeArray) {
+    if (dim == type::TextureDimension::kCube || dim == type::TextureDimension::kCubeArray) {
         dim_literal = SpvDimCube;
     }
 
@@ -3800,7 +3801,7 @@
         sampled_literal = 1u;
     }
 
-    if (dim == ast::TextureDimension::kCubeArray) {
+    if (dim == type::TextureDimension::kCubeArray) {
         if (texture->IsAnyOf<type::SampledTexture, type::DepthTexture>()) {
             push_capability(SpvCapabilitySampledCubeArray);
         }
diff --git a/src/tint/writer/spirv/builder_builtin_test.cc b/src/tint/writer/spirv/builder_builtin_test.cc
index 9b05980..3262b35 100644
--- a/src/tint/writer/spirv/builder_builtin_test.cc
+++ b/src/tint/writer/spirv/builder_builtin_test.cc
@@ -15,6 +15,7 @@
 #include "src/tint/ast/call_statement.h"
 #include "src/tint/ast/stage_attribute.h"
 #include "src/tint/type/depth_texture.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/utils/string.h"
 #include "src/tint/writer/spirv/spv_dump.h"
 #include "src/tint/writer/spirv/test_helper.h"
@@ -41,7 +42,7 @@
 // This tests that we do not push OpTypeSampledImage and float_0 type twice.
 TEST_F(BuiltinBuilderTest, Call_TextureSampleCompare_Twice) {
     auto* s = ty.sampler(ast::SamplerKind::kComparisonSampler);
-    auto* t = ty.depth_texture(ast::TextureDimension::k2d);
+    auto* t = ty.depth_texture(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/writer/spirv/builder_global_variable_test.cc b/src/tint/writer/spirv/builder_global_variable_test.cc
index 7d3ec59..9732abb 100644
--- a/src/tint/writer/spirv/builder_global_variable_test.cc
+++ b/src/tint/writer/spirv/builder_global_variable_test.cc
@@ -14,6 +14,7 @@
 
 #include "src/tint/ast/id_attribute.h"
 #include "src/tint/ast/stage_attribute.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/writer/spirv/spv_dump.h"
 #include "src/tint/writer/spirv/test_helper.h"
 
@@ -469,7 +470,7 @@
 TEST_F(BuilderTest, GlobalVar_TextureStorageWriteOnly) {
     // var<uniform_constant> a : texture_storage_2d<r32uint, write>;
 
-    auto* type = ty.storage_texture(ast::TextureDimension::k2d, ast::TexelFormat::kR32Uint,
+    auto* type = ty.storage_texture(type::TextureDimension::k2d, ast::TexelFormat::kR32Uint,
                                     ast::Access::kWrite);
 
     auto* var_a = GlobalVar("a", type, Binding(0_a), Group(0_a));
diff --git a/src/tint/writer/spirv/builder_type_test.cc b/src/tint/writer/spirv/builder_type_test.cc
index d698593..e7cdd74 100644
--- a/src/tint/writer/spirv/builder_type_test.cc
+++ b/src/tint/writer/spirv/builder_type_test.cc
@@ -15,6 +15,7 @@
 #include "src/tint/type/depth_texture.h"
 #include "src/tint/type/multisampled_texture.h"
 #include "src/tint/type/sampled_texture.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/writer/spirv/spv_dump.h"
 #include "src/tint/writer/spirv/test_helper.h"
 
@@ -631,7 +632,7 @@
                     PtrData{ast::AddressSpace::kFunction, SpvStorageClassFunction}));
 
 TEST_F(BuilderTest_Type, DepthTexture_Generate_2d) {
-    auto* two_d = create<type::DepthTexture>(ast::TextureDimension::k2d);
+    auto* two_d = create<type::DepthTexture>(type::TextureDimension::k2d);
 
     spirv::Builder& b = Build();
 
@@ -645,7 +646,7 @@
 }
 
 TEST_F(BuilderTest_Type, DepthTexture_Generate_2dArray) {
-    auto* two_d_array = create<type::DepthTexture>(ast::TextureDimension::k2dArray);
+    auto* two_d_array = create<type::DepthTexture>(type::TextureDimension::k2dArray);
 
     spirv::Builder& b = Build();
 
@@ -659,7 +660,7 @@
 }
 
 TEST_F(BuilderTest_Type, DepthTexture_Generate_Cube) {
-    auto* cube = create<type::DepthTexture>(ast::TextureDimension::kCube);
+    auto* cube = create<type::DepthTexture>(type::TextureDimension::kCube);
 
     spirv::Builder& b = Build();
 
@@ -674,7 +675,7 @@
 }
 
 TEST_F(BuilderTest_Type, DepthTexture_Generate_CubeArray) {
-    auto* cube_array = create<type::DepthTexture>(ast::TextureDimension::kCubeArray);
+    auto* cube_array = create<type::DepthTexture>(type::TextureDimension::kCubeArray);
 
     spirv::Builder& b = Build();
 
@@ -692,7 +693,7 @@
 
 TEST_F(BuilderTest_Type, MultisampledTexture_Generate_2d_i32) {
     auto* i32 = create<type::I32>();
-    auto* ms = create<type::MultisampledTexture>(ast::TextureDimension::k2d, i32);
+    auto* ms = create<type::MultisampledTexture>(type::TextureDimension::k2d, i32);
 
     spirv::Builder& b = Build();
 
@@ -705,7 +706,7 @@
 
 TEST_F(BuilderTest_Type, MultisampledTexture_Generate_2d_u32) {
     auto* u32 = create<type::U32>();
-    auto* ms = create<type::MultisampledTexture>(ast::TextureDimension::k2d, u32);
+    auto* ms = create<type::MultisampledTexture>(type::TextureDimension::k2d, u32);
 
     spirv::Builder& b = Build();
 
@@ -719,7 +720,7 @@
 
 TEST_F(BuilderTest_Type, MultisampledTexture_Generate_2d_f32) {
     auto* f32 = create<type::F32>();
-    auto* ms = create<type::MultisampledTexture>(ast::TextureDimension::k2d, f32);
+    auto* ms = create<type::MultisampledTexture>(type::TextureDimension::k2d, f32);
 
     spirv::Builder& b = Build();
 
@@ -732,7 +733,7 @@
 }
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_1d_i32) {
-    auto* s = create<type::SampledTexture>(ast::TextureDimension::k1d, create<type::I32>());
+    auto* s = create<type::SampledTexture>(type::TextureDimension::k1d, create<type::I32>());
 
     spirv::Builder& b = Build();
 
@@ -750,7 +751,7 @@
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_1d_u32) {
     auto* u32 = create<type::U32>();
-    auto* s = create<type::SampledTexture>(ast::TextureDimension::k1d, u32);
+    auto* s = create<type::SampledTexture>(type::TextureDimension::k1d, u32);
 
     spirv::Builder& b = Build();
 
@@ -768,7 +769,7 @@
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_1d_f32) {
     auto* f32 = create<type::F32>();
-    auto* s = create<type::SampledTexture>(ast::TextureDimension::k1d, f32);
+    auto* s = create<type::SampledTexture>(type::TextureDimension::k1d, f32);
 
     spirv::Builder& b = Build();
 
@@ -786,7 +787,7 @@
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_2d) {
     auto* f32 = create<type::F32>();
-    auto* s = create<type::SampledTexture>(ast::TextureDimension::k2d, f32);
+    auto* s = create<type::SampledTexture>(type::TextureDimension::k2d, f32);
 
     spirv::Builder& b = Build();
 
@@ -800,7 +801,7 @@
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_2d_array) {
     auto* f32 = create<type::F32>();
-    auto* s = create<type::SampledTexture>(ast::TextureDimension::k2dArray, f32);
+    auto* s = create<type::SampledTexture>(type::TextureDimension::k2dArray, f32);
 
     spirv::Builder& b = Build();
 
@@ -814,7 +815,7 @@
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_3d) {
     auto* f32 = create<type::F32>();
-    auto* s = create<type::SampledTexture>(ast::TextureDimension::k3d, f32);
+    auto* s = create<type::SampledTexture>(type::TextureDimension::k3d, f32);
 
     spirv::Builder& b = Build();
 
@@ -828,7 +829,7 @@
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_Cube) {
     auto* f32 = create<type::F32>();
-    auto* s = create<type::SampledTexture>(ast::TextureDimension::kCube, f32);
+    auto* s = create<type::SampledTexture>(type::TextureDimension::kCube, f32);
 
     spirv::Builder& b = Build();
 
@@ -843,7 +844,7 @@
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_CubeArray) {
     auto* f32 = create<type::F32>();
-    auto* s = create<type::SampledTexture>(ast::TextureDimension::kCubeArray, f32);
+    auto* s = create<type::SampledTexture>(type::TextureDimension::kCubeArray, f32);
 
     spirv::Builder& b = Build();
 
@@ -859,7 +860,7 @@
 }
 
 TEST_F(BuilderTest_Type, StorageTexture_Generate_1d) {
-    auto* s = ty.storage_texture(ast::TextureDimension::k1d, ast::TexelFormat::kR32Float,
+    auto* s = ty.storage_texture(type::TextureDimension::k1d, ast::TexelFormat::kR32Float,
                                  ast::Access::kWrite);
 
     GlobalVar("test_var", s, Binding(0_a), Group(0_a));
@@ -874,7 +875,7 @@
 }
 
 TEST_F(BuilderTest_Type, StorageTexture_Generate_2d) {
-    auto* s = ty.storage_texture(ast::TextureDimension::k2d, ast::TexelFormat::kR32Float,
+    auto* s = ty.storage_texture(type::TextureDimension::k2d, ast::TexelFormat::kR32Float,
                                  ast::Access::kWrite);
 
     GlobalVar("test_var", s, Binding(0_a), Group(0_a));
@@ -889,7 +890,7 @@
 }
 
 TEST_F(BuilderTest_Type, StorageTexture_Generate_2dArray) {
-    auto* s = ty.storage_texture(ast::TextureDimension::k2dArray, ast::TexelFormat::kR32Float,
+    auto* s = ty.storage_texture(type::TextureDimension::k2dArray, ast::TexelFormat::kR32Float,
                                  ast::Access::kWrite);
 
     GlobalVar("test_var", s, Binding(0_a), Group(0_a));
@@ -904,7 +905,7 @@
 }
 
 TEST_F(BuilderTest_Type, StorageTexture_Generate_3d) {
-    auto* s = ty.storage_texture(ast::TextureDimension::k3d, ast::TexelFormat::kR32Float,
+    auto* s = ty.storage_texture(type::TextureDimension::k3d, ast::TexelFormat::kR32Float,
                                  ast::Access::kWrite);
 
     GlobalVar("test_var", s, Binding(0_a), Group(0_a));
@@ -919,7 +920,7 @@
 }
 
 TEST_F(BuilderTest_Type, StorageTexture_Generate_SampledTypeFloat_Format_r32float) {
-    auto* s = ty.storage_texture(ast::TextureDimension::k2d, ast::TexelFormat::kR32Float,
+    auto* s = ty.storage_texture(type::TextureDimension::k2d, ast::TexelFormat::kR32Float,
                                  ast::Access::kWrite);
 
     GlobalVar("test_var", s, Binding(0_a), Group(0_a));
@@ -934,7 +935,7 @@
 }
 
 TEST_F(BuilderTest_Type, StorageTexture_Generate_SampledTypeSint_Format_r32sint) {
-    auto* s = ty.storage_texture(ast::TextureDimension::k2d, ast::TexelFormat::kR32Sint,
+    auto* s = ty.storage_texture(type::TextureDimension::k2d, ast::TexelFormat::kR32Sint,
                                  ast::Access::kWrite);
 
     GlobalVar("test_var", s, Binding(0_a), Group(0_a));
@@ -949,7 +950,7 @@
 }
 
 TEST_F(BuilderTest_Type, StorageTexture_Generate_SampledTypeUint_Format_r32uint) {
-    auto* s = ty.storage_texture(ast::TextureDimension::k2d, ast::TexelFormat::kR32Uint,
+    auto* s = ty.storage_texture(type::TextureDimension::k2d, ast::TexelFormat::kR32Uint,
                                  ast::Access::kWrite);
 
     GlobalVar("test_var", s, Binding(0_a), Group(0_a));
diff --git a/src/tint/writer/wgsl/generator_impl.cc b/src/tint/writer/wgsl/generator_impl.cc
index f02d96c..a515631 100644
--- a/src/tint/writer/wgsl/generator_impl.cc
+++ b/src/tint/writer/wgsl/generator_impl.cc
@@ -51,6 +51,7 @@
 #include "src/tint/ast/workgroup_attribute.h"
 #include "src/tint/sem/struct.h"
 #include "src/tint/sem/switch_statement.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/utils/math.h"
 #include "src/tint/utils/scoped_assignment.h"
 #include "src/tint/writer/float_to_string.h"
@@ -500,22 +501,22 @@
             }
 
             switch (texture->dim) {
-                case ast::TextureDimension::k1d:
+                case type::TextureDimension::k1d:
                     out << "1d";
                     break;
-                case ast::TextureDimension::k2d:
+                case type::TextureDimension::k2d:
                     out << "2d";
                     break;
-                case ast::TextureDimension::k2dArray:
+                case type::TextureDimension::k2dArray:
                     out << "2d_array";
                     break;
-                case ast::TextureDimension::k3d:
+                case type::TextureDimension::k3d:
                     out << "3d";
                     break;
-                case ast::TextureDimension::kCube:
+                case type::TextureDimension::kCube:
                     out << "cube";
                     break;
-                case ast::TextureDimension::kCubeArray:
+                case type::TextureDimension::kCubeArray:
                     out << "cube_array";
                     break;
                 default:
diff --git a/src/tint/writer/wgsl/generator_impl_global_decl_test.cc b/src/tint/writer/wgsl/generator_impl_global_decl_test.cc
index 939b5b3..cc331f0 100644
--- a/src/tint/writer/wgsl/generator_impl_global_decl_test.cc
+++ b/src/tint/writer/wgsl/generator_impl_global_decl_test.cc
@@ -15,6 +15,7 @@
 #include "src/tint/ast/stage_attribute.h"
 #include "src/tint/ast/variable_decl_statement.h"
 #include "src/tint/type/sampled_texture.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/writer/wgsl/test_helper.h"
 
 using namespace tint::number_suffixes;  // NOLINT
@@ -116,7 +117,7 @@
 }
 
 TEST_F(WgslGeneratorImplTest, Emit_Global_Texture) {
-    auto* st = ty.sampled_texture(ast::TextureDimension::k1d, ty.f32());
+    auto* st = ty.sampled_texture(type::TextureDimension::k1d, ty.f32());
     GlobalVar("t", st, Group(0_a), Binding(0_a));
 
     GeneratorImpl& gen = Build();
diff --git a/src/tint/writer/wgsl/generator_impl_type_test.cc b/src/tint/writer/wgsl/generator_impl_type_test.cc
index a1c3505..0f0ab27 100644
--- a/src/tint/writer/wgsl/generator_impl_type_test.cc
+++ b/src/tint/writer/wgsl/generator_impl_type_test.cc
@@ -15,6 +15,7 @@
 #include "src/tint/type/depth_texture.h"
 #include "src/tint/type/multisampled_texture.h"
 #include "src/tint/type/sampled_texture.h"
+#include "src/tint/type/texture_dimension.h"
 #include "src/tint/writer/wgsl/test_helper.h"
 
 using namespace tint::number_suffixes;  // NOLINT
@@ -329,7 +330,7 @@
 }
 
 struct TextureData {
-    ast::TextureDimension dim;
+    type::TextureDimension dim;
     const char* name;
 };
 inline std::ostream& operator<<(std::ostream& out, TextureData data) {
@@ -353,10 +354,10 @@
 INSTANTIATE_TEST_SUITE_P(
     WgslGeneratorImplTest,
     WgslGenerator_DepthTextureTest,
-    testing::Values(TextureData{ast::TextureDimension::k2d, "texture_depth_2d"},
-                    TextureData{ast::TextureDimension::k2dArray, "texture_depth_2d_array"},
-                    TextureData{ast::TextureDimension::kCube, "texture_depth_cube"},
-                    TextureData{ast::TextureDimension::kCubeArray, "texture_depth_cube_array"}));
+    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"}));
 
 using WgslGenerator_SampledTextureTest = TestParamHelper<TextureData>;
 TEST_P(WgslGenerator_SampledTextureTest, EmitType_SampledTexture_F32) {
@@ -400,12 +401,12 @@
 INSTANTIATE_TEST_SUITE_P(
     WgslGeneratorImplTest,
     WgslGenerator_SampledTextureTest,
-    testing::Values(TextureData{ast::TextureDimension::k1d, "texture_1d"},
-                    TextureData{ast::TextureDimension::k2d, "texture_2d"},
-                    TextureData{ast::TextureDimension::k2dArray, "texture_2d_array"},
-                    TextureData{ast::TextureDimension::k3d, "texture_3d"},
-                    TextureData{ast::TextureDimension::kCube, "texture_cube"},
-                    TextureData{ast::TextureDimension::kCubeArray, "texture_cube_array"}));
+    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"}));
 
 using WgslGenerator_MultiampledTextureTest = TestParamHelper<TextureData>;
 TEST_P(WgslGenerator_MultiampledTextureTest, EmitType_MultisampledTexture_F32) {
@@ -448,12 +449,12 @@
 }
 INSTANTIATE_TEST_SUITE_P(WgslGeneratorImplTest,
                          WgslGenerator_MultiampledTextureTest,
-                         testing::Values(TextureData{ast::TextureDimension::k2d,
+                         testing::Values(TextureData{type::TextureDimension::k2d,
                                                      "texture_multisampled_2d"}));
 
 struct StorageTextureData {
     ast::TexelFormat fmt;
-    ast::TextureDimension dim;
+    type::TextureDimension dim;
     ast::Access access;
     const char* name;
 };
@@ -477,14 +478,14 @@
 INSTANTIATE_TEST_SUITE_P(
     WgslGeneratorImplTest,
     WgslGenerator_StorageTextureTest,
-    testing::Values(StorageTextureData{ast::TexelFormat::kRgba8Sint, ast::TextureDimension::k1d,
+    testing::Values(StorageTextureData{ast::TexelFormat::kRgba8Sint, type::TextureDimension::k1d,
                                        ast::Access::kWrite, "texture_storage_1d<rgba8sint, write>"},
-                    StorageTextureData{ast::TexelFormat::kRgba8Sint, ast::TextureDimension::k2d,
+                    StorageTextureData{ast::TexelFormat::kRgba8Sint, type::TextureDimension::k2d,
                                        ast::Access::kWrite, "texture_storage_2d<rgba8sint, write>"},
                     StorageTextureData{ast::TexelFormat::kRgba8Sint,
-                                       ast::TextureDimension::k2dArray, ast::Access::kWrite,
+                                       type::TextureDimension::k2dArray, ast::Access::kWrite,
                                        "texture_storage_2d_array<rgba8sint, write>"},
-                    StorageTextureData{ast::TexelFormat::kRgba8Sint, ast::TextureDimension::k3d,
+                    StorageTextureData{ast::TexelFormat::kRgba8Sint, type::TextureDimension::k3d,
                                        ast::Access::kWrite,
                                        "texture_storage_3d<rgba8sint, write>"}));