[shuffle] Move utils to new structure.

The name `core` was decided fit better with the base language for the
IR. This CL moves the `core/` folder to `utils/` and moves the files
into the correct subdirectories. The build targets and namespaces are
not updated as part of the move and will be fixed up in later CLs.

Bug: tint:1988
Change-Id: I1fc4414c86b28e1669af2d2d07340ecfdd9ba681
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/142361
Reviewed-by: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/include/tint/override_id.h b/include/tint/override_id.h
index c638117..f7b5ef8 100644
--- a/include/tint/override_id.h
+++ b/include/tint/override_id.h
@@ -18,7 +18,7 @@
 #include <stdint.h>
 #include <functional>
 
-#include "src/tint/reflection.h"
+#include "src/tint/utils/reflection/reflection.h"
 
 namespace tint {
 
diff --git a/include/tint/tint.h b/include/tint/tint.h
index 2783b47..2868753 100644
--- a/include/tint/tint.h
+++ b/include/tint/tint.h
@@ -21,8 +21,6 @@
 // TODO(tint:88): When implementing support for an install target, all of these
 //                headers will need to be moved to include/tint/.
 
-#include "src/tint/core/diagnostic/printer.h"
-#include "src/tint/core/unicode.h"
 #include "src/tint/lang/base/type/manager.h"
 #include "src/tint/lang/wgsl/ast/transform/first_index_offset.h"
 #include "src/tint/lang/wgsl/ast/transform/renamer.h"
@@ -33,6 +31,8 @@
 #include "src/tint/lang/wgsl/inspector/inspector.h"
 #include "src/tint/reader/reader.h"
 #include "src/tint/transform/manager.h"
+#include "src/tint/utils/diagnostic/printer.h"
+#include "src/tint/utils/text/unicode.h"
 #include "src/tint/writer/array_length_from_uniform_options.h"
 #include "src/tint/writer/binding_point.h"
 #include "src/tint/writer/binding_remapper_options.h"
diff --git a/src/dawn/tests/unittests/UnicodeTests.cpp b/src/dawn/tests/unittests/UnicodeTests.cpp
index 5d11244..fc8dcf6 100644
--- a/src/dawn/tests/unittests/UnicodeTests.cpp
+++ b/src/dawn/tests/unittests/UnicodeTests.cpp
@@ -26,7 +26,7 @@
         uint64_t lengthInUTF16;
     };
 
-    // Referenced from src/tint/core/unicode_test.cc
+    // Referenced from src/tint/utils/text/unicode_test.cc
     constexpr std::array<TestCase, 12> kTestCases = {{
         {"", 0},
         {"abc", 3},
@@ -51,7 +51,7 @@
 }
 
 TEST_F(CountUTF16CodeUnitsFromUTF8StringTest, InvalidUnicodeString) {
-    // Referenced from src/tint/core/unicode_test.cc
+    // Referenced from src/tint/utils/text/unicode_test.cc
     constexpr std::array<const char*, 12> kTestCases = {{
         "\xed\xa0\x80",  // CodePoint == 0xD7FF + 1
         "\xed\xbf\xbf",  // CodePoint == 0xE000 - 1
diff --git a/src/tint/BUILD.gn b/src/tint/BUILD.gn
index 582ae47..4bfcabd 100644
--- a/src/tint/BUILD.gn
+++ b/src/tint/BUILD.gn
@@ -122,19 +122,19 @@
 ###############################################################################
 source_set("tint_utils_io") {
   sources = [
-    "core/io/command.h",
-    "core/io/tmpfile.h",
+    "utils/command/command.h",
+    "utils/file/tmpfile.h",
   ]
 
   if (is_linux || is_mac) {
-    sources += [ "core/io/command_posix.cc" ]
-    sources += [ "core/io/tmpfile_posix.cc" ]
+    sources += [ "utils/command/command_posix.cc" ]
+    sources += [ "utils/file/tmpfile_posix.cc" ]
   } else if (is_win) {
-    sources += [ "core/io/command_windows.cc" ]
-    sources += [ "core/io/tmpfile_windows.cc" ]
+    sources += [ "utils/command/command_windows.cc" ]
+    sources += [ "utils/file/tmpfile_windows.cc" ]
   } else {
-    sources += [ "core/io/command_other.cc" ]
-    sources += [ "core/io/tmpfile_other.cc" ]
+    sources += [ "utils/command/command_other.cc" ]
+    sources += [ "utils/file/tmpfile_other.cc" ]
   }
 
   deps = [ ":libtint_utils_src" ]
@@ -204,74 +204,74 @@
   sources = [
     "program_id.cc",
     "program_id.h",
-    "reflection.h",
-    "scope_stack.h",
-    "symbol.cc",
-    "symbol.h",
-    "symbol_table.cc",
-    "symbol_table.h",
+    "utils/containers/scope_stack.h",
+    "utils/reflection/reflection.h",
+    "utils/text/symbol.cc",
+    "utils/text/symbol.h",
+    "utils/text/symbol_table.cc",
+    "utils/text/symbol_table.h",
   ]
   deps = [ ":libtint_utils_src" ]
 }
 
 libtint_source_set("libtint_utils_src") {
   sources = [
-    "core/bitcast.h",
-    "core/bitset.h",
-    "core/block_allocator.h",
-    "core/bump_allocator.h",
-    "core/castable.cc",
-    "core/castable.h",
-    "core/cli.cc",
-    "core/cli.h",
-    "core/compiler_macros.h",
-    "core/concat.h",
-    "core/crc32.h",
-    "core/debugger.cc",
-    "core/debugger.h",
-    "core/defer.h",
-    "core/diagnostic/diagnostic.cc",
-    "core/diagnostic/diagnostic.h",
-    "core/diagnostic/formatter.cc",
-    "core/diagnostic/formatter.h",
-    "core/diagnostic/printer.cc",
-    "core/diagnostic/printer.h",
-    "core/enum_set.h",
-    "core/foreach_macro.h",
-    "core/hash.h",
-    "core/hashmap.h",
-    "core/hashmap_base.h",
-    "core/hashset.h",
-    "core/map.h",
-    "core/math.h",
-    "core/parse_num.cc",
-    "core/parse_num.h",
-    "core/predicates.h",
-    "core/scoped_assignment.h",
-    "core/slice.h",
-    "core/string.cc",
-    "core/string.h",
-    "core/string_stream.cc",
-    "core/string_stream.h",
-    "core/traits.h",
-    "core/unicode.cc",
-    "core/unicode.h",
-    "core/unique_allocator.h",
-    "core/unique_vector.h",
-    "core/vector.h",
-    "debug.cc",
-    "debug.h",
-    "source.cc",
-    "source.h",
-    "switch.h",
+    "utils/cli/cli.cc",
+    "utils/cli/cli.h",
+    "utils/containers/bitset.h",
+    "utils/containers/enum_set.h",
+    "utils/containers/hashmap.h",
+    "utils/containers/hashmap_base.h",
+    "utils/containers/hashset.h",
+    "utils/containers/map.h",
+    "utils/containers/predicates.h",
+    "utils/containers/slice.h",
+    "utils/containers/unique_allocator.h",
+    "utils/containers/unique_vector.h",
+    "utils/containers/vector.h",
+    "utils/debug/debug.cc",
+    "utils/debug/debug.h",
+    "utils/debug/debugger.cc",
+    "utils/debug/debugger.h",
+    "utils/diagnostic/diagnostic.cc",
+    "utils/diagnostic/diagnostic.h",
+    "utils/diagnostic/formatter.cc",
+    "utils/diagnostic/formatter.h",
+    "utils/diagnostic/printer.cc",
+    "utils/diagnostic/printer.h",
+    "utils/diagnostic/source.cc",
+    "utils/diagnostic/source.h",
+    "utils/macros/compiler.h",
+    "utils/macros/concat.h",
+    "utils/macros/defer.h",
+    "utils/macros/foreach.h",
+    "utils/macros/scoped_assignment.h",
+    "utils/math/crc32.h",
+    "utils/math/hash.h",
+    "utils/math/math.h",
+    "utils/memory/bitcast.h",
+    "utils/memory/block_allocator.h",
+    "utils/memory/bump_allocator.h",
+    "utils/rtti/castable.cc",
+    "utils/rtti/castable.h",
+    "utils/rtti/switch.h",
+    "utils/text/parse_num.cc",
+    "utils/text/parse_num.h",
+    "utils/text/string.cc",
+    "utils/text/string.h",
+    "utils/text/string_stream.cc",
+    "utils/text/string_stream.h",
+    "utils/text/unicode.cc",
+    "utils/text/unicode.h",
+    "utils/traits/traits.h",
   ]
 
   if (is_linux || is_mac) {
-    sources += [ "core/diagnostic/printer_posix.cc" ]
+    sources += [ "utils/diagnostic/printer_posix.cc" ]
   } else if (is_win) {
-    sources += [ "core/diagnostic/printer_windows.cc" ]
+    sources += [ "utils/diagnostic/printer_windows.cc" ]
   } else {
-    sources += [ "core/diagnostic/printer_other.cc" ]
+    sources += [ "utils/diagnostic/printer_other.cc" ]
   }
 
   deps = [ ":abseil" ]
@@ -1009,6 +1009,10 @@
     "lang/wgsl/helpers/check_supported_extensions.h",
     "lang/wgsl/helpers/flatten_bindings.cc",
     "lang/wgsl/helpers/flatten_bindings.h",
+    "utils/text/float_to_string.cc",
+    "utils/text/float_to_string.h",
+    "utils/text/text_generator.cc",
+    "utils/text/text_generator.h",
     "writer/array_length_from_uniform_options.cc",
     "writer/array_length_from_uniform_options.h",
     "writer/ast_text_generator.cc",
@@ -1018,12 +1022,8 @@
     "writer/binding_remapper_options.h",
     "writer/external_texture_options.cc",
     "writer/external_texture_options.h",
-    "writer/float_to_string.cc",
-    "writer/float_to_string.h",
     "writer/text.cc",
     "writer/text.h",
-    "writer/text_generator.cc",
-    "writer/text_generator.h",
     "writer/writer.cc",
     "writer/writer.h",
   ]
@@ -1682,9 +1682,9 @@
 
   tint_unittests_source_set("tint_unittests_diagnostic_src") {
     sources = [
-      "core/diagnostic/diagnostic_test.cc",
-      "core/diagnostic/formatter_test.cc",
-      "core/diagnostic/printer_test.cc",
+      "utils/diagnostic/diagnostic_test.cc",
+      "utils/diagnostic/formatter_test.cc",
+      "utils/diagnostic/printer_test.cc",
     ]
   }
 
@@ -1924,38 +1924,38 @@
 
   tint_unittests_source_set("tint_unittests_utils_src") {
     sources = [
-      "core/bitcast_test.cc",
-      "core/bitset_test.cc",
-      "core/block_allocator_test.cc",
-      "core/bump_allocator_test.cc",
-      "core/castable_test.cc",
-      "core/cli_test.cc",
-      "core/crc32_test.cc",
-      "core/defer_test.cc",
-      "core/enum_set_test.cc",
-      "core/hash_test.cc",
-      "core/hashmap_test.cc",
-      "core/hashset_test.cc",
-      "core/io/command_test.cc",
-      "core/io/tmpfile_test.cc",
-      "core/map_test.cc",
-      "core/math_test.cc",
-      "core/predicates_test.cc",
-      "core/result_test.cc",
-      "core/reverse_test.cc",
-      "core/scoped_assignment_test.cc",
-      "core/slice_test.cc",
-      "core/string_stream_test.cc",
-      "core/string_test.cc",
-      "core/traits_test.cc",
-      "core/transform_test.cc",
-      "core/unicode_test.cc",
-      "core/unique_allocator_test.cc",
-      "core/unique_vector_test.cc",
-      "core/vector_test.cc",
-      "debug_test.cc",
-      "source_test.cc",
-      "switch_test.cc",
+      "utils/cli/cli_test.cc",
+      "utils/command/command_test.cc",
+      "utils/containers/bitset_test.cc",
+      "utils/containers/enum_set_test.cc",
+      "utils/containers/hashmap_test.cc",
+      "utils/containers/hashset_test.cc",
+      "utils/containers/map_test.cc",
+      "utils/containers/predicates_test.cc",
+      "utils/containers/reverse_test.cc",
+      "utils/containers/slice_test.cc",
+      "utils/containers/transform_test.cc",
+      "utils/containers/unique_allocator_test.cc",
+      "utils/containers/unique_vector_test.cc",
+      "utils/containers/vector_test.cc",
+      "utils/debug/debug_test.cc",
+      "utils/diagnostic/source_test.cc",
+      "utils/file/tmpfile_test.cc",
+      "utils/macros/defer_test.cc",
+      "utils/macros/scoped_assignment_test.cc",
+      "utils/math/crc32_test.cc",
+      "utils/math/hash_test.cc",
+      "utils/math/math_test.cc",
+      "utils/memory/bitcast_test.cc",
+      "utils/memory/block_allocator_test.cc",
+      "utils/memory/bump_allocator_test.cc",
+      "utils/result/result_test.cc",
+      "utils/rtti/castable_test.cc",
+      "utils/rtti/switch_test.cc",
+      "utils/text/string_stream_test.cc",
+      "utils/text/string_test.cc",
+      "utils/text/unicode_test.cc",
+      "utils/traits/traits_test.cc",
     ]
     deps = [ ":libtint_utils_src" ]
   }
@@ -1965,8 +1965,8 @@
       "lang/wgsl/helpers/append_vector_test.cc",
       "lang/wgsl/helpers/check_supported_extensions_test.cc",
       "lang/wgsl/helpers/flatten_bindings_test.cc",
+      "utils/text/float_to_string_test.cc",
       "writer/ast_text_generator_test.cc",
-      "writer/float_to_string_test.cc",
     ]
     deps = [
       ":libtint_unittests_ast_helper",
@@ -2372,10 +2372,10 @@
 
   tint_unittests_source_set("tint_unittests_symbols_src") {
     sources = [
-      "reflection_test.cc",
-      "scope_stack_test.cc",
-      "symbol_table_test.cc",
-      "symbol_test.cc",
+      "utils/containers/scope_stack_test.cc",
+      "utils/reflection/reflection_test.cc",
+      "utils/text/symbol_table_test.cc",
+      "utils/text/symbol_test.cc",
     ]
     deps = [ ":libtint_symbols_src" ]
   }
diff --git a/src/tint/CMakeLists.txt b/src/tint/CMakeLists.txt
index 029bb7b..2fb3c93 100644
--- a/src/tint/CMakeLists.txt
+++ b/src/tint/CMakeLists.txt
@@ -56,25 +56,25 @@
 
 ## Tint diagnostic utilities. Used by libtint and tint_utils_io.
 add_library(tint_diagnostic_utils
-  debug.cc
-  debug.h
-  core/diagnostic/diagnostic.cc
-  core/diagnostic/diagnostic.h
-  core/diagnostic/formatter.cc
-  core/diagnostic/formatter.h
-  core/diagnostic/printer.cc
-  core/diagnostic/printer.h
-  source.cc
-  source.h
-  core/debugger.cc
-  core/debugger.h
-  core/unicode.cc
-  core/unicode.h
+  utils/debug/debug.cc
+  utils/debug/debug.h
+  utils/diagnostic/diagnostic.cc
+  utils/diagnostic/diagnostic.h
+  utils/diagnostic/formatter.cc
+  utils/diagnostic/formatter.h
+  utils/diagnostic/printer.cc
+  utils/diagnostic/printer.h
+  utils/diagnostic/source.cc
+  utils/diagnostic/source.h
+  utils/debug/debugger.cc
+  utils/debug/debugger.h
+  utils/text/unicode.cc
+  utils/text/unicode.h
 )
 tint_default_compile_options(tint_diagnostic_utils)
 
 if (TINT_ENABLE_BREAK_IN_DEBUGGER)
-  set_source_files_properties(core/debugger.cc
+  set_source_files_properties(utils/debug/debugger.cc
     PROPERTIES COMPILE_DEFINITIONS "TINT_ENABLE_BREAK_IN_DEBUGGER=1" )
 endif()
 
@@ -266,7 +266,7 @@
   program_id.h
   lang/wgsl/program/program.cc
   lang/wgsl/program/program.h
-  reflection.h
+  utils/reflection/reflection.h
   reader/reader.cc
   reader/reader.h
   resolver/const_eval.cc
@@ -284,8 +284,8 @@
   resolver/uniformity.h
   resolver/validator.cc
   resolver/validator.h
-  scope_stack.h
-  switch.h
+  utils/containers/scope_stack.h
+  utils/rtti/switch.h
   lang/wgsl/sem/accessor_expression.cc
   lang/wgsl/sem/accessor_expression.h
   lang/wgsl/sem/array_count.cc
@@ -350,10 +350,10 @@
   lang/wgsl/sem/value_expression.h
   lang/wgsl/sem/while_statement.cc
   lang/wgsl/sem/while_statement.h
-  symbol_table.cc
-  symbol_table.h
-  symbol.cc
-  symbol.h
+  utils/text/symbol_table.cc
+  utils/text/symbol_table.h
+  utils/text/symbol.cc
+  utils/text/symbol.h
   tint.cc
   lang/wgsl/ast/transform/add_empty_entry_point.cc
   lang/wgsl/ast/transform/add_empty_entry_point.h
@@ -530,38 +530,38 @@
   lang/base/type/vector.h
   lang/base/type/void.cc
   lang/base/type/void.h
-  core/bitcast.h
-  core/bitset.h
-  core/block_allocator.h
-  core/bump_allocator.h
-  core/castable.cc
-  core/castable.h
-  core/cli.cc
-  core/cli.h
-  core/compiler_macros.h
-  core/concat.h
-  core/crc32.h
-  core/enum_set.h
-  core/foreach_macro.h
-  core/hash.h
-  core/hashmap_base.h
-  core/hashmap.h
-  core/hashset.h
-  core/map.h
-  core/math.h
-  core/parse_num.cc
-  core/parse_num.h
-  core/predicates.h
-  core/scoped_assignment.h
-  core/slice.h
-  core/string.cc
-  core/string.h
-  core/string_stream.cc
-  core/string_stream.h
-  core/traits.h
-  core/unique_allocator.h
-  core/unique_vector.h
-  core/vector.h
+  utils/memory/bitcast.h
+  utils/containers/bitset.h
+  utils/memory/block_allocator.h
+  utils/memory/bump_allocator.h
+  utils/rtti/castable.cc
+  utils/rtti/castable.h
+  utils/cli/cli.cc
+  utils/cli/cli.h
+  utils/macros/compiler.h
+  utils/macros/concat.h
+  utils/math/crc32.h
+  utils/containers/enum_set.h
+  utils/macros/foreach.h
+  utils/math/hash.h
+  utils/containers/hashmap_base.h
+  utils/containers/hashmap.h
+  utils/containers/hashset.h
+  utils/containers/map.h
+  utils/math/math.h
+  utils/text/parse_num.cc
+  utils/text/parse_num.h
+  utils/containers/predicates.h
+  utils/macros/scoped_assignment.h
+  utils/containers/slice.h
+  utils/text/string.cc
+  utils/text/string.h
+  utils/text/string_stream.cc
+  utils/text/string_stream.h
+  utils/traits/traits.h
+  utils/containers/unique_allocator.h
+  utils/containers/unique_vector.h
+  utils/containers/vector.h
   lang/wgsl/helpers/append_vector.cc
   lang/wgsl/helpers/append_vector.h
   writer/array_length_from_uniform_options.cc
@@ -577,12 +577,12 @@
   writer/external_texture_options.h
   lang/wgsl/helpers/flatten_bindings.cc
   lang/wgsl/helpers/flatten_bindings.h
-  writer/float_to_string.cc
-  writer/float_to_string.h
+  utils/text/float_to_string.cc
+  utils/text/float_to_string.h
   writer/ir_text_generator.cc
   writer/ir_text_generator.h
-  writer/text_generator.cc
-  writer/text_generator.h
+  utils/text/text_generator.cc
+  utils/text/text_generator.h
   writer/text.cc
   writer/text.h
   writer/writer.cc
@@ -606,11 +606,11 @@
 tint_generated(lang/wgsl/sem/parameter_usage)
 
 if(UNIX)
-  list(APPEND TINT_LIB_SRCS core/diagnostic/printer_posix.cc)
+  list(APPEND TINT_LIB_SRCS utils/diagnostic/printer_posix.cc)
 elseif(WIN32)
-  list(APPEND TINT_LIB_SRCS core/diagnostic/printer_windows.cc)
+  list(APPEND TINT_LIB_SRCS utils/diagnostic/printer_windows.cc)
 else()
-  list(APPEND TINT_LIB_SRCS core/diagnostic/printer_other.cc)
+  list(APPEND TINT_LIB_SRCS utils/diagnostic/printer_other.cc)
 endif()
 
 if(${TINT_BUILD_SPV_READER})
@@ -875,10 +875,10 @@
 
 ## Tint IO utilities. Used by tint_val.
 add_library(tint_utils_io
-  core/io/command_${TINT_OS_CC_SUFFIX}.cc
-  core/io/command.h
-  core/io/tmpfile_${TINT_OS_CC_SUFFIX}.cc
-  core/io/tmpfile.h
+  utils/command/command_${TINT_OS_CC_SUFFIX}.cc
+  utils/command/command.h
+  utils/file/tmpfile_${TINT_OS_CC_SUFFIX}.cc
+  utils/file/tmpfile.h
 )
 tint_default_compile_options(tint_utils_io)
 target_link_libraries(tint_utils_io tint_diagnostic_utils)
@@ -1016,13 +1016,13 @@
     lang/base/constant/scalar_test.cc
     lang/base/constant/splat_test.cc
     lang/base/constant/value_test.cc
-    debug_test.cc
-    core/diagnostic/diagnostic_test.cc
-    core/diagnostic/formatter_test.cc
-    core/diagnostic/printer_test.cc
+    utils/debug/debug_test.cc
+    utils/diagnostic/diagnostic_test.cc
+    utils/diagnostic/formatter_test.cc
+    utils/diagnostic/printer_test.cc
     lang/wgsl/program/program_builder_test.cc
     lang/wgsl/program/program_test.cc
-    reflection_test.cc
+    utils/reflection/reflection_test.cc
     resolver/alias_analysis_test.cc
     resolver/array_accessor_test.cc
     resolver/assignment_validation_test.cc
@@ -1088,15 +1088,15 @@
     resolver/value_constructor_validation_test.cc
     resolver/variable_test.cc
     resolver/variable_validation_test.cc
-    scope_stack_test.cc
+    utils/containers/scope_stack_test.cc
     lang/wgsl/sem/builtin_test.cc
     lang/wgsl/sem/diagnostic_severity_test.cc
     lang/wgsl/sem/struct_test.cc
     lang/wgsl/sem/value_expression_test.cc
-    source_test.cc
-    switch_test.cc
-    symbol_table_test.cc
-    symbol_test.cc
+    utils/diagnostic/source_test.cc
+    utils/rtti/switch_test.cc
+    utils/text/symbol_table_test.cc
+    utils/text/symbol_test.cc
     test_main.cc
     lang/wgsl/ast/transform/transform_test.cc
     transform/manager_test.cc
@@ -1123,40 +1123,40 @@
     lang/base/type/type_test.cc
     lang/base/type/u32_test.cc
     lang/base/type/vector_test.cc
-    core/bitcast_test.cc
-    core/bitset_test.cc
-    core/block_allocator_test.cc
-    core/bump_allocator_test.cc
-    core/cli_test.cc
-    core/castable_test.cc
-    core/crc32_test.cc
-    core/defer_test.cc
-    core/enum_set_test.cc
-    core/hash_test.cc
-    core/io/command_test.cc
-    core/io/tmpfile_test.cc
-    core/hashmap_test.cc
-    core/hashset_test.cc
-    core/map_test.cc
-    core/math_test.cc
-    core/predicates_test.cc
-    core/result_test.cc
-    core/reverse_test.cc
-    core/scoped_assignment_test.cc
-    core/slice_test.cc
-    core/string_stream_test.cc
-    core/string_test.cc
-    core/traits_test.cc
-    core/transform_test.cc
-    core/unicode_test.cc
-    core/unique_allocator_test.cc
-    core/unique_vector_test.cc
-    core/vector_test.cc
+    utils/memory/bitcast_test.cc
+    utils/containers/bitset_test.cc
+    utils/memory/block_allocator_test.cc
+    utils/memory/bump_allocator_test.cc
+    utils/cli/cli_test.cc
+    utils/rtti/castable_test.cc
+    utils/math/crc32_test.cc
+    utils/macros/defer_test.cc
+    utils/containers/enum_set_test.cc
+    utils/math/hash_test.cc
+    utils/command/command_test.cc
+    utils/file/tmpfile_test.cc
+    utils/containers/hashmap_test.cc
+    utils/containers/hashset_test.cc
+    utils/containers/map_test.cc
+    utils/math/math_test.cc
+    utils/containers/predicates_test.cc
+    utils/result/result_test.cc
+    utils/containers/reverse_test.cc
+    utils/macros/scoped_assignment_test.cc
+    utils/containers/slice_test.cc
+    utils/text/string_stream_test.cc
+    utils/text/string_test.cc
+    utils/traits/traits_test.cc
+    utils/containers/transform_test.cc
+    utils/text/unicode_test.cc
+    utils/containers/unique_allocator_test.cc
+    utils/containers/unique_vector_test.cc
+    utils/containers/vector_test.cc
     lang/wgsl/helpers/append_vector_test.cc
     writer/ast_text_generator_test.cc
     lang/wgsl/helpers/check_supported_extensions_test.cc
     lang/wgsl/helpers/flatten_bindings_test.cc
-    writer/float_to_string_test.cc
+    utils/text/float_to_string_test.cc
   )
 
   # Noet, the source files are included here otherwise the cmd sources would not be included in the
@@ -1709,7 +1709,7 @@
   endif()
 
   list(APPEND TINT_BENCHMARK_SRCS
-    "switch_bench.cc"
+    "utils/rtti/switch_bench.cc"
     "bench/benchmark.cc"
     "lang/wgsl/reader/parser_bench.cc"
   )
diff --git a/src/tint/bench/benchmark.cc b/src/tint/bench/benchmark.cc
index 993aafc..00239f9 100644
--- a/src/tint/bench/benchmark.cc
+++ b/src/tint/bench/benchmark.cc
@@ -19,8 +19,8 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/string.h"
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::bench {
 namespace {
diff --git a/src/tint/bench/benchmark.h b/src/tint/bench/benchmark.h
index fd4dc95..c9e90ba 100644
--- a/src/tint/bench/benchmark.h
+++ b/src/tint/bench/benchmark.h
@@ -20,7 +20,7 @@
 #include <variant>
 
 #include "benchmark/benchmark.h"
-#include "src/tint/core/concat.h"
+#include "src/tint/utils/macros/concat.h"
 #include "tint/tint.h"
 
 namespace tint::bench {
diff --git a/src/tint/clone_context.cc b/src/tint/clone_context.cc
index 81b99e2..71c0d7f 100644
--- a/src/tint/clone_context.cc
+++ b/src/tint/clone_context.cc
@@ -16,8 +16,8 @@
 
 #include <string>
 
-#include "src/tint/core/map.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
+#include "src/tint/utils/containers/map.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::Cloneable);
 
diff --git a/src/tint/clone_context.h b/src/tint/clone_context.h
index 3abc66d..3e680ad 100644
--- a/src/tint/clone_context.h
+++ b/src/tint/clone_context.h
@@ -21,15 +21,15 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/castable.h"
-#include "src/tint/core/compiler_macros.h"
-#include "src/tint/core/hashmap.h"
-#include "src/tint/core/hashset.h"
-#include "src/tint/core/traits.h"
-#include "src/tint/core/vector.h"
-#include "src/tint/debug.h"
 #include "src/tint/program_id.h"
-#include "src/tint/symbol.h"
+#include "src/tint/utils/containers/hashmap.h"
+#include "src/tint/utils/containers/hashset.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/macros/compiler.h"
+#include "src/tint/utils/rtti/castable.h"
+#include "src/tint/utils/text/symbol.h"
+#include "src/tint/utils/traits/traits.h"
 
 // Forward declarations
 namespace tint {
diff --git a/src/tint/cmd/helper.cc b/src/tint/cmd/helper.cc
index 23b6eb2..29e6791 100644
--- a/src/tint/cmd/helper.cc
+++ b/src/tint/cmd/helper.cc
@@ -22,7 +22,7 @@
 #include "spirv-tools/libspirv.hpp"
 #endif
 
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::cmd {
 namespace {
diff --git a/src/tint/cmd/info.cc b/src/tint/cmd/info.cc
index c6f4d17..a08c38f 100644
--- a/src/tint/cmd/info.cc
+++ b/src/tint/cmd/info.cc
@@ -20,11 +20,11 @@
 #endif  // TINT_BUILD_SPV_READER
 
 #include "src/tint/cmd/helper.h"
-#include "src/tint/core/io/command.h"
-#include "src/tint/core/string.h"
-#include "src/tint/core/transform.h"
 #include "src/tint/lang/base/type/struct.h"
 #include "src/tint/lang/wgsl/ast/module.h"
+#include "src/tint/utils/command/command.h"
+#include "src/tint/utils/containers/transform.h"
+#include "src/tint/utils/text/string.h"
 #include "tint/tint.h"
 
 namespace {
diff --git a/src/tint/cmd/main.cc b/src/tint/cmd/main.cc
index edd092c..e402541 100644
--- a/src/tint/cmd/main.cc
+++ b/src/tint/cmd/main.cc
@@ -40,15 +40,15 @@
 
 #include "src/tint/cmd/generate_external_texture_bindings.h"
 #include "src/tint/cmd/helper.h"
-#include "src/tint/core/cli.h"
-#include "src/tint/core/defer.h"
-#include "src/tint/core/io/command.h"
-#include "src/tint/core/string.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/core/transform.h"
 #include "src/tint/lang/hlsl/validate/val.h"
 #include "src/tint/lang/msl/validate/val.h"
 #include "src/tint/lang/wgsl/ast/module.h"
+#include "src/tint/utils/cli/cli.h"
+#include "src/tint/utils/command/command.h"
+#include "src/tint/utils/containers/transform.h"
+#include "src/tint/utils/macros/defer.h"
+#include "src/tint/utils/text/string.h"
+#include "src/tint/utils/text/string_stream.h"
 #include "tint/tint.h"
 
 #if TINT_BUILD_IR
diff --git a/src/tint/fuzzers/mersenne_twister_engine.cc b/src/tint/fuzzers/mersenne_twister_engine.cc
index 3bccff1..722933d 100644
--- a/src/tint/fuzzers/mersenne_twister_engine.cc
+++ b/src/tint/fuzzers/mersenne_twister_engine.cc
@@ -17,7 +17,7 @@
 #include <algorithm>
 #include <cassert>
 
-#include "src/tint/core/hash.h"
+#include "src/tint/utils/math/hash.h"
 
 namespace tint::fuzzers {
 
diff --git a/src/tint/fuzzers/random_generator.cc b/src/tint/fuzzers/random_generator.cc
index 0260a3c..257b2f2 100644
--- a/src/tint/fuzzers/random_generator.cc
+++ b/src/tint/fuzzers/random_generator.cc
@@ -18,9 +18,9 @@
 #include <cassert>
 #include <utility>
 
-#include "src/tint/core/hash.h"
 #include "src/tint/fuzzers/mersenne_twister_engine.h"
 #include "src/tint/fuzzers/random_generator_engine.h"
+#include "src/tint/utils/math/hash.h"
 
 namespace tint::fuzzers {
 
@@ -28,7 +28,7 @@
 
 /// Calculate the hash for the contents of a c-style data buffer
 /// This is intentionally not implemented as a generic override of HashCombine
-/// in "src/tint/core/hash.h", because it conflicts with the vardiac override
+/// in "src/tint/utils/math/hash.h", because it conflicts with the vardiac override
 /// for the case where a pointer and an integer are being hashed.
 /// @param data - pointer to buffer to be hashed
 /// @param size - number of elements in buffer
diff --git a/src/tint/fuzzers/tint_ast_fuzzer/util.h b/src/tint/fuzzers/tint_ast_fuzzer/util.h
index 53afe4b..fd945c1 100644
--- a/src/tint/fuzzers/tint_ast_fuzzer/util.h
+++ b/src/tint/fuzzers/tint_ast_fuzzer/util.h
@@ -17,7 +17,6 @@
 
 #include <vector>
 
-#include "src/tint/core/castable.h"
 #include "src/tint/lang/wgsl/ast/module.h"
 #include "src/tint/lang/wgsl/ast/variable_decl_statement.h"
 #include "src/tint/lang/wgsl/program/program.h"
@@ -25,6 +24,7 @@
 #include "src/tint/lang/wgsl/sem/function.h"
 #include "src/tint/lang/wgsl/sem/statement.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::fuzzers::ast_fuzzer::util {
 /// @file
diff --git a/src/tint/fuzzers/tint_common_fuzzer.cc b/src/tint/fuzzers/tint_common_fuzzer.cc
index 3f5a03e..f4a56c0 100644
--- a/src/tint/fuzzers/tint_common_fuzzer.cc
+++ b/src/tint/fuzzers/tint_common_fuzzer.cc
@@ -30,8 +30,6 @@
 #include "spirv-tools/libspirv.hpp"
 #endif  // TINT_BUILD_SPV_READER || TINT_BUILD_SPV_WRITER
 
-#include "src/tint/core/diagnostic/formatter.h"
-#include "src/tint/core/hash.h"
 #include "src/tint/fuzzers/apply_substitute_overrides.h"
 #include "src/tint/lang/base/type/external_texture.h"
 #include "src/tint/lang/wgsl/ast/module.h"
@@ -39,6 +37,8 @@
 #include "src/tint/lang/wgsl/program/program.h"
 #include "src/tint/lang/wgsl/sem/binding_point.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
+#include "src/tint/utils/diagnostic/formatter.h"
+#include "src/tint/utils/math/hash.h"
 
 namespace tint::fuzzers {
 
diff --git a/src/tint/fuzzers/tint_concurrency_fuzzer.cc b/src/tint/fuzzers/tint_concurrency_fuzzer.cc
index 4691ab3..a89110b 100644
--- a/src/tint/fuzzers/tint_concurrency_fuzzer.cc
+++ b/src/tint/fuzzers/tint_concurrency_fuzzer.cc
@@ -19,7 +19,6 @@
 
 #include <thread>
 
-#include "src/tint/core/hash.h"
 #include "src/tint/fuzzers/apply_substitute_overrides.h"
 #include "src/tint/lang/glsl/ast_writer/generator.h"
 #include "src/tint/lang/hlsl/ast_writer/generator.h"
@@ -29,6 +28,7 @@
 #include "src/tint/lang/wgsl/helpers/flatten_bindings.h"
 #include "src/tint/lang/wgsl/inspector/inspector.h"
 #include "src/tint/lang/wgsl/reader/parser.h"
+#include "src/tint/utils/math/hash.h"
 
 static constexpr size_t kNumThreads = 8;
 
diff --git a/src/tint/ir/access.cc b/src/tint/ir/access.cc
index a040991..93d91a1 100644
--- a/src/tint/ir/access.cc
+++ b/src/tint/ir/access.cc
@@ -16,7 +16,7 @@
 
 #include <utility>
 
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::Access);
 
diff --git a/src/tint/ir/access.h b/src/tint/ir/access.h
index 6c4a68e..68074cc 100644
--- a/src/tint/ir/access.h
+++ b/src/tint/ir/access.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_IR_ACCESS_H_
 #define SRC_TINT_IR_ACCESS_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/operand_instruction.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/binary.cc b/src/tint/ir/binary.cc
index f4de0e6..b37c34b 100644
--- a/src/tint/ir/binary.cc
+++ b/src/tint/ir/binary.cc
@@ -13,7 +13,7 @@
 // limitations under the License.
 
 #include "src/tint/ir/binary.h"
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::Binary);
 
diff --git a/src/tint/ir/binary.h b/src/tint/ir/binary.h
index 29edd32..4b7fbb0 100644
--- a/src/tint/ir/binary.h
+++ b/src/tint/ir/binary.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_IR_BINARY_H_
 #define SRC_TINT_IR_BINARY_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/operand_instruction.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/bitcast.cc b/src/tint/ir/bitcast.cc
index c65e8bc..2563814 100644
--- a/src/tint/ir/bitcast.cc
+++ b/src/tint/ir/bitcast.cc
@@ -13,7 +13,7 @@
 // limitations under the License.
 
 #include "src/tint/ir/bitcast.h"
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::Bitcast);
 
diff --git a/src/tint/ir/bitcast.h b/src/tint/ir/bitcast.h
index d22bd57..b8d37dd 100644
--- a/src/tint/ir/bitcast.h
+++ b/src/tint/ir/bitcast.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_IR_BITCAST_H_
 #define SRC_TINT_IR_BITCAST_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/call.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/block.h b/src/tint/ir/block.h
index 64f5830..c6b4143 100644
--- a/src/tint/ir/block.h
+++ b/src/tint/ir/block.h
@@ -17,9 +17,9 @@
 
 #include <utility>
 
-#include "src/tint/core/vector.h"
 #include "src/tint/ir/instruction.h"
 #include "src/tint/ir/terminator.h"
+#include "src/tint/utils/containers/vector.h"
 
 // Forward declarations
 namespace tint::ir {
diff --git a/src/tint/ir/block_param.h b/src/tint/ir/block_param.h
index fb230d5..f255ac6 100644
--- a/src/tint/ir/block_param.h
+++ b/src/tint/ir/block_param.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_IR_BLOCK_PARAM_H_
 #define SRC_TINT_IR_BLOCK_PARAM_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/value.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/break_if.h b/src/tint/ir/break_if.h
index f5f52c8..bfbac0c 100644
--- a/src/tint/ir/break_if.h
+++ b/src/tint/ir/break_if.h
@@ -15,9 +15,9 @@
 #ifndef SRC_TINT_IR_BREAK_IF_H_
 #define SRC_TINT_IR_BREAK_IF_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/terminator.h"
 #include "src/tint/ir/value.h"
+#include "src/tint/utils/rtti/castable.h"
 
 // Forward declarations
 namespace tint::ir {
diff --git a/src/tint/ir/builder.h b/src/tint/ir/builder.h
index 94046c6..b6142b4 100644
--- a/src/tint/ir/builder.h
+++ b/src/tint/ir/builder.h
@@ -17,7 +17,6 @@
 
 #include <utility>
 
-#include "src/tint/core/scoped_assignment.h"
 #include "src/tint/ir/access.h"
 #include "src/tint/ir/binary.h"
 #include "src/tint/ir/bitcast.h"
@@ -66,7 +65,8 @@
 #include "src/tint/lang/base/type/u32.h"
 #include "src/tint/lang/base/type/vector.h"
 #include "src/tint/lang/base/type/void.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
+#include "src/tint/utils/rtti/switch.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/builtin_call.cc b/src/tint/ir/builtin_call.cc
index b8b2758..9bf890c 100644
--- a/src/tint/ir/builtin_call.cc
+++ b/src/tint/ir/builtin_call.cc
@@ -16,7 +16,7 @@
 
 #include <utility>
 
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::BuiltinCall);
 
diff --git a/src/tint/ir/builtin_call.h b/src/tint/ir/builtin_call.h
index c3c3f9d..803f9be 100644
--- a/src/tint/ir/builtin_call.h
+++ b/src/tint/ir/builtin_call.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_IR_BUILTIN_CALL_H_
 #define SRC_TINT_IR_BUILTIN_CALL_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/call.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/call.h b/src/tint/ir/call.h
index 9b3bad7..eb01382 100644
--- a/src/tint/ir/call.h
+++ b/src/tint/ir/call.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_IR_CALL_H_
 #define SRC_TINT_IR_CALL_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/operand_instruction.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/construct.cc b/src/tint/ir/construct.cc
index 6dbbd45..7b49e92 100644
--- a/src/tint/ir/construct.cc
+++ b/src/tint/ir/construct.cc
@@ -16,7 +16,7 @@
 
 #include <utility>
 
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::Construct);
 
diff --git a/src/tint/ir/construct.h b/src/tint/ir/construct.h
index fba66ef..24ce9ab 100644
--- a/src/tint/ir/construct.h
+++ b/src/tint/ir/construct.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_IR_CONSTRUCT_H_
 #define SRC_TINT_IR_CONSTRUCT_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/call.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/continue.h b/src/tint/ir/continue.h
index 3fdd4f2..03e4826 100644
--- a/src/tint/ir/continue.h
+++ b/src/tint/ir/continue.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_IR_CONTINUE_H_
 #define SRC_TINT_IR_CONTINUE_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/terminator.h"
+#include "src/tint/utils/rtti/castable.h"
 
 // Forward declarations
 namespace tint::ir {
diff --git a/src/tint/ir/convert.cc b/src/tint/ir/convert.cc
index 51e99f3..e640fd7 100644
--- a/src/tint/ir/convert.cc
+++ b/src/tint/ir/convert.cc
@@ -16,7 +16,7 @@
 
 #include <utility>
 
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::Convert);
 
diff --git a/src/tint/ir/convert.h b/src/tint/ir/convert.h
index 06ddb58..70d20d0 100644
--- a/src/tint/ir/convert.h
+++ b/src/tint/ir/convert.h
@@ -15,9 +15,9 @@
 #ifndef SRC_TINT_IR_CONVERT_H_
 #define SRC_TINT_IR_CONVERT_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/call.h"
 #include "src/tint/lang/base/type/type.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/core_builtin_call.cc b/src/tint/ir/core_builtin_call.cc
index 8fae040..6f888bd 100644
--- a/src/tint/ir/core_builtin_call.cc
+++ b/src/tint/ir/core_builtin_call.cc
@@ -16,7 +16,7 @@
 
 #include <utility>
 
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::CoreBuiltinCall);
 
diff --git a/src/tint/ir/core_builtin_call.h b/src/tint/ir/core_builtin_call.h
index 54b7894..7b58506 100644
--- a/src/tint/ir/core_builtin_call.h
+++ b/src/tint/ir/core_builtin_call.h
@@ -15,9 +15,9 @@
 #ifndef SRC_TINT_IR_CORE_BUILTIN_CALL_H_
 #define SRC_TINT_IR_CORE_BUILTIN_CALL_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/builtin_call.h"
 #include "src/tint/lang/base/builtin/function.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/disassembler.cc b/src/tint/ir/disassembler.cc
index 01f6d6b..1bb54f1 100644
--- a/src/tint/ir/disassembler.cc
+++ b/src/tint/ir/disassembler.cc
@@ -15,8 +15,6 @@
 #include "src/tint/ir/disassembler.h"
 
 #include "src//tint/ir/unary.h"
-#include "src/tint/core/scoped_assignment.h"
-#include "src/tint/core/string.h"
 #include "src/tint/ir/access.h"
 #include "src/tint/ir/binary.h"
 #include "src/tint/ir/bitcast.h"
@@ -54,7 +52,9 @@
 #include "src/tint/lang/base/constant/splat.h"
 #include "src/tint/lang/base/type/struct.h"
 #include "src/tint/lang/base/type/type.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
+#include "src/tint/utils/rtti/switch.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::ir {
 namespace {
diff --git a/src/tint/ir/disassembler.h b/src/tint/ir/disassembler.h
index 96171f5..bcb2e38 100644
--- a/src/tint/ir/disassembler.h
+++ b/src/tint/ir/disassembler.h
@@ -17,9 +17,6 @@
 
 #include <string>
 
-#include "src/tint/core/hashmap.h"
-#include "src/tint/core/hashset.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/ir/binary.h"
 #include "src/tint/ir/block.h"
 #include "src/tint/ir/call.h"
@@ -28,6 +25,9 @@
 #include "src/tint/ir/module.h"
 #include "src/tint/ir/switch.h"
 #include "src/tint/ir/unary.h"
+#include "src/tint/utils/containers/hashmap.h"
+#include "src/tint/utils/containers/hashset.h"
+#include "src/tint/utils/text/string_stream.h"
 
 // Forward declarations.
 namespace tint::type {
diff --git a/src/tint/ir/discard.cc b/src/tint/ir/discard.cc
index 4e52967..e4a47d7 100644
--- a/src/tint/ir/discard.cc
+++ b/src/tint/ir/discard.cc
@@ -13,8 +13,8 @@
 // limitations under the License.
 
 #include "src/tint/ir/discard.h"
-#include "src/tint/debug.h"
 #include "src/tint/lang/base/type/void.h"
+#include "src/tint/utils/debug/debug.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::Discard);
 
diff --git a/src/tint/ir/discard.h b/src/tint/ir/discard.h
index 6b90a75..d0cd3e3 100644
--- a/src/tint/ir/discard.h
+++ b/src/tint/ir/discard.h
@@ -15,9 +15,9 @@
 #ifndef SRC_TINT_IR_DISCARD_H_
 #define SRC_TINT_IR_DISCARD_H_
 
-#include "src/tint/core/castable.h"
-#include "src/tint/debug.h"
 #include "src/tint/ir/call.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/exit_if.h b/src/tint/ir/exit_if.h
index c3231ef..3fdc826 100644
--- a/src/tint/ir/exit_if.h
+++ b/src/tint/ir/exit_if.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_IR_EXIT_IF_H_
 #define SRC_TINT_IR_EXIT_IF_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/exit.h"
+#include "src/tint/utils/rtti/castable.h"
 
 // Forward declarations
 namespace tint::ir {
diff --git a/src/tint/ir/exit_loop.h b/src/tint/ir/exit_loop.h
index 2779e5b..1dcb350 100644
--- a/src/tint/ir/exit_loop.h
+++ b/src/tint/ir/exit_loop.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_IR_EXIT_LOOP_H_
 #define SRC_TINT_IR_EXIT_LOOP_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/exit.h"
+#include "src/tint/utils/rtti/castable.h"
 
 // Forward declarations
 namespace tint::ir {
diff --git a/src/tint/ir/exit_switch.h b/src/tint/ir/exit_switch.h
index 36ea986..eb7652f 100644
--- a/src/tint/ir/exit_switch.h
+++ b/src/tint/ir/exit_switch.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_IR_EXIT_SWITCH_H_
 #define SRC_TINT_IR_EXIT_SWITCH_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/exit.h"
+#include "src/tint/utils/rtti/castable.h"
 
 // Forward declarations
 namespace tint::ir {
diff --git a/src/tint/ir/from_program.cc b/src/tint/ir/from_program.cc
index 7c5ad2a..071a1f3 100644
--- a/src/tint/ir/from_program.cc
+++ b/src/tint/ir/from_program.cc
@@ -20,10 +20,6 @@
 #include <variant>
 #include <vector>
 
-#include "src/tint/core/defer.h"
-#include "src/tint/core/result.h"
-#include "src/tint/core/reverse.h"
-#include "src/tint/core/scoped_assignment.h"
 #include "src/tint/ir/block_param.h"
 #include "src/tint/ir/builder.h"
 #include "src/tint/ir/exit_if.h"
@@ -101,8 +97,12 @@
 #include "src/tint/lang/wgsl/sem/value_conversion.h"
 #include "src/tint/lang/wgsl/sem/value_expression.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
-#include "src/tint/scope_stack.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/reverse.h"
+#include "src/tint/utils/containers/scope_stack.h"
+#include "src/tint/utils/macros/defer.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
+#include "src/tint/utils/result/result.h"
+#include "src/tint/utils/rtti/switch.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
diff --git a/src/tint/ir/from_program.h b/src/tint/ir/from_program.h
index 0a23dce..3779fea 100644
--- a/src/tint/ir/from_program.h
+++ b/src/tint/ir/from_program.h
@@ -17,8 +17,8 @@
 
 #include <string>
 
-#include "src/tint/core/result.h"
 #include "src/tint/ir/module.h"
+#include "src/tint/utils/result/result.h"
 
 // Forward Declarations
 namespace tint {
diff --git a/src/tint/ir/function.cc b/src/tint/ir/function.cc
index 277d711..969ac01 100644
--- a/src/tint/ir/function.cc
+++ b/src/tint/ir/function.cc
@@ -14,7 +14,7 @@
 
 #include "src/tint/ir/function.h"
 
-#include "src/tint/core/predicates.h"
+#include "src/tint/utils/containers/predicates.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::Function);
 
diff --git a/src/tint/ir/function_param.h b/src/tint/ir/function_param.h
index 2fe15d1..b7feca6 100644
--- a/src/tint/ir/function_param.h
+++ b/src/tint/ir/function_param.h
@@ -17,11 +17,11 @@
 
 #include <utility>
 
-#include "src/tint/core/castable.h"
-#include "src/tint/core/vector.h"
 #include "src/tint/ir/binding_point.h"
 #include "src/tint/ir/location.h"
 #include "src/tint/ir/value.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/instruction.cc b/src/tint/ir/instruction.cc
index 635302f..197cdc1 100644
--- a/src/tint/ir/instruction.cc
+++ b/src/tint/ir/instruction.cc
@@ -14,8 +14,8 @@
 
 #include "src/tint/ir/instruction.h"
 
-#include "src/tint/debug.h"
 #include "src/tint/ir/block.h"
+#include "src/tint/utils/debug/debug.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::Instruction);
 
diff --git a/src/tint/ir/instruction.h b/src/tint/ir/instruction.h
index af76df0..fc66d2f 100644
--- a/src/tint/ir/instruction.h
+++ b/src/tint/ir/instruction.h
@@ -15,10 +15,10 @@
 #ifndef SRC_TINT_IR_INSTRUCTION_H_
 #define SRC_TINT_IR_INSTRUCTION_H_
 
-#include "src/tint/core/castable.h"
-#include "src/tint/core/enum_set.h"
 #include "src/tint/ir/instruction_result.h"
 #include "src/tint/ir/value.h"
+#include "src/tint/utils/containers/enum_set.h"
+#include "src/tint/utils/rtti/castable.h"
 
 // Forward declarations
 namespace tint::ir {
diff --git a/src/tint/ir/instruction_result.h b/src/tint/ir/instruction_result.h
index 6ef0fd6..843759f 100644
--- a/src/tint/ir/instruction_result.h
+++ b/src/tint/ir/instruction_result.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_IR_INSTRUCTION_RESULT_H_
 #define SRC_TINT_IR_INSTRUCTION_RESULT_H_
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/ir/value.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/intrinsic_call.cc b/src/tint/ir/intrinsic_call.cc
index 5f51bc1..4ff6888 100644
--- a/src/tint/ir/intrinsic_call.cc
+++ b/src/tint/ir/intrinsic_call.cc
@@ -16,7 +16,7 @@
 
 #include <utility>
 
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::IntrinsicCall);
 
diff --git a/src/tint/ir/intrinsic_call.h b/src/tint/ir/intrinsic_call.h
index 7405167..9ab143c 100644
--- a/src/tint/ir/intrinsic_call.h
+++ b/src/tint/ir/intrinsic_call.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_IR_INTRINSIC_CALL_H_
 #define SRC_TINT_IR_INTRINSIC_CALL_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/call.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/let.cc b/src/tint/ir/let.cc
index c6c5232..8d63559 100644
--- a/src/tint/ir/let.cc
+++ b/src/tint/ir/let.cc
@@ -13,8 +13,8 @@
 // limitations under the License.
 
 #include "src/tint/ir/let.h"
-#include "src/tint/debug.h"
 #include "src/tint/ir/store.h"
+#include "src/tint/utils/debug/debug.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::Let);
 
diff --git a/src/tint/ir/load.cc b/src/tint/ir/load.cc
index f871d1b..4a2b7aa 100644
--- a/src/tint/ir/load.cc
+++ b/src/tint/ir/load.cc
@@ -14,8 +14,8 @@
 
 #include "src/tint/ir/load.h"
 
-#include "src/tint/debug.h"
 #include "src/tint/lang/base/type/pointer.h"
+#include "src/tint/utils/debug/debug.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::Load);
 
diff --git a/src/tint/ir/load.h b/src/tint/ir/load.h
index c98fd01..91c423a 100644
--- a/src/tint/ir/load.h
+++ b/src/tint/ir/load.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_IR_LOAD_H_
 #define SRC_TINT_IR_LOAD_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/operand_instruction.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/load_vector_element.cc b/src/tint/ir/load_vector_element.cc
index 73e33ff..0579a72 100644
--- a/src/tint/ir/load_vector_element.cc
+++ b/src/tint/ir/load_vector_element.cc
@@ -13,7 +13,7 @@
 // limitations under the License.
 
 #include "src/tint/ir/load_vector_element.h"
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::LoadVectorElement);
 
diff --git a/src/tint/ir/load_vector_element.h b/src/tint/ir/load_vector_element.h
index 1243e5e..d00753b 100644
--- a/src/tint/ir/load_vector_element.h
+++ b/src/tint/ir/load_vector_element.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_IR_LOAD_VECTOR_ELEMENT_H_
 #define SRC_TINT_IR_LOAD_VECTOR_ELEMENT_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/operand_instruction.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/module.h b/src/tint/ir/module.h
index 7477117..755f9fd 100644
--- a/src/tint/ir/module.h
+++ b/src/tint/ir/module.h
@@ -18,9 +18,6 @@
 #include <memory>
 #include <string>
 
-#include "src/tint/core/block_allocator.h"
-#include "src/tint/core/result.h"
-#include "src/tint/core/vector.h"
 #include "src/tint/ir/block.h"
 #include "src/tint/ir/constant.h"
 #include "src/tint/ir/function.h"
@@ -29,7 +26,10 @@
 #include "src/tint/lang/base/constant/manager.h"
 #include "src/tint/lang/base/type/manager.h"
 #include "src/tint/program_id.h"
-#include "src/tint/symbol_table.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/memory/block_allocator.h"
+#include "src/tint/utils/result/result.h"
+#include "src/tint/utils/text/symbol_table.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/multi_in_block.cc b/src/tint/ir/multi_in_block.cc
index 3aae306..e51fa64 100644
--- a/src/tint/ir/multi_in_block.cc
+++ b/src/tint/ir/multi_in_block.cc
@@ -14,7 +14,7 @@
 
 #include "src/tint/ir/multi_in_block.h"
 
-#include "src/tint/core/predicates.h"
+#include "src/tint/utils/containers/predicates.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::MultiInBlock);
 
diff --git a/src/tint/ir/next_iteration.h b/src/tint/ir/next_iteration.h
index ad0c053..79eadb0 100644
--- a/src/tint/ir/next_iteration.h
+++ b/src/tint/ir/next_iteration.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_IR_NEXT_ITERATION_H_
 #define SRC_TINT_IR_NEXT_ITERATION_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/terminator.h"
+#include "src/tint/utils/rtti/castable.h"
 
 // Forward declarations
 namespace tint::ir {
diff --git a/src/tint/ir/program_test_helper.h b/src/tint/ir/program_test_helper.h
index 5cec05e..ceb047e 100644
--- a/src/tint/ir/program_test_helper.h
+++ b/src/tint/ir/program_test_helper.h
@@ -20,11 +20,11 @@
 #include <utility>
 
 #include "gtest/gtest.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/ir/disassembler.h"
 #include "src/tint/ir/from_program.h"
 #include "src/tint/lang/base/builtin/number.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/return.h b/src/tint/ir/return.h
index 52cee4e..5443b1f 100644
--- a/src/tint/ir/return.h
+++ b/src/tint/ir/return.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_IR_RETURN_H_
 #define SRC_TINT_IR_RETURN_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/terminator.h"
+#include "src/tint/utils/rtti/castable.h"
 
 // Forward declarations
 namespace tint::ir {
diff --git a/src/tint/ir/store.cc b/src/tint/ir/store.cc
index 23b5f835..ca88ec4 100644
--- a/src/tint/ir/store.cc
+++ b/src/tint/ir/store.cc
@@ -13,7 +13,7 @@
 // limitations under the License.
 
 #include "src/tint/ir/store.h"
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::Store);
 
diff --git a/src/tint/ir/store.h b/src/tint/ir/store.h
index 823e8a1..170fa43 100644
--- a/src/tint/ir/store.h
+++ b/src/tint/ir/store.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_IR_STORE_H_
 #define SRC_TINT_IR_STORE_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/operand_instruction.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/store_vector_element.cc b/src/tint/ir/store_vector_element.cc
index 1b50f89..00c14dd 100644
--- a/src/tint/ir/store_vector_element.cc
+++ b/src/tint/ir/store_vector_element.cc
@@ -13,7 +13,7 @@
 // limitations under the License.
 
 #include "src/tint/ir/store_vector_element.h"
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::StoreVectorElement);
 
diff --git a/src/tint/ir/store_vector_element.h b/src/tint/ir/store_vector_element.h
index ac6e076..f7a5885 100644
--- a/src/tint/ir/store_vector_element.h
+++ b/src/tint/ir/store_vector_element.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_IR_STORE_VECTOR_ELEMENT_H_
 #define SRC_TINT_IR_STORE_VECTOR_ELEMENT_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/operand_instruction.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/swizzle.cc b/src/tint/ir/swizzle.cc
index e6996bc..9ee672d 100644
--- a/src/tint/ir/swizzle.cc
+++ b/src/tint/ir/swizzle.cc
@@ -16,7 +16,7 @@
 
 #include <utility>
 
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::Swizzle);
 
diff --git a/src/tint/ir/swizzle.h b/src/tint/ir/swizzle.h
index 552ea84dd..16c863d 100644
--- a/src/tint/ir/swizzle.h
+++ b/src/tint/ir/swizzle.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_IR_SWIZZLE_H_
 #define SRC_TINT_IR_SWIZZLE_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/operand_instruction.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/terminator.h b/src/tint/ir/terminator.h
index 8ada083..79b622c 100644
--- a/src/tint/ir/terminator.h
+++ b/src/tint/ir/terminator.h
@@ -15,9 +15,9 @@
 #ifndef SRC_TINT_IR_TERMINATOR_H_
 #define SRC_TINT_IR_TERMINATOR_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/operand_instruction.h"
 #include "src/tint/ir/value.h"
+#include "src/tint/utils/rtti/castable.h"
 
 // Forward declarations
 namespace tint::ir {
diff --git a/src/tint/ir/to_program.cc b/src/tint/ir/to_program.cc
index 5e36814..cf608f4 100644
--- a/src/tint/ir/to_program.cc
+++ b/src/tint/ir/to_program.cc
@@ -18,13 +18,6 @@
 #include <tuple>
 #include <utility>
 
-#include "src/tint/core/hashmap.h"
-#include "src/tint/core/math.h"
-#include "src/tint/core/predicates.h"
-#include "src/tint/core/reverse.h"
-#include "src/tint/core/scoped_assignment.h"
-#include "src/tint/core/transform.h"
-#include "src/tint/core/vector.h"
 #include "src/tint/ir/access.h"
 #include "src/tint/ir/binary.h"
 #include "src/tint/ir/bitcast.h"
@@ -70,7 +63,14 @@
 #include "src/tint/lang/base/type/sampler.h"
 #include "src/tint/lang/base/type/texture.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/hashmap.h"
+#include "src/tint/utils/containers/predicates.h"
+#include "src/tint/utils/containers/reverse.h"
+#include "src/tint/utils/containers/transform.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
+#include "src/tint/utils/math/math.h"
+#include "src/tint/utils/rtti/switch.h"
 
 // Helper for calling TINT_UNIMPLEMENTED() from a Switch(object_ptr) default case.
 #define UNHANDLED_CASE(object_ptr)          \
diff --git a/src/tint/ir/to_program_inlining_test.cc b/src/tint/ir/to_program_inlining_test.cc
index bb5ef1e..e9581a3 100644
--- a/src/tint/ir/to_program_inlining_test.cc
+++ b/src/tint/ir/to_program_inlining_test.cc
@@ -14,13 +14,13 @@
 
 #include <string>
 
-#include "src/tint/core/string.h"
 #include "src/tint/ir/disassembler.h"
 #include "src/tint/ir/to_program.h"
 #include "src/tint/ir/to_program_test.h"
 #include "src/tint/lang/base/type/array.h"
 #include "src/tint/lang/base/type/matrix.h"
 #include "src/tint/lang/wgsl/ast_writer/generator.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::ir::test {
 namespace {
diff --git a/src/tint/ir/to_program_roundtrip_test.cc b/src/tint/ir/to_program_roundtrip_test.cc
index b0aa9fb..0c98db7 100644
--- a/src/tint/ir/to_program_roundtrip_test.cc
+++ b/src/tint/ir/to_program_roundtrip_test.cc
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string.h"
 #include "src/tint/ir/from_program.h"
 #include "src/tint/ir/program_test_helper.h"
 #include "src/tint/ir/to_program.h"
 #include "src/tint/lang/wgsl/ast_writer/generator.h"
 #include "src/tint/lang/wgsl/reader/parser.h"
+#include "src/tint/utils/text/string.h"
 
 #if !TINT_BUILD_WGSL_READER || !TINT_BUILD_WGSL_WRITER
 #error "to_program_roundtrip_test.cc requires both the WGSL reader and writer to be enabled"
diff --git a/src/tint/ir/to_program_test.cc b/src/tint/ir/to_program_test.cc
index fee43af..0dc616b 100644
--- a/src/tint/ir/to_program_test.cc
+++ b/src/tint/ir/to_program_test.cc
@@ -15,11 +15,11 @@
 #include <sstream>
 #include <string>
 
-#include "src/tint/core/string.h"
 #include "src/tint/ir/disassembler.h"
 #include "src/tint/ir/to_program.h"
 #include "src/tint/ir/to_program_test.h"
 #include "src/tint/lang/wgsl/ast_writer/generator.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::ir::test {
 
diff --git a/src/tint/ir/transform/merge_return.cc b/src/tint/ir/transform/merge_return.cc
index e312ff4..ee9d514 100644
--- a/src/tint/ir/transform/merge_return.cc
+++ b/src/tint/ir/transform/merge_return.cc
@@ -16,11 +16,11 @@
 
 #include <utility>
 
-#include "src/tint/core/reverse.h"
-#include "src/tint/core/transform.h"
 #include "src/tint/ir/builder.h"
 #include "src/tint/ir/module.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/reverse.h"
+#include "src/tint/utils/containers/transform.h"
+#include "src/tint/utils/rtti/switch.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::transform::MergeReturn);
 
diff --git a/src/tint/ir/transform/transform.h b/src/tint/ir/transform/transform.h
index 55cee80..666b911 100644
--- a/src/tint/ir/transform/transform.h
+++ b/src/tint/ir/transform/transform.h
@@ -19,8 +19,8 @@
 
 #include <utility>
 
-#include "src/tint/core/castable.h"
 #include "src/tint/lang/base/builtin/address_space.h"
+#include "src/tint/utils/rtti/castable.h"
 
 // Forward declarations
 namespace tint::ir {
diff --git a/src/tint/ir/transform/var_for_dynamic_index.cc b/src/tint/ir/transform/var_for_dynamic_index.cc
index 6efff61..3ea511b 100644
--- a/src/tint/ir/transform/var_for_dynamic_index.cc
+++ b/src/tint/ir/transform/var_for_dynamic_index.cc
@@ -16,13 +16,13 @@
 
 #include <utility>
 
-#include "src/tint/core/hashmap.h"
 #include "src/tint/ir/builder.h"
 #include "src/tint/ir/module.h"
 #include "src/tint/lang/base/type/array.h"
 #include "src/tint/lang/base/type/matrix.h"
 #include "src/tint/lang/base/type/pointer.h"
 #include "src/tint/lang/base/type/vector.h"
+#include "src/tint/utils/containers/hashmap.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::transform::VarForDynamicIndex);
 
diff --git a/src/tint/ir/unary.cc b/src/tint/ir/unary.cc
index f5952ea..3f22809 100644
--- a/src/tint/ir/unary.cc
+++ b/src/tint/ir/unary.cc
@@ -13,7 +13,7 @@
 // limitations under the License.
 
 #include "src/tint/ir/unary.h"
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::Unary);
 
diff --git a/src/tint/ir/unary.h b/src/tint/ir/unary.h
index 84f49af..91303ac 100644
--- a/src/tint/ir/unary.h
+++ b/src/tint/ir/unary.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_IR_UNARY_H_
 #define SRC_TINT_IR_UNARY_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/operand_instruction.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/user_call.cc b/src/tint/ir/user_call.cc
index a1ddfee..bd1e9a6 100644
--- a/src/tint/ir/user_call.cc
+++ b/src/tint/ir/user_call.cc
@@ -16,7 +16,7 @@
 
 #include <utility>
 
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::UserCall);
 
diff --git a/src/tint/ir/user_call.h b/src/tint/ir/user_call.h
index 64a7684..95d55d9 100644
--- a/src/tint/ir/user_call.h
+++ b/src/tint/ir/user_call.h
@@ -15,9 +15,9 @@
 #ifndef SRC_TINT_IR_USER_CALL_H_
 #define SRC_TINT_IR_USER_CALL_H_
 
-#include "src/tint/core/castable.h"
 #include "src/tint/ir/call.h"
 #include "src/tint/ir/function.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/validator.cc b/src/tint/ir/validator.cc
index 0b1d25c..8eff925 100644
--- a/src/tint/ir/validator.cc
+++ b/src/tint/ir/validator.cc
@@ -18,8 +18,6 @@
 #include <string>
 #include <utility>
 
-#include "src/tint/core/reverse.h"
-#include "src/tint/core/scoped_assignment.h"
 #include "src/tint/ir/access.h"
 #include "src/tint/ir/binary.h"
 #include "src/tint/ir/bitcast.h"
@@ -55,7 +53,9 @@
 #include "src/tint/lang/base/type/bool.h"
 #include "src/tint/lang/base/type/pointer.h"
 #include "src/tint/lang/base/type/vector.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/reverse.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
+#include "src/tint/utils/rtti/switch.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/ir/validator.h b/src/tint/ir/validator.h
index 4b9b46e..78a5fff 100644
--- a/src/tint/ir/validator.h
+++ b/src/tint/ir/validator.h
@@ -17,10 +17,10 @@
 
 #include <string>
 
-#include "src/tint/core/diagnostic/diagnostic.h"
-#include "src/tint/core/result.h"
 #include "src/tint/ir/disassembler.h"
 #include "src/tint/ir/module.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
+#include "src/tint/utils/result/result.h"
 
 // Forward declarations
 namespace tint::ir {
diff --git a/src/tint/ir/validator_test.cc b/src/tint/ir/validator_test.cc
index d2d9f5f..5707296 100644
--- a/src/tint/ir/validator_test.cc
+++ b/src/tint/ir/validator_test.cc
@@ -16,7 +16,6 @@
 #include <utility>
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string.h"
 #include "src/tint/ir/builder.h"
 #include "src/tint/ir/ir_test_helper.h"
 #include "src/tint/ir/validator.h"
@@ -24,6 +23,7 @@
 #include "src/tint/lang/base/type/matrix.h"
 #include "src/tint/lang/base/type/pointer.h"
 #include "src/tint/lang/base/type/struct.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::ir {
 namespace {
diff --git a/src/tint/ir/value.h b/src/tint/ir/value.h
index a4ecabe..c708237 100644
--- a/src/tint/ir/value.h
+++ b/src/tint/ir/value.h
@@ -15,9 +15,9 @@
 #ifndef SRC_TINT_IR_VALUE_H_
 #define SRC_TINT_IR_VALUE_H_
 
-#include "src/tint/core/castable.h"
-#include "src/tint/core/hashset.h"
 #include "src/tint/lang/base/type/type.h"
+#include "src/tint/utils/containers/hashset.h"
+#include "src/tint/utils/rtti/castable.h"
 
 // Forward declarations
 namespace tint::ir {
diff --git a/src/tint/ir/var.cc b/src/tint/ir/var.cc
index 38cafb0..6afcc19 100644
--- a/src/tint/ir/var.cc
+++ b/src/tint/ir/var.cc
@@ -13,8 +13,8 @@
 // limitations under the License.
 
 #include "src/tint/ir/var.h"
-#include "src/tint/debug.h"
 #include "src/tint/ir/store.h"
+#include "src/tint/utils/debug/debug.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ir::Var);
 
diff --git a/src/tint/ir/var.h b/src/tint/ir/var.h
index 92266a9..ca8ea7a 100644
--- a/src/tint/ir/var.h
+++ b/src/tint/ir/var.h
@@ -15,13 +15,13 @@
 #ifndef SRC_TINT_IR_VAR_H_
 #define SRC_TINT_IR_VAR_H_
 
-#include "src/tint/core/castable.h"
-#include "src/tint/core/vector.h"
 #include "src/tint/ir/binding_point.h"
 #include "src/tint/ir/operand_instruction.h"
 #include "src/tint/lang/base/builtin/access.h"
 #include "src/tint/lang/base/builtin/address_space.h"
 #include "src/tint/lang/base/type/pointer.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::ir {
 
diff --git a/src/tint/lang/base/builtin/access.cc.tmpl b/src/tint/lang/base/builtin/access.cc.tmpl
index f690d0d..3db52f1 100644
--- a/src/tint/lang/base/builtin/access.cc.tmpl
+++ b/src/tint/lang/base/builtin/access.cc.tmpl
@@ -11,7 +11,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "access") -}}
 
 #include "src/tint/lang/base/builtin/access.h"
diff --git a/src/tint/lang/base/builtin/access.h b/src/tint/lang/base/builtin/access.h
index a990698..f36798f 100644
--- a/src/tint/lang/base/builtin/access.h
+++ b/src/tint/lang/base/builtin/access.h
@@ -23,7 +23,7 @@
 #ifndef SRC_TINT_LANG_BASE_BUILTIN_ACCESS_H_
 #define SRC_TINT_LANG_BASE_BUILTIN_ACCESS_H_
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::builtin {
 
diff --git a/src/tint/lang/base/builtin/access.h.tmpl b/src/tint/lang/base/builtin/access.h.tmpl
index a32619a..03a948d 100644
--- a/src/tint/lang/base/builtin/access.h.tmpl
+++ b/src/tint/lang/base/builtin/access.h.tmpl
@@ -11,13 +11,13 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "access") -}}
 
 #ifndef SRC_TINT_LANG_BASE_BUILTIN_ACCESS_H_
 #define SRC_TINT_LANG_BASE_BUILTIN_ACCESS_H_
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::builtin {
 
diff --git a/src/tint/lang/base/builtin/access_bench.cc.tmpl b/src/tint/lang/base/builtin/access_bench.cc.tmpl
index 6238499..ce81319 100644
--- a/src/tint/lang/base/builtin/access_bench.cc.tmpl
+++ b/src/tint/lang/base/builtin/access_bench.cc.tmpl
@@ -11,7 +11,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "access") -}}
 
 #include "src/tint/lang/base/builtin/access.h"
diff --git a/src/tint/lang/base/builtin/access_test.cc b/src/tint/lang/base/builtin/access_test.cc
index 4c239d5..2ec38c2 100644
--- a/src/tint/lang/base/builtin/access_test.cc
+++ b/src/tint/lang/base/builtin/access_test.cc
@@ -26,7 +26,7 @@
 
 #include <string>
 
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::builtin {
 namespace {
diff --git a/src/tint/lang/base/builtin/access_test.cc.tmpl b/src/tint/lang/base/builtin/access_test.cc.tmpl
index beb401b..d43e639 100644
--- a/src/tint/lang/base/builtin/access_test.cc.tmpl
+++ b/src/tint/lang/base/builtin/access_test.cc.tmpl
@@ -11,7 +11,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "access") -}}
 
 #include "src/tint/lang/base/builtin/access.h"
@@ -20,7 +20,7 @@
 
 #include <string>
 
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::builtin {
 namespace {
diff --git a/src/tint/lang/base/builtin/address_space.cc.tmpl b/src/tint/lang/base/builtin/address_space.cc.tmpl
index 8f64fb2..c3f537b 100644
--- a/src/tint/lang/base/builtin/address_space.cc.tmpl
+++ b/src/tint/lang/base/builtin/address_space.cc.tmpl
@@ -11,7 +11,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "address_space") -}}
 
 #include "src/tint/lang/base/builtin/address_space.h"
diff --git a/src/tint/lang/base/builtin/address_space.h b/src/tint/lang/base/builtin/address_space.h
index 6a019d2..dbd3f6a 100644
--- a/src/tint/lang/base/builtin/address_space.h
+++ b/src/tint/lang/base/builtin/address_space.h
@@ -23,7 +23,7 @@
 #ifndef SRC_TINT_LANG_BASE_BUILTIN_ADDRESS_SPACE_H_
 #define SRC_TINT_LANG_BASE_BUILTIN_ADDRESS_SPACE_H_
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::builtin {
 
diff --git a/src/tint/lang/base/builtin/address_space.h.tmpl b/src/tint/lang/base/builtin/address_space.h.tmpl
index ebc6d9c..d31f9d1 100644
--- a/src/tint/lang/base/builtin/address_space.h.tmpl
+++ b/src/tint/lang/base/builtin/address_space.h.tmpl
@@ -11,13 +11,13 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "address_space") -}}
 
 #ifndef SRC_TINT_LANG_BASE_BUILTIN_ADDRESS_SPACE_H_
 #define SRC_TINT_LANG_BASE_BUILTIN_ADDRESS_SPACE_H_
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::builtin {
 
diff --git a/src/tint/lang/base/builtin/address_space_bench.cc.tmpl b/src/tint/lang/base/builtin/address_space_bench.cc.tmpl
index c6461a4..3550863 100644
--- a/src/tint/lang/base/builtin/address_space_bench.cc.tmpl
+++ b/src/tint/lang/base/builtin/address_space_bench.cc.tmpl
@@ -11,7 +11,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "address_space") -}}
 
 #include "src/tint/lang/base/builtin/address_space.h"
diff --git a/src/tint/lang/base/builtin/address_space_test.cc b/src/tint/lang/base/builtin/address_space_test.cc
index 50724c3..ade5705 100644
--- a/src/tint/lang/base/builtin/address_space_test.cc
+++ b/src/tint/lang/base/builtin/address_space_test.cc
@@ -26,7 +26,7 @@
 
 #include <string>
 
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::builtin {
 namespace {
diff --git a/src/tint/lang/base/builtin/address_space_test.cc.tmpl b/src/tint/lang/base/builtin/address_space_test.cc.tmpl
index f7a22a6..4502020 100644
--- a/src/tint/lang/base/builtin/address_space_test.cc.tmpl
+++ b/src/tint/lang/base/builtin/address_space_test.cc.tmpl
@@ -11,7 +11,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "address_space") -}}
 
 #include "src/tint/lang/base/builtin/address_space.h"
@@ -20,7 +20,7 @@
 
 #include <string>
 
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::builtin {
 namespace {
diff --git a/src/tint/lang/base/builtin/attribute.cc.tmpl b/src/tint/lang/base/builtin/attribute.cc.tmpl
index 6dee9de..58c73d4 100644
--- a/src/tint/lang/base/builtin/attribute.cc.tmpl
+++ b/src/tint/lang/base/builtin/attribute.cc.tmpl
@@ -11,7 +11,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "attribute") -}}
 
 #include "src/tint/lang/base/builtin/attribute.h"
diff --git a/src/tint/lang/base/builtin/attribute.h b/src/tint/lang/base/builtin/attribute.h
index 677ce93..952f3ab 100644
--- a/src/tint/lang/base/builtin/attribute.h
+++ b/src/tint/lang/base/builtin/attribute.h
@@ -23,7 +23,7 @@
 #ifndef SRC_TINT_LANG_BASE_BUILTIN_ATTRIBUTE_H_
 #define SRC_TINT_LANG_BASE_BUILTIN_ATTRIBUTE_H_
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 /// \cond DO_NOT_DOCUMENT
 /// There is a bug in doxygen where this enum conflicts with the ast::Attribute
diff --git a/src/tint/lang/base/builtin/attribute.h.tmpl b/src/tint/lang/base/builtin/attribute.h.tmpl
index 63a4557..aba7d25 100644
--- a/src/tint/lang/base/builtin/attribute.h.tmpl
+++ b/src/tint/lang/base/builtin/attribute.h.tmpl
@@ -11,13 +11,13 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "attribute") -}}
 
 #ifndef SRC_TINT_LANG_BASE_BUILTIN_ATTRIBUTE_H_
 #define SRC_TINT_LANG_BASE_BUILTIN_ATTRIBUTE_H_
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 /// \cond DO_NOT_DOCUMENT
 /// There is a bug in doxygen where this enum conflicts with the ast::Attribute
diff --git a/src/tint/lang/base/builtin/attribute_bench.cc.tmpl b/src/tint/lang/base/builtin/attribute_bench.cc.tmpl
index 02040b0..648a04e 100644
--- a/src/tint/lang/base/builtin/attribute_bench.cc.tmpl
+++ b/src/tint/lang/base/builtin/attribute_bench.cc.tmpl
@@ -11,7 +11,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "attribute") -}}
 
 #include "src/tint/lang/base/builtin/attribute.h"
diff --git a/src/tint/lang/base/builtin/attribute_test.cc b/src/tint/lang/base/builtin/attribute_test.cc
index faf4738..5dee284b 100644
--- a/src/tint/lang/base/builtin/attribute_test.cc
+++ b/src/tint/lang/base/builtin/attribute_test.cc
@@ -26,7 +26,7 @@
 
 #include <string>
 
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::builtin {
 namespace {
diff --git a/src/tint/lang/base/builtin/attribute_test.cc.tmpl b/src/tint/lang/base/builtin/attribute_test.cc.tmpl
index 91b1c58..55fa08e 100644
--- a/src/tint/lang/base/builtin/attribute_test.cc.tmpl
+++ b/src/tint/lang/base/builtin/attribute_test.cc.tmpl
@@ -11,7 +11,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "attribute") -}}
 
 #include "src/tint/lang/base/builtin/attribute.h"
@@ -20,7 +20,7 @@
 
 #include <string>
 
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::builtin {
 namespace {
diff --git a/src/tint/lang/base/builtin/builtin.cc.tmpl b/src/tint/lang/base/builtin/builtin.cc.tmpl
index da9a76b..eea42d5 100644
--- a/src/tint/lang/base/builtin/builtin.cc.tmpl
+++ b/src/tint/lang/base/builtin/builtin.cc.tmpl
@@ -11,7 +11,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "builtin_type") -}}
 {{- Eval "OverrideEnumName" "Enum" $enum "Name" "Builtin" -}}
 
diff --git a/src/tint/lang/base/builtin/builtin.h b/src/tint/lang/base/builtin/builtin.h
index fe0be46..f9374db 100644
--- a/src/tint/lang/base/builtin/builtin.h
+++ b/src/tint/lang/base/builtin/builtin.h
@@ -23,7 +23,7 @@
 #ifndef SRC_TINT_LANG_BASE_BUILTIN_BUILTIN_H_
 #define SRC_TINT_LANG_BASE_BUILTIN_BUILTIN_H_
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::builtin {
 
diff --git a/src/tint/lang/base/builtin/builtin.h.tmpl b/src/tint/lang/base/builtin/builtin.h.tmpl
index 8476a95..e8ef10d 100644
--- a/src/tint/lang/base/builtin/builtin.h.tmpl
+++ b/src/tint/lang/base/builtin/builtin.h.tmpl
@@ -11,14 +11,14 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "builtin_type") -}}
 {{- Eval "OverrideEnumName" "Enum" $enum "Name" "Builtin" -}}
 
 #ifndef SRC_TINT_LANG_BASE_BUILTIN_BUILTIN_H_
 #define SRC_TINT_LANG_BASE_BUILTIN_BUILTIN_H_
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::builtin {
 
diff --git a/src/tint/lang/base/builtin/builtin_bench.cc.tmpl b/src/tint/lang/base/builtin/builtin_bench.cc.tmpl
index 6172499..810a421 100644
--- a/src/tint/lang/base/builtin/builtin_bench.cc.tmpl
+++ b/src/tint/lang/base/builtin/builtin_bench.cc.tmpl
@@ -11,7 +11,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "builtin_type") -}}
 {{- Eval "OverrideEnumName" "Enum" $enum "Name" "Builtin" -}}
 
diff --git a/src/tint/lang/base/builtin/builtin_test.cc b/src/tint/lang/base/builtin/builtin_test.cc
index a79c310..52ae289 100644
--- a/src/tint/lang/base/builtin/builtin_test.cc
+++ b/src/tint/lang/base/builtin/builtin_test.cc
@@ -26,7 +26,7 @@
 
 #include "gtest/gtest.h"
 
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::builtin {
 namespace {
diff --git a/src/tint/lang/base/builtin/builtin_test.cc.tmpl b/src/tint/lang/base/builtin/builtin_test.cc.tmpl
index 3945f0b..d7e4288 100644
--- a/src/tint/lang/base/builtin/builtin_test.cc.tmpl
+++ b/src/tint/lang/base/builtin/builtin_test.cc.tmpl
@@ -11,7 +11,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "builtin_type") -}}
 {{- Eval "OverrideEnumName" "Enum" $enum "Name" "Builtin" -}}
 
@@ -21,7 +21,7 @@
 
 #include "gtest/gtest.h"
 
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::builtin {
 namespace {
diff --git a/src/tint/lang/base/builtin/builtin_value.cc.tmpl b/src/tint/lang/base/builtin/builtin_value.cc.tmpl
index e1fe358..3cd7d68 100644
--- a/src/tint/lang/base/builtin/builtin_value.cc.tmpl
+++ b/src/tint/lang/base/builtin/builtin_value.cc.tmpl
@@ -8,7 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "builtin_value") -}}
 
 #include "src/tint/lang/base/builtin/builtin_value.h"
diff --git a/src/tint/lang/base/builtin/builtin_value.h b/src/tint/lang/base/builtin/builtin_value.h
index 1361962..2291190 100644
--- a/src/tint/lang/base/builtin/builtin_value.h
+++ b/src/tint/lang/base/builtin/builtin_value.h
@@ -23,7 +23,7 @@
 #ifndef SRC_TINT_LANG_BASE_BUILTIN_BUILTIN_VALUE_H_
 #define SRC_TINT_LANG_BASE_BUILTIN_BUILTIN_VALUE_H_
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::builtin {
 
diff --git a/src/tint/lang/base/builtin/builtin_value.h.tmpl b/src/tint/lang/base/builtin/builtin_value.h.tmpl
index 639c2a3..19c475a 100644
--- a/src/tint/lang/base/builtin/builtin_value.h.tmpl
+++ b/src/tint/lang/base/builtin/builtin_value.h.tmpl
@@ -8,13 +8,13 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "builtin_value") -}}
 
 #ifndef SRC_TINT_LANG_BASE_BUILTIN_BUILTIN_VALUE_H_
 #define SRC_TINT_LANG_BASE_BUILTIN_BUILTIN_VALUE_H_
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::builtin {
 
diff --git a/src/tint/lang/base/builtin/builtin_value_bench.cc.tmpl b/src/tint/lang/base/builtin/builtin_value_bench.cc.tmpl
index 0a2eaea..f7aa1b8 100644
--- a/src/tint/lang/base/builtin/builtin_value_bench.cc.tmpl
+++ b/src/tint/lang/base/builtin/builtin_value_bench.cc.tmpl
@@ -8,7 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "builtin_value") -}}
 
 #include "src/tint/lang/base/builtin/builtin_value.h"
diff --git a/src/tint/lang/base/builtin/builtin_value_test.cc b/src/tint/lang/base/builtin/builtin_value_test.cc
index d97dd96..0def625 100644
--- a/src/tint/lang/base/builtin/builtin_value_test.cc
+++ b/src/tint/lang/base/builtin/builtin_value_test.cc
@@ -26,7 +26,7 @@
 
 #include <string>
 
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::builtin {
 namespace {
diff --git a/src/tint/lang/base/builtin/builtin_value_test.cc.tmpl b/src/tint/lang/base/builtin/builtin_value_test.cc.tmpl
index ad9aa29..bfae526 100644
--- a/src/tint/lang/base/builtin/builtin_value_test.cc.tmpl
+++ b/src/tint/lang/base/builtin/builtin_value_test.cc.tmpl
@@ -8,7 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "builtin_value") -}}
 
 #include "src/tint/lang/base/builtin/builtin_value.h"
@@ -17,7 +17,7 @@
 
 #include <string>
 
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::builtin {
 namespace {
diff --git a/src/tint/lang/base/builtin/diagnostic_rule.cc b/src/tint/lang/base/builtin/diagnostic_rule.cc
index ec450d5..f1e3f57 100644
--- a/src/tint/lang/base/builtin/diagnostic_rule.cc
+++ b/src/tint/lang/base/builtin/diagnostic_rule.cc
@@ -24,7 +24,7 @@
 
 #include <string>
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::builtin {
 
diff --git a/src/tint/lang/base/builtin/diagnostic_rule.cc.tmpl b/src/tint/lang/base/builtin/diagnostic_rule.cc.tmpl
index 1c866be..e03f03b 100644
--- a/src/tint/lang/base/builtin/diagnostic_rule.cc.tmpl
+++ b/src/tint/lang/base/builtin/diagnostic_rule.cc.tmpl
@@ -8,13 +8,13 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include "src/tint/lang/base/builtin/diagnostic_rule.h"
 
 #include <string>
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::builtin {
 
diff --git a/src/tint/lang/base/builtin/diagnostic_rule.h b/src/tint/lang/base/builtin/diagnostic_rule.h
index 30a9756..6b12617 100644
--- a/src/tint/lang/base/builtin/diagnostic_rule.h
+++ b/src/tint/lang/base/builtin/diagnostic_rule.h
@@ -26,7 +26,7 @@
 #include <string>
 #include <variant>
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::builtin {
 
diff --git a/src/tint/lang/base/builtin/diagnostic_rule.h.tmpl b/src/tint/lang/base/builtin/diagnostic_rule.h.tmpl
index 0555870..6ab57ba 100644
--- a/src/tint/lang/base/builtin/diagnostic_rule.h.tmpl
+++ b/src/tint/lang/base/builtin/diagnostic_rule.h.tmpl
@@ -8,7 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #ifndef SRC_TINT_LANG_BASE_BUILTIN_DIAGNOSTIC_RULE_H_
 #define SRC_TINT_LANG_BASE_BUILTIN_DIAGNOSTIC_RULE_H_
@@ -16,7 +16,7 @@
 #include <string>
 #include <variant>
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::builtin {
 
diff --git a/src/tint/lang/base/builtin/diagnostic_rule_bench.cc.tmpl b/src/tint/lang/base/builtin/diagnostic_rule_bench.cc.tmpl
index 0e42df0..43b92d7 100644
--- a/src/tint/lang/base/builtin/diagnostic_rule_bench.cc.tmpl
+++ b/src/tint/lang/base/builtin/diagnostic_rule_bench.cc.tmpl
@@ -8,7 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include "src/tint/lang/base/builtin/diagnostic_rule.h"
 
diff --git a/src/tint/lang/base/builtin/diagnostic_rule_test.cc b/src/tint/lang/base/builtin/diagnostic_rule_test.cc
index 22f1e25..23073e2 100644
--- a/src/tint/lang/base/builtin/diagnostic_rule_test.cc
+++ b/src/tint/lang/base/builtin/diagnostic_rule_test.cc
@@ -23,8 +23,8 @@
 #include <string>
 
 #include "gtest/gtest-spi.h"
-#include "src/tint/core/string.h"
 #include "src/tint/lang/base/builtin/diagnostic_rule.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::builtin {
 namespace {
diff --git a/src/tint/lang/base/builtin/diagnostic_rule_test.cc.tmpl b/src/tint/lang/base/builtin/diagnostic_rule_test.cc.tmpl
index 0c745e5..950996a 100644
--- a/src/tint/lang/base/builtin/diagnostic_rule_test.cc.tmpl
+++ b/src/tint/lang/base/builtin/diagnostic_rule_test.cc.tmpl
@@ -8,13 +8,13 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include <string>
 
 #include "gtest/gtest-spi.h"
 #include "src/tint/lang/base/builtin/diagnostic_rule.h"
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::builtin {
 namespace {
diff --git a/src/tint/lang/base/builtin/diagnostic_severity.cc.tmpl b/src/tint/lang/base/builtin/diagnostic_severity.cc.tmpl
index 9991e13..8f8844f 100644
--- a/src/tint/lang/base/builtin/diagnostic_severity.cc.tmpl
+++ b/src/tint/lang/base/builtin/diagnostic_severity.cc.tmpl
@@ -8,7 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include "src/tint/lang/base/builtin/diagnostic_severity.h"
 
diff --git a/src/tint/lang/base/builtin/diagnostic_severity.h b/src/tint/lang/base/builtin/diagnostic_severity.h
index f2c2460..cec9bfc 100644
--- a/src/tint/lang/base/builtin/diagnostic_severity.h
+++ b/src/tint/lang/base/builtin/diagnostic_severity.h
@@ -26,9 +26,9 @@
 #include <string>
 #include <unordered_map>
 
-#include "src/tint/core/diagnostic/diagnostic.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/builtin/diagnostic_rule.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::builtin {
 
diff --git a/src/tint/lang/base/builtin/diagnostic_severity.h.tmpl b/src/tint/lang/base/builtin/diagnostic_severity.h.tmpl
index 478e4f2..12aa583 100644
--- a/src/tint/lang/base/builtin/diagnostic_severity.h.tmpl
+++ b/src/tint/lang/base/builtin/diagnostic_severity.h.tmpl
@@ -8,7 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #ifndef SRC_TINT_LANG_BASE_BUILTIN_DIAGNOSTIC_SEVERITY_H_
 #define SRC_TINT_LANG_BASE_BUILTIN_DIAGNOSTIC_SEVERITY_H_
@@ -16,9 +16,9 @@
 #include <string>
 #include <unordered_map>
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 #include "src/tint/lang/base/builtin/diagnostic_rule.h"
-#include "src/tint/core/diagnostic/diagnostic.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
 
 namespace tint::builtin {
 
diff --git a/src/tint/lang/base/builtin/diagnostic_severity_bench.cc.tmpl b/src/tint/lang/base/builtin/diagnostic_severity_bench.cc.tmpl
index 86fca76..219c83a 100644
--- a/src/tint/lang/base/builtin/diagnostic_severity_bench.cc.tmpl
+++ b/src/tint/lang/base/builtin/diagnostic_severity_bench.cc.tmpl
@@ -8,7 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include "src/tint/lang/base/builtin/diagnostic_severity.h"
 
diff --git a/src/tint/lang/base/builtin/diagnostic_severity_test.cc b/src/tint/lang/base/builtin/diagnostic_severity_test.cc
index 3573d1f..4bec962 100644
--- a/src/tint/lang/base/builtin/diagnostic_severity_test.cc
+++ b/src/tint/lang/base/builtin/diagnostic_severity_test.cc
@@ -23,8 +23,8 @@
 #include <string>
 
 #include "gtest/gtest-spi.h"
-#include "src/tint/core/string.h"
 #include "src/tint/lang/base/builtin/diagnostic_severity.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::builtin {
 namespace {
diff --git a/src/tint/lang/base/builtin/diagnostic_severity_test.cc.tmpl b/src/tint/lang/base/builtin/diagnostic_severity_test.cc.tmpl
index b98af29..6d85ddb 100644
--- a/src/tint/lang/base/builtin/diagnostic_severity_test.cc.tmpl
+++ b/src/tint/lang/base/builtin/diagnostic_severity_test.cc.tmpl
@@ -8,13 +8,13 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include <string>
 
 #include "gtest/gtest-spi.h"
 #include "src/tint/lang/base/builtin/diagnostic_severity.h"
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::builtin {
 namespace {
diff --git a/src/tint/lang/base/builtin/extension.cc.tmpl b/src/tint/lang/base/builtin/extension.cc.tmpl
index 318de70..af66164 100644
--- a/src/tint/lang/base/builtin/extension.cc.tmpl
+++ b/src/tint/lang/base/builtin/extension.cc.tmpl
@@ -8,7 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "extension") -}}
 
 #include "src/tint/lang/base/builtin/extension.h"
diff --git a/src/tint/lang/base/builtin/extension.h b/src/tint/lang/base/builtin/extension.h
index a474cc6..81b45f9 100644
--- a/src/tint/lang/base/builtin/extension.h
+++ b/src/tint/lang/base/builtin/extension.h
@@ -23,8 +23,8 @@
 #ifndef SRC_TINT_LANG_BASE_BUILTIN_EXTENSION_H_
 #define SRC_TINT_LANG_BASE_BUILTIN_EXTENSION_H_
 
-#include "src/tint/core/string_stream.h"
-#include "src/tint/core/unique_vector.h"
+#include "src/tint/utils/containers/unique_vector.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::builtin {
 
diff --git a/src/tint/lang/base/builtin/extension.h.tmpl b/src/tint/lang/base/builtin/extension.h.tmpl
index a289ca2..2cdcd5a 100644
--- a/src/tint/lang/base/builtin/extension.h.tmpl
+++ b/src/tint/lang/base/builtin/extension.h.tmpl
@@ -8,14 +8,14 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "extension") -}}
 
 #ifndef SRC_TINT_LANG_BASE_BUILTIN_EXTENSION_H_
 #define SRC_TINT_LANG_BASE_BUILTIN_EXTENSION_H_
 
-#include "src/tint/core/string_stream.h"
-#include "src/tint/core/unique_vector.h"
+#include "src/tint/utils/text/string_stream.h"
+#include "src/tint/utils/containers/unique_vector.h"
 
 namespace tint::builtin {
 
diff --git a/src/tint/lang/base/builtin/extension_bench.cc.tmpl b/src/tint/lang/base/builtin/extension_bench.cc.tmpl
index 9daafc3..d4e12e5 100644
--- a/src/tint/lang/base/builtin/extension_bench.cc.tmpl
+++ b/src/tint/lang/base/builtin/extension_bench.cc.tmpl
@@ -8,7 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "extension") -}}
 
 #include "src/tint/lang/base/builtin/extension.h"
diff --git a/src/tint/lang/base/builtin/extension_test.cc b/src/tint/lang/base/builtin/extension_test.cc
index 67e24f3..68a9441 100644
--- a/src/tint/lang/base/builtin/extension_test.cc
+++ b/src/tint/lang/base/builtin/extension_test.cc
@@ -26,7 +26,7 @@
 
 #include <string>
 
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::builtin {
 namespace {
diff --git a/src/tint/lang/base/builtin/extension_test.cc.tmpl b/src/tint/lang/base/builtin/extension_test.cc.tmpl
index eb34c89..5f3e8df 100644
--- a/src/tint/lang/base/builtin/extension_test.cc.tmpl
+++ b/src/tint/lang/base/builtin/extension_test.cc.tmpl
@@ -8,7 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "extension") -}}
 
 #include "src/tint/lang/base/builtin/extension.h"
@@ -17,7 +17,7 @@
 
 #include <string>
 
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::builtin {
 namespace {
diff --git a/src/tint/lang/base/builtin/function.h b/src/tint/lang/base/builtin/function.h
index 0b2e21a..1da150c 100644
--- a/src/tint/lang/base/builtin/function.h
+++ b/src/tint/lang/base/builtin/function.h
@@ -25,7 +25,7 @@
 
 #include <string>
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 // \cond DO_NOT_DOCUMENT
 namespace tint::builtin {
diff --git a/src/tint/lang/base/builtin/function.h.tmpl b/src/tint/lang/base/builtin/function.h.tmpl
index 4968e02..821b3f1 100644
--- a/src/tint/lang/base/builtin/function.h.tmpl
+++ b/src/tint/lang/base/builtin/function.h.tmpl
@@ -16,7 +16,7 @@
 
 #include <string>
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 // \cond DO_NOT_DOCUMENT
 namespace tint::builtin {
diff --git a/src/tint/lang/base/builtin/interpolation_sampling.cc.tmpl b/src/tint/lang/base/builtin/interpolation_sampling.cc.tmpl
index e8a8d30..5755366 100644
--- a/src/tint/lang/base/builtin/interpolation_sampling.cc.tmpl
+++ b/src/tint/lang/base/builtin/interpolation_sampling.cc.tmpl
@@ -8,7 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include "src/tint/lang/base/builtin/interpolation_sampling.h"
 
diff --git a/src/tint/lang/base/builtin/interpolation_sampling.h b/src/tint/lang/base/builtin/interpolation_sampling.h
index 3cf01c2..1e8100b 100644
--- a/src/tint/lang/base/builtin/interpolation_sampling.h
+++ b/src/tint/lang/base/builtin/interpolation_sampling.h
@@ -25,7 +25,7 @@
 
 #include <string>
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::builtin {
 
diff --git a/src/tint/lang/base/builtin/interpolation_sampling.h.tmpl b/src/tint/lang/base/builtin/interpolation_sampling.h.tmpl
index 9e602fd..fca7165 100644
--- a/src/tint/lang/base/builtin/interpolation_sampling.h.tmpl
+++ b/src/tint/lang/base/builtin/interpolation_sampling.h.tmpl
@@ -8,14 +8,14 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #ifndef SRC_TINT_LANG_BASE_BUILTIN_INTERPOLATION_SAMPLING_H_
 #define SRC_TINT_LANG_BASE_BUILTIN_INTERPOLATION_SAMPLING_H_
 
 #include <string>
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::builtin {
 
diff --git a/src/tint/lang/base/builtin/interpolation_sampling_bench.cc.tmpl b/src/tint/lang/base/builtin/interpolation_sampling_bench.cc.tmpl
index ea5470d..0e933fe 100644
--- a/src/tint/lang/base/builtin/interpolation_sampling_bench.cc.tmpl
+++ b/src/tint/lang/base/builtin/interpolation_sampling_bench.cc.tmpl
@@ -8,7 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include <array>
 
diff --git a/src/tint/lang/base/builtin/interpolation_sampling_test.cc b/src/tint/lang/base/builtin/interpolation_sampling_test.cc
index 1b0042b..8e9da08 100644
--- a/src/tint/lang/base/builtin/interpolation_sampling_test.cc
+++ b/src/tint/lang/base/builtin/interpolation_sampling_test.cc
@@ -25,7 +25,7 @@
 #include <gtest/gtest.h>
 #include <string>
 
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::builtin {
 namespace {
diff --git a/src/tint/lang/base/builtin/interpolation_sampling_test.cc.tmpl b/src/tint/lang/base/builtin/interpolation_sampling_test.cc.tmpl
index 1e4b513..ef9ecf1 100644
--- a/src/tint/lang/base/builtin/interpolation_sampling_test.cc.tmpl
+++ b/src/tint/lang/base/builtin/interpolation_sampling_test.cc.tmpl
@@ -8,14 +8,14 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include "src/tint/lang/base/builtin/interpolation_sampling.h"
 
 #include <gtest/gtest.h>
 #include <string>
 
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::builtin {
 namespace {
diff --git a/src/tint/lang/base/builtin/interpolation_type.cc.tmpl b/src/tint/lang/base/builtin/interpolation_type.cc.tmpl
index 973ae35..eeecbc6 100644
--- a/src/tint/lang/base/builtin/interpolation_type.cc.tmpl
+++ b/src/tint/lang/base/builtin/interpolation_type.cc.tmpl
@@ -8,7 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include "src/tint/lang/base/builtin/interpolation_type.h"
 
diff --git a/src/tint/lang/base/builtin/interpolation_type.h b/src/tint/lang/base/builtin/interpolation_type.h
index 05fae9b..d8f3fd6 100644
--- a/src/tint/lang/base/builtin/interpolation_type.h
+++ b/src/tint/lang/base/builtin/interpolation_type.h
@@ -25,7 +25,7 @@
 
 #include <string>
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::builtin {
 
diff --git a/src/tint/lang/base/builtin/interpolation_type.h.tmpl b/src/tint/lang/base/builtin/interpolation_type.h.tmpl
index 8acf5ec..96465d5 100644
--- a/src/tint/lang/base/builtin/interpolation_type.h.tmpl
+++ b/src/tint/lang/base/builtin/interpolation_type.h.tmpl
@@ -8,14 +8,14 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #ifndef SRC_TINT_LANG_BASE_BUILTIN_INTERPOLATION_TYPE_H_
 #define SRC_TINT_LANG_BASE_BUILTIN_INTERPOLATION_TYPE_H_
 
 #include <string>
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::builtin {
 
diff --git a/src/tint/lang/base/builtin/interpolation_type_bench.cc.tmpl b/src/tint/lang/base/builtin/interpolation_type_bench.cc.tmpl
index eebc964..07e0a35 100644
--- a/src/tint/lang/base/builtin/interpolation_type_bench.cc.tmpl
+++ b/src/tint/lang/base/builtin/interpolation_type_bench.cc.tmpl
@@ -8,7 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include "src/tint/lang/base/builtin/interpolation_type.h"
 
diff --git a/src/tint/lang/base/builtin/interpolation_type_test.cc b/src/tint/lang/base/builtin/interpolation_type_test.cc
index 9924938..453c0ee 100644
--- a/src/tint/lang/base/builtin/interpolation_type_test.cc
+++ b/src/tint/lang/base/builtin/interpolation_type_test.cc
@@ -25,7 +25,7 @@
 #include <gtest/gtest.h>
 #include <string>
 
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::builtin {
 namespace {
diff --git a/src/tint/lang/base/builtin/interpolation_type_test.cc.tmpl b/src/tint/lang/base/builtin/interpolation_type_test.cc.tmpl
index 3bc1eb4..3cd4641 100644
--- a/src/tint/lang/base/builtin/interpolation_type_test.cc.tmpl
+++ b/src/tint/lang/base/builtin/interpolation_type_test.cc.tmpl
@@ -8,14 +8,14 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include "src/tint/lang/base/builtin/interpolation_type.h"
 
 #include <gtest/gtest.h>
 #include <string>
 
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::builtin {
 namespace {
diff --git a/src/tint/lang/base/builtin/number.cc b/src/tint/lang/base/builtin/number.cc
index eca2541..dc68980 100644
--- a/src/tint/lang/base/builtin/number.cc
+++ b/src/tint/lang/base/builtin/number.cc
@@ -18,9 +18,9 @@
 #include <cmath>
 #include <cstring>
 
-#include "src/tint/core/bitcast.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/memory/bitcast.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint {
 namespace {
diff --git a/src/tint/lang/base/builtin/number.h b/src/tint/lang/base/builtin/number.h
index 6563baa..68d6839 100644
--- a/src/tint/lang/base/builtin/number.h
+++ b/src/tint/lang/base/builtin/number.h
@@ -21,10 +21,10 @@
 #include <limits>
 #include <optional>
 
-#include "src/tint/core/compiler_macros.h"
-#include "src/tint/core/result.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/core/traits.h"
+#include "src/tint/utils/macros/compiler.h"
+#include "src/tint/utils/result/result.h"
+#include "src/tint/utils/text/string_stream.h"
+#include "src/tint/utils/traits/traits.h"
 
 // Forward declaration
 namespace tint {
diff --git a/src/tint/lang/base/builtin/number_test.cc b/src/tint/lang/base/builtin/number_test.cc
index b899342..c6545bc 100644
--- a/src/tint/lang/base/builtin/number_test.cc
+++ b/src/tint/lang/base/builtin/number_test.cc
@@ -17,9 +17,9 @@
 #include <variant>
 #include <vector>
 
-#include "src/tint/core/compiler_macros.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
+#include "src/tint/utils/macros/compiler.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gtest/gtest.h"
 
diff --git a/src/tint/lang/base/builtin/texel_format.cc.tmpl b/src/tint/lang/base/builtin/texel_format.cc.tmpl
index 7292e85..546d1de 100644
--- a/src/tint/lang/base/builtin/texel_format.cc.tmpl
+++ b/src/tint/lang/base/builtin/texel_format.cc.tmpl
@@ -8,7 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "texel_format") -}}
 
 #include "src/tint/lang/base/builtin/texel_format.h"
diff --git a/src/tint/lang/base/builtin/texel_format.h b/src/tint/lang/base/builtin/texel_format.h
index 2583596..953a6ed 100644
--- a/src/tint/lang/base/builtin/texel_format.h
+++ b/src/tint/lang/base/builtin/texel_format.h
@@ -23,7 +23,7 @@
 #ifndef SRC_TINT_LANG_BASE_BUILTIN_TEXEL_FORMAT_H_
 #define SRC_TINT_LANG_BASE_BUILTIN_TEXEL_FORMAT_H_
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::builtin {
 
diff --git a/src/tint/lang/base/builtin/texel_format.h.tmpl b/src/tint/lang/base/builtin/texel_format.h.tmpl
index 2d1a666..91f4677 100644
--- a/src/tint/lang/base/builtin/texel_format.h.tmpl
+++ b/src/tint/lang/base/builtin/texel_format.h.tmpl
@@ -8,13 +8,13 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "texel_format") -}}
 
 #ifndef SRC_TINT_LANG_BASE_BUILTIN_TEXEL_FORMAT_H_
 #define SRC_TINT_LANG_BASE_BUILTIN_TEXEL_FORMAT_H_
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::builtin {
 
diff --git a/src/tint/lang/base/builtin/texel_format_bench.cc.tmpl b/src/tint/lang/base/builtin/texel_format_bench.cc.tmpl
index a39b79f..453704e 100644
--- a/src/tint/lang/base/builtin/texel_format_bench.cc.tmpl
+++ b/src/tint/lang/base/builtin/texel_format_bench.cc.tmpl
@@ -8,7 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "texel_format") -}}
 
 #include "src/tint/lang/base/builtin/texel_format.h"
diff --git a/src/tint/lang/base/builtin/texel_format_test.cc b/src/tint/lang/base/builtin/texel_format_test.cc
index ceacc33..5d9e708 100644
--- a/src/tint/lang/base/builtin/texel_format_test.cc
+++ b/src/tint/lang/base/builtin/texel_format_test.cc
@@ -26,7 +26,7 @@
 
 #include <string>
 
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::builtin {
 namespace {
diff --git a/src/tint/lang/base/builtin/texel_format_test.cc.tmpl b/src/tint/lang/base/builtin/texel_format_test.cc.tmpl
index eedc1be..ca09336 100644
--- a/src/tint/lang/base/builtin/texel_format_test.cc.tmpl
+++ b/src/tint/lang/base/builtin/texel_format_test.cc.tmpl
@@ -8,7 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- Import "src/tint/core/templates/enums.tmpl.inc" -}}
+{{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := (Sem.Enum "texel_format") -}}
 
 #include "src/tint/lang/base/builtin/texel_format.h"
@@ -17,7 +17,7 @@
 
 #include <string>
 
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::builtin {
 namespace {
diff --git a/src/tint/lang/base/constant/composite.h b/src/tint/lang/base/constant/composite.h
index 7006a02..5725268 100644
--- a/src/tint/lang/base/constant/composite.h
+++ b/src/tint/lang/base/constant/composite.h
@@ -15,12 +15,12 @@
 #ifndef SRC_TINT_LANG_BASE_CONSTANT_COMPOSITE_H_
 #define SRC_TINT_LANG_BASE_CONSTANT_COMPOSITE_H_
 
-#include "src/tint/core/castable.h"
-#include "src/tint/core/hash.h"
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/base/builtin/number.h"
 #include "src/tint/lang/base/constant/value.h"
 #include "src/tint/lang/base/type/type.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::constant {
 
diff --git a/src/tint/lang/base/constant/manager.cc b/src/tint/lang/base/constant/manager.cc
index b3f7230..c5b61f6 100644
--- a/src/tint/lang/base/constant/manager.cc
+++ b/src/tint/lang/base/constant/manager.cc
@@ -14,7 +14,6 @@
 
 #include "src/tint/lang/base/constant/manager.h"
 
-#include "src/tint/core/predicates.h"
 #include "src/tint/lang/base/constant/composite.h"
 #include "src/tint/lang/base/constant/scalar.h"
 #include "src/tint/lang/base/constant/splat.h"
@@ -26,6 +25,7 @@
 #include "src/tint/lang/base/type/i32.h"
 #include "src/tint/lang/base/type/manager.h"
 #include "src/tint/lang/base/type/u32.h"
+#include "src/tint/utils/containers/predicates.h"
 
 namespace tint::constant {
 
diff --git a/src/tint/lang/base/constant/manager.h b/src/tint/lang/base/constant/manager.h
index acbf15d..77d1024 100644
--- a/src/tint/lang/base/constant/manager.h
+++ b/src/tint/lang/base/constant/manager.h
@@ -17,11 +17,11 @@
 
 #include <utility>
 
-#include "src/tint/core/hash.h"
-#include "src/tint/core/unique_allocator.h"
 #include "src/tint/lang/base/builtin/number.h"
 #include "src/tint/lang/base/constant/value.h"
 #include "src/tint/lang/base/type/manager.h"
+#include "src/tint/utils/containers/unique_allocator.h"
+#include "src/tint/utils/math/hash.h"
 
 namespace tint::constant {
 class Splat;
diff --git a/src/tint/lang/base/constant/node.h b/src/tint/lang/base/constant/node.h
index 3cac2da..67caa35 100644
--- a/src/tint/lang/base/constant/node.h
+++ b/src/tint/lang/base/constant/node.h
@@ -15,7 +15,7 @@
 #ifndef SRC_TINT_LANG_BASE_CONSTANT_NODE_H_
 #define SRC_TINT_LANG_BASE_CONSTANT_NODE_H_
 
-#include "src/tint/core/castable.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::constant {
 
diff --git a/src/tint/lang/base/constant/scalar.h b/src/tint/lang/base/constant/scalar.h
index 6959cc0..bb4c870 100644
--- a/src/tint/lang/base/constant/scalar.h
+++ b/src/tint/lang/base/constant/scalar.h
@@ -15,12 +15,12 @@
 #ifndef SRC_TINT_LANG_BASE_CONSTANT_SCALAR_H_
 #define SRC_TINT_LANG_BASE_CONSTANT_SCALAR_H_
 
-#include "src/tint/core/castable.h"
-#include "src/tint/core/hash.h"
 #include "src/tint/lang/base/builtin/number.h"
 #include "src/tint/lang/base/constant/manager.h"
 #include "src/tint/lang/base/constant/value.h"
 #include "src/tint/lang/base/type/type.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::constant {
 
diff --git a/src/tint/lang/base/constant/splat.h b/src/tint/lang/base/constant/splat.h
index 6a638a0..b5acf44 100644
--- a/src/tint/lang/base/constant/splat.h
+++ b/src/tint/lang/base/constant/splat.h
@@ -15,10 +15,10 @@
 #ifndef SRC_TINT_LANG_BASE_CONSTANT_SPLAT_H_
 #define SRC_TINT_LANG_BASE_CONSTANT_SPLAT_H_
 
-#include "src/tint/core/castable.h"
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/base/constant/composite.h"
 #include "src/tint/lang/base/type/type.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::constant {
 
diff --git a/src/tint/lang/base/constant/value.cc b/src/tint/lang/base/constant/value.cc
index 6b957fd..308d9f1 100644
--- a/src/tint/lang/base/constant/value.cc
+++ b/src/tint/lang/base/constant/value.cc
@@ -19,7 +19,7 @@
 #include "src/tint/lang/base/type/matrix.h"
 #include "src/tint/lang/base/type/struct.h"
 #include "src/tint/lang/base/type/vector.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/rtti/switch.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::constant::Value);
 
diff --git a/src/tint/lang/base/constant/value.h b/src/tint/lang/base/constant/value.h
index 7851e28..9a38f53 100644
--- a/src/tint/lang/base/constant/value.h
+++ b/src/tint/lang/base/constant/value.h
@@ -17,11 +17,11 @@
 
 #include <variant>
 
-#include "src/tint/core/castable.h"
 #include "src/tint/lang/base/builtin/number.h"
 #include "src/tint/lang/base/constant/clone_context.h"
 #include "src/tint/lang/base/constant/node.h"
 #include "src/tint/lang/base/type/type.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::constant {
 
diff --git a/src/tint/lang/base/type/abstract_float.cc b/src/tint/lang/base/type/abstract_float.cc
index 5332d7f..17e07c0 100644
--- a/src/tint/lang/base/type/abstract_float.cc
+++ b/src/tint/lang/base/type/abstract_float.cc
@@ -14,8 +14,8 @@
 
 #include "src/tint/lang/base/type/abstract_float.h"
 
-#include "src/tint/core/hash.h"
 #include "src/tint/lang/base/type/manager.h"
+#include "src/tint/utils/math/hash.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::AbstractFloat);
 
diff --git a/src/tint/lang/base/type/abstract_int.cc b/src/tint/lang/base/type/abstract_int.cc
index b1ce0ec..212a3ed 100644
--- a/src/tint/lang/base/type/abstract_int.cc
+++ b/src/tint/lang/base/type/abstract_int.cc
@@ -14,8 +14,8 @@
 
 #include "src/tint/lang/base/type/abstract_int.h"
 
-#include "src/tint/core/hash.h"
 #include "src/tint/lang/base/type/manager.h"
+#include "src/tint/utils/math/hash.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::AbstractInt);
 
diff --git a/src/tint/lang/base/type/array.cc b/src/tint/lang/base/type/array.cc
index 7f11ec7..4d915b9 100644
--- a/src/tint/lang/base/type/array.cc
+++ b/src/tint/lang/base/type/array.cc
@@ -16,12 +16,12 @@
 
 #include <string>
 
-#include "src/tint/core/hash.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/debug.h"
 #include "src/tint/lang/base/type/manager.h"
 #include "src/tint/lang/base/type/texture_dimension.h"
-#include "src/tint/symbol_table.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/text/string_stream.h"
+#include "src/tint/utils/text/symbol_table.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::Array);
 
diff --git a/src/tint/lang/base/type/array.h b/src/tint/lang/base/type/array.h
index be68a59..6be968f 100644
--- a/src/tint/lang/base/type/array.h
+++ b/src/tint/lang/base/type/array.h
@@ -20,10 +20,10 @@
 #include <string>
 #include <variant>
 
-#include "src/tint/core/compiler_macros.h"
-#include "src/tint/core/unique_vector.h"
 #include "src/tint/lang/base/type/array_count.h"
 #include "src/tint/lang/base/type/type.h"
+#include "src/tint/utils/containers/unique_vector.h"
+#include "src/tint/utils/macros/compiler.h"
 
 namespace tint::type {
 
diff --git a/src/tint/lang/base/type/array_count.h b/src/tint/lang/base/type/array_count.h
index 8fc1704..cc9e20c 100644
--- a/src/tint/lang/base/type/array_count.h
+++ b/src/tint/lang/base/type/array_count.h
@@ -20,7 +20,7 @@
 
 #include "src/tint/lang/base/type/clone_context.h"
 #include "src/tint/lang/base/type/unique_node.h"
-#include "src/tint/symbol_table.h"
+#include "src/tint/utils/text/symbol_table.h"
 
 namespace tint::type {
 
diff --git a/src/tint/lang/base/type/atomic.cc b/src/tint/lang/base/type/atomic.cc
index 25c42af..8bb2fc5 100644
--- a/src/tint/lang/base/type/atomic.cc
+++ b/src/tint/lang/base/type/atomic.cc
@@ -14,12 +14,12 @@
 
 #include "src/tint/lang/base/type/atomic.h"
 
-#include "src/tint/core/diagnostic/diagnostic.h"
-#include "src/tint/core/hash.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/debug.h"
 #include "src/tint/lang/base/type/manager.h"
 #include "src/tint/lang/base/type/reference.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/text/string_stream.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::Atomic);
 
diff --git a/src/tint/lang/base/type/builtin_structs.cc b/src/tint/lang/base/type/builtin_structs.cc
index 036aa7b..22b287c 100644
--- a/src/tint/lang/base/type/builtin_structs.cc
+++ b/src/tint/lang/base/type/builtin_structs.cc
@@ -18,7 +18,6 @@
 #include <string>
 #include <utility>
 
-#include "src/tint/core/string.h"
 #include "src/tint/lang/base/builtin/builtin.h"
 #include "src/tint/lang/base/type/abstract_float.h"
 #include "src/tint/lang/base/type/abstract_int.h"
@@ -29,8 +28,9 @@
 #include "src/tint/lang/base/type/manager.h"
 #include "src/tint/lang/base/type/u32.h"
 #include "src/tint/lang/base/type/vector.h"
-#include "src/tint/switch.h"
-#include "src/tint/symbol_table.h"
+#include "src/tint/utils/rtti/switch.h"
+#include "src/tint/utils/text/string.h"
+#include "src/tint/utils/text/symbol_table.h"
 
 namespace tint::type {
 
diff --git a/src/tint/lang/base/type/builtin_structs_test.cc b/src/tint/lang/base/type/builtin_structs_test.cc
index 8b96a0f..e2f2d13 100644
--- a/src/tint/lang/base/type/builtin_structs_test.cc
+++ b/src/tint/lang/base/type/builtin_structs_test.cc
@@ -25,7 +25,7 @@
 #include "src/tint/lang/base/type/u32.h"
 #include "src/tint/lang/base/type/vector.h"
 #include "src/tint/program_id.h"
-#include "src/tint/symbol_table.h"
+#include "src/tint/utils/text/symbol_table.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
diff --git a/src/tint/lang/base/type/depth_multisampled_texture.cc b/src/tint/lang/base/type/depth_multisampled_texture.cc
index 3f2491e..a73f739 100644
--- a/src/tint/lang/base/type/depth_multisampled_texture.cc
+++ b/src/tint/lang/base/type/depth_multisampled_texture.cc
@@ -14,12 +14,12 @@
 
 #include "src/tint/lang/base/type/depth_multisampled_texture.h"
 
-#include "src/tint/core/diagnostic/diagnostic.h"
-#include "src/tint/core/hash.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/debug.h"
 #include "src/tint/lang/base/type/manager.h"
 #include "src/tint/lang/base/type/texture_dimension.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/text/string_stream.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::DepthMultisampledTexture);
 
diff --git a/src/tint/lang/base/type/depth_texture.cc b/src/tint/lang/base/type/depth_texture.cc
index afdf8cd..cacd6ba 100644
--- a/src/tint/lang/base/type/depth_texture.cc
+++ b/src/tint/lang/base/type/depth_texture.cc
@@ -14,12 +14,12 @@
 
 #include "src/tint/lang/base/type/depth_texture.h"
 
-#include "src/tint/core/diagnostic/diagnostic.h"
-#include "src/tint/core/hash.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/debug.h"
 #include "src/tint/lang/base/type/manager.h"
 #include "src/tint/lang/base/type/texture_dimension.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/text/string_stream.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::DepthTexture);
 
diff --git a/src/tint/lang/base/type/manager.h b/src/tint/lang/base/type/manager.h
index 98c85da..2bb3a9a6 100644
--- a/src/tint/lang/base/type/manager.h
+++ b/src/tint/lang/base/type/manager.h
@@ -17,8 +17,6 @@
 
 #include <utility>
 
-#include "src/tint/core/hash.h"
-#include "src/tint/core/unique_allocator.h"
 #include "src/tint/lang/base/builtin/access.h"
 #include "src/tint/lang/base/builtin/address_space.h"
 #include "src/tint/lang/base/builtin/fluent_types.h"
@@ -28,7 +26,9 @@
 #include "src/tint/lang/base/type/struct.h"
 #include "src/tint/lang/base/type/type.h"
 #include "src/tint/lang/base/type/unique_node.h"
-#include "src/tint/symbol.h"
+#include "src/tint/utils/containers/unique_allocator.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/text/symbol.h"
 
 // Forward declarations
 namespace tint::type {
diff --git a/src/tint/lang/base/type/matrix.cc b/src/tint/lang/base/type/matrix.cc
index d2dd498..de91c6f 100644
--- a/src/tint/lang/base/type/matrix.cc
+++ b/src/tint/lang/base/type/matrix.cc
@@ -14,12 +14,12 @@
 
 #include "src/tint/lang/base/type/matrix.h"
 
-#include "src/tint/core/diagnostic/diagnostic.h"
-#include "src/tint/core/hash.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/debug.h"
 #include "src/tint/lang/base/type/manager.h"
 #include "src/tint/lang/base/type/vector.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/text/string_stream.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::Matrix);
 
diff --git a/src/tint/lang/base/type/multisampled_texture.cc b/src/tint/lang/base/type/multisampled_texture.cc
index e80f44e..9ed9ed8 100644
--- a/src/tint/lang/base/type/multisampled_texture.cc
+++ b/src/tint/lang/base/type/multisampled_texture.cc
@@ -14,12 +14,12 @@
 
 #include "src/tint/lang/base/type/multisampled_texture.h"
 
-#include "src/tint/core/diagnostic/diagnostic.h"
-#include "src/tint/core/hash.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/debug.h"
 #include "src/tint/lang/base/type/manager.h"
 #include "src/tint/lang/base/type/texture_dimension.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/text/string_stream.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::MultisampledTexture);
 
diff --git a/src/tint/lang/base/type/node.h b/src/tint/lang/base/type/node.h
index 8981852..87bb06b 100644
--- a/src/tint/lang/base/type/node.h
+++ b/src/tint/lang/base/type/node.h
@@ -15,7 +15,7 @@
 #ifndef SRC_TINT_LANG_BASE_TYPE_NODE_H_
 #define SRC_TINT_LANG_BASE_TYPE_NODE_H_
 
-#include "src/tint/core/castable.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::type {
 
diff --git a/src/tint/lang/base/type/pointer.cc b/src/tint/lang/base/type/pointer.cc
index 61fb11c..969bedf 100644
--- a/src/tint/lang/base/type/pointer.cc
+++ b/src/tint/lang/base/type/pointer.cc
@@ -14,12 +14,12 @@
 
 #include "src/tint/lang/base/type/pointer.h"
 
-#include "src/tint/core/diagnostic/diagnostic.h"
-#include "src/tint/core/hash.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/debug.h"
 #include "src/tint/lang/base/type/manager.h"
 #include "src/tint/lang/base/type/reference.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/text/string_stream.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::Pointer);
 
diff --git a/src/tint/lang/base/type/reference.cc b/src/tint/lang/base/type/reference.cc
index 3a60265..658df47 100644
--- a/src/tint/lang/base/type/reference.cc
+++ b/src/tint/lang/base/type/reference.cc
@@ -14,11 +14,11 @@
 
 #include "src/tint/lang/base/type/reference.h"
 
-#include "src/tint/core/diagnostic/diagnostic.h"
-#include "src/tint/core/hash.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/debug.h"
 #include "src/tint/lang/base/type/manager.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/text/string_stream.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::Reference);
 
diff --git a/src/tint/lang/base/type/sampled_texture.cc b/src/tint/lang/base/type/sampled_texture.cc
index a872224..6fa8bab 100644
--- a/src/tint/lang/base/type/sampled_texture.cc
+++ b/src/tint/lang/base/type/sampled_texture.cc
@@ -14,12 +14,12 @@
 
 #include "src/tint/lang/base/type/sampled_texture.h"
 
-#include "src/tint/core/diagnostic/diagnostic.h"
-#include "src/tint/core/hash.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/debug.h"
 #include "src/tint/lang/base/type/manager.h"
 #include "src/tint/lang/base/type/texture_dimension.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/text/string_stream.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::SampledTexture);
 
diff --git a/src/tint/lang/base/type/sampler.cc b/src/tint/lang/base/type/sampler.cc
index 361ff0a..e35d862 100644
--- a/src/tint/lang/base/type/sampler.cc
+++ b/src/tint/lang/base/type/sampler.cc
@@ -14,8 +14,8 @@
 
 #include "src/tint/lang/base/type/sampler.h"
 
-#include "src/tint/core/hash.h"
 #include "src/tint/lang/base/type/manager.h"
+#include "src/tint/utils/math/hash.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::Sampler);
 
diff --git a/src/tint/lang/base/type/sampler_kind.h b/src/tint/lang/base/type/sampler_kind.h
index 7025509..ce86d2e 100644
--- a/src/tint/lang/base/type/sampler_kind.h
+++ b/src/tint/lang/base/type/sampler_kind.h
@@ -15,7 +15,7 @@
 #ifndef SRC_TINT_LANG_BASE_TYPE_SAMPLER_KIND_H_
 #define SRC_TINT_LANG_BASE_TYPE_SAMPLER_KIND_H_
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::type {
 
diff --git a/src/tint/lang/base/type/storage_texture.cc b/src/tint/lang/base/type/storage_texture.cc
index 96db0fd..dbf5ec1 100644
--- a/src/tint/lang/base/type/storage_texture.cc
+++ b/src/tint/lang/base/type/storage_texture.cc
@@ -14,12 +14,12 @@
 
 #include "src/tint/lang/base/type/storage_texture.h"
 
-#include "src/tint/core/hash.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/type/f32.h"
 #include "src/tint/lang/base/type/i32.h"
 #include "src/tint/lang/base/type/manager.h"
 #include "src/tint/lang/base/type/u32.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/text/string_stream.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::StorageTexture);
 
diff --git a/src/tint/lang/base/type/struct.cc b/src/tint/lang/base/type/struct.cc
index bf72e4d..b250171 100644
--- a/src/tint/lang/base/type/struct.cc
+++ b/src/tint/lang/base/type/struct.cc
@@ -19,10 +19,10 @@
 #include <string>
 #include <utility>
 
-#include "src/tint/core/hash.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/type/manager.h"
-#include "src/tint/symbol_table.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/text/string_stream.h"
+#include "src/tint/utils/text/symbol_table.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::Struct);
 TINT_INSTANTIATE_TYPEINFO(tint::type::StructMember);
diff --git a/src/tint/lang/base/type/struct.h b/src/tint/lang/base/type/struct.h
index 966ef24..8e0f2e1 100644
--- a/src/tint/lang/base/type/struct.h
+++ b/src/tint/lang/base/type/struct.h
@@ -21,13 +21,13 @@
 #include <unordered_set>
 #include <utility>
 
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/base/builtin/address_space.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
 #include "src/tint/lang/base/builtin/interpolation.h"
 #include "src/tint/lang/base/type/node.h"
 #include "src/tint/lang/base/type/type.h"
-#include "src/tint/symbol.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/text/symbol.h"
 
 // Forward declarations
 namespace tint::type {
diff --git a/src/tint/lang/base/type/texture_dimension.h b/src/tint/lang/base/type/texture_dimension.h
index c49f23f..8c28f0d 100644
--- a/src/tint/lang/base/type/texture_dimension.h
+++ b/src/tint/lang/base/type/texture_dimension.h
@@ -15,7 +15,7 @@
 #ifndef SRC_TINT_LANG_BASE_TYPE_TEXTURE_DIMENSION_H_
 #define SRC_TINT_LANG_BASE_TYPE_TEXTURE_DIMENSION_H_
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::type {
 
diff --git a/src/tint/lang/base/type/type.cc b/src/tint/lang/base/type/type.cc
index f58c523..c10355c 100644
--- a/src/tint/lang/base/type/type.cc
+++ b/src/tint/lang/base/type/type.cc
@@ -29,7 +29,7 @@
 #include "src/tint/lang/base/type/texture.h"
 #include "src/tint/lang/base/type/u32.h"
 #include "src/tint/lang/base/type/vector.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/rtti/switch.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::Type);
 
diff --git a/src/tint/lang/base/type/type.h b/src/tint/lang/base/type/type.h
index 00ed870..e39a7af 100644
--- a/src/tint/lang/base/type/type.h
+++ b/src/tint/lang/base/type/type.h
@@ -18,10 +18,10 @@
 #include <functional>
 #include <string>
 
-#include "src/tint/core/enum_set.h"
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/base/type/clone_context.h"
 #include "src/tint/lang/base/type/unique_node.h"
+#include "src/tint/utils/containers/enum_set.h"
+#include "src/tint/utils/containers/vector.h"
 
 // Forward declarations
 namespace tint {
diff --git a/src/tint/lang/base/type/vector.cc b/src/tint/lang/base/type/vector.cc
index 0f24a1e..a2715de 100644
--- a/src/tint/lang/base/type/vector.cc
+++ b/src/tint/lang/base/type/vector.cc
@@ -14,11 +14,11 @@
 
 #include "src/tint/lang/base/type/vector.h"
 
-#include "src/tint/core/diagnostic/diagnostic.h"
-#include "src/tint/core/hash.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/debug.h"
 #include "src/tint/lang/base/type/manager.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/text/string_stream.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::type::Vector);
 
diff --git a/src/tint/lang/glsl/ast_writer/generator_impl.cc b/src/tint/lang/glsl/ast_writer/generator_impl.cc
index d23d532..495978c 100644
--- a/src/tint/lang/glsl/ast_writer/generator_impl.cc
+++ b/src/tint/lang/glsl/ast_writer/generator_impl.cc
@@ -22,12 +22,6 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/defer.h"
-#include "src/tint/core/map.h"
-#include "src/tint/core/scoped_assignment.h"
-#include "src/tint/core/string.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/debug.h"
 #include "src/tint/lang/base/constant/splat.h"
 #include "src/tint/lang/base/constant/value.h"
 #include "src/tint/lang/base/type/array.h"
@@ -80,9 +74,15 @@
 #include "src/tint/lang/wgsl/sem/value_constructor.h"
 #include "src/tint/lang/wgsl/sem/value_conversion.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
-#include "src/tint/switch.h"
 #include "src/tint/transform/manager.h"
-#include "src/tint/writer/float_to_string.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/macros/defer.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
+#include "src/tint/utils/rtti/switch.h"
+#include "src/tint/utils/text/float_to_string.h"
+#include "src/tint/utils/text/string.h"
+#include "src/tint/utils/text/string_stream.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
diff --git a/src/tint/lang/glsl/ast_writer/generator_impl.h b/src/tint/lang/glsl/ast_writer/generator_impl.h
index 906f28a..29b33f5 100644
--- a/src/tint/lang/glsl/ast_writer/generator_impl.h
+++ b/src/tint/lang/glsl/ast_writer/generator_impl.h
@@ -21,8 +21,6 @@
 #include <unordered_set>
 #include <utility>
 
-#include "src/tint/core/hash.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
 #include "src/tint/lang/glsl/ast_writer/generator.h"
 #include "src/tint/lang/glsl/ast_writer/version.h"
@@ -39,7 +37,9 @@
 #include "src/tint/lang/wgsl/ast/transform/decompose_memory_access.h"
 #include "src/tint/lang/wgsl/ast/unary_op_expression.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
-#include "src/tint/scope_stack.h"
+#include "src/tint/utils/containers/scope_stack.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/text/string_stream.h"
 #include "src/tint/writer/ast_text_generator.h"
 
 // Forward declarations
diff --git a/src/tint/lang/glsl/ast_writer/generator_impl_array_accessor_test.cc b/src/tint/lang/glsl/ast_writer/generator_impl_array_accessor_test.cc
index 2eecd86..1a02e79 100644
--- a/src/tint/lang/glsl/ast_writer/generator_impl_array_accessor_test.cc
+++ b/src/tint/lang/glsl/ast_writer/generator_impl_array_accessor_test.cc
@@ -14,7 +14,7 @@
 
 #include "src/tint/lang/glsl/ast_writer/test_helper.h"
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/lang/glsl/ast_writer/generator_impl_binary_test.cc b/src/tint/lang/glsl/ast_writer/generator_impl_binary_test.cc
index 0f23366..dd88dd0 100644
--- a/src/tint/lang/glsl/ast_writer/generator_impl_binary_test.cc
+++ b/src/tint/lang/glsl/ast_writer/generator_impl_binary_test.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/glsl/ast_writer/test_helper.h"
 #include "src/tint/lang/wgsl/ast/call_statement.h"
 #include "src/tint/lang/wgsl/ast/variable_decl_statement.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/lang/glsl/ast_writer/generator_impl_bitcast_test.cc b/src/tint/lang/glsl/ast_writer/generator_impl_bitcast_test.cc
index 383d491..8ec4194 100644
--- a/src/tint/lang/glsl/ast_writer/generator_impl_bitcast_test.cc
+++ b/src/tint/lang/glsl/ast_writer/generator_impl_bitcast_test.cc
@@ -14,7 +14,7 @@
 
 #include "src/tint/lang/glsl/ast_writer/test_helper.h"
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/lang/glsl/ast_writer/generator_impl_builtin_test.cc b/src/tint/lang/glsl/ast_writer/generator_impl_builtin_test.cc
index 3eeb561..ba7d257 100644
--- a/src/tint/lang/glsl/ast_writer/generator_impl_builtin_test.cc
+++ b/src/tint/lang/glsl/ast_writer/generator_impl_builtin_test.cc
@@ -13,11 +13,11 @@
 // limitations under the License.
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/glsl/ast_writer/test_helper.h"
 #include "src/tint/lang/wgsl/ast/call_statement.h"
 #include "src/tint/lang/wgsl/ast/stage_attribute.h"
 #include "src/tint/lang/wgsl/sem/call.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::writer::glsl {
 namespace {
diff --git a/src/tint/lang/glsl/ast_writer/generator_impl_call_test.cc b/src/tint/lang/glsl/ast_writer/generator_impl_call_test.cc
index e6c4b1b..9abe085 100644
--- a/src/tint/lang/glsl/ast_writer/generator_impl_call_test.cc
+++ b/src/tint/lang/glsl/ast_writer/generator_impl_call_test.cc
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/glsl/ast_writer/test_helper.h"
 #include "src/tint/lang/wgsl/ast/call_statement.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/lang/glsl/ast_writer/generator_impl_cast_test.cc b/src/tint/lang/glsl/ast_writer/generator_impl_cast_test.cc
index 2df0f9f..2a147ec 100644
--- a/src/tint/lang/glsl/ast_writer/generator_impl_cast_test.cc
+++ b/src/tint/lang/glsl/ast_writer/generator_impl_cast_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/glsl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/lang/glsl/ast_writer/generator_impl_identifier_test.cc b/src/tint/lang/glsl/ast_writer/generator_impl_identifier_test.cc
index 0e9be7a..a0583f3 100644
--- a/src/tint/lang/glsl/ast_writer/generator_impl_identifier_test.cc
+++ b/src/tint/lang/glsl/ast_writer/generator_impl_identifier_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/glsl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/lang/glsl/ast_writer/generator_impl_import_test.cc b/src/tint/lang/glsl/ast_writer/generator_impl_import_test.cc
index 9168c5b..fa61807 100644
--- a/src/tint/lang/glsl/ast_writer/generator_impl_import_test.cc
+++ b/src/tint/lang/glsl/ast_writer/generator_impl_import_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/glsl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/lang/glsl/ast_writer/generator_impl_type_test.cc b/src/tint/lang/glsl/ast_writer/generator_impl_type_test.cc
index 9594dd0..b546521 100644
--- a/src/tint/lang/glsl/ast_writer/generator_impl_type_test.cc
+++ b/src/tint/lang/glsl/ast_writer/generator_impl_type_test.cc
@@ -12,7 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/type/depth_texture.h"
 #include "src/tint/lang/base/type/multisampled_texture.h"
 #include "src/tint/lang/base/type/sampled_texture.h"
@@ -22,6 +21,7 @@
 #include "src/tint/lang/glsl/ast_writer/test_helper.h"
 #include "src/tint/lang/wgsl/ast/call_statement.h"
 #include "src/tint/lang/wgsl/ast/stage_attribute.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/lang/glsl/ast_writer/generator_impl_unary_op_test.cc b/src/tint/lang/glsl/ast_writer/generator_impl_unary_op_test.cc
index 9ec9e92..445d98b 100644
--- a/src/tint/lang/glsl/ast_writer/generator_impl_unary_op_test.cc
+++ b/src/tint/lang/glsl/ast_writer/generator_impl_unary_op_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/glsl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/lang/hlsl/ast_writer/generator.h b/src/tint/lang/hlsl/ast_writer/generator.h
index 7993ce8..0b4cefa 100644
--- a/src/tint/lang/hlsl/ast_writer/generator.h
+++ b/src/tint/lang/hlsl/ast_writer/generator.h
@@ -23,10 +23,10 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/bitset.h"
 #include "src/tint/lang/wgsl/ast/pipeline_stage.h"
 #include "src/tint/lang/wgsl/sem/binding_point.h"
-#include "src/tint/reflection.h"
+#include "src/tint/utils/containers/bitset.h"
+#include "src/tint/utils/reflection/reflection.h"
 #include "src/tint/writer/array_length_from_uniform_options.h"
 #include "src/tint/writer/binding_remapper_options.h"
 #include "src/tint/writer/external_texture_options.h"
diff --git a/src/tint/lang/hlsl/ast_writer/generator_impl.cc b/src/tint/lang/hlsl/ast_writer/generator_impl.cc
index 4821e69..26a7bba 100644
--- a/src/tint/lang/hlsl/ast_writer/generator_impl.cc
+++ b/src/tint/lang/hlsl/ast_writer/generator_impl.cc
@@ -22,13 +22,6 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/compiler_macros.h"
-#include "src/tint/core/defer.h"
-#include "src/tint/core/map.h"
-#include "src/tint/core/scoped_assignment.h"
-#include "src/tint/core/string.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/debug.h"
 #include "src/tint/lang/base/constant/splat.h"
 #include "src/tint/lang/base/constant/value.h"
 #include "src/tint/lang/base/type/array.h"
@@ -81,9 +74,16 @@
 #include "src/tint/lang/wgsl/sem/value_constructor.h"
 #include "src/tint/lang/wgsl/sem/value_conversion.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
-#include "src/tint/switch.h"
 #include "src/tint/transform/manager.h"
-#include "src/tint/writer/float_to_string.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/macros/compiler.h"
+#include "src/tint/utils/macros/defer.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
+#include "src/tint/utils/rtti/switch.h"
+#include "src/tint/utils/text/float_to_string.h"
+#include "src/tint/utils/text/string.h"
+#include "src/tint/utils/text/string_stream.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
diff --git a/src/tint/lang/hlsl/ast_writer/generator_impl.h b/src/tint/lang/hlsl/ast_writer/generator_impl.h
index a3bcb18..aed9cab 100644
--- a/src/tint/lang/hlsl/ast_writer/generator_impl.h
+++ b/src/tint/lang/hlsl/ast_writer/generator_impl.h
@@ -21,7 +21,6 @@
 #include <unordered_set>
 #include <utility>
 
-#include "src/tint/core/hash.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
 #include "src/tint/lang/hlsl/ast_writer/generator.h"
 #include "src/tint/lang/wgsl/ast/assignment_statement.h"
@@ -38,7 +37,8 @@
 #include "src/tint/lang/wgsl/ast/unary_op_expression.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/binding_point.h"
-#include "src/tint/scope_stack.h"
+#include "src/tint/utils/containers/scope_stack.h"
+#include "src/tint/utils/math/hash.h"
 #include "src/tint/writer/array_length_from_uniform_options.h"
 #include "src/tint/writer/ast_text_generator.h"
 
diff --git a/src/tint/lang/hlsl/ast_writer/generator_impl_array_accessor_test.cc b/src/tint/lang/hlsl/ast_writer/generator_impl_array_accessor_test.cc
index 0dc36a9..e95e088 100644
--- a/src/tint/lang/hlsl/ast_writer/generator_impl_array_accessor_test.cc
+++ b/src/tint/lang/hlsl/ast_writer/generator_impl_array_accessor_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/hlsl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
diff --git a/src/tint/lang/hlsl/ast_writer/generator_impl_binary_test.cc b/src/tint/lang/hlsl/ast_writer/generator_impl_binary_test.cc
index abd89e6..e522f5d 100644
--- a/src/tint/lang/hlsl/ast_writer/generator_impl_binary_test.cc
+++ b/src/tint/lang/hlsl/ast_writer/generator_impl_binary_test.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/hlsl/ast_writer/test_helper.h"
 #include "src/tint/lang/wgsl/ast/call_statement.h"
 #include "src/tint/lang/wgsl/ast/variable_decl_statement.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::writer::hlsl {
 namespace {
diff --git a/src/tint/lang/hlsl/ast_writer/generator_impl_bitcast_test.cc b/src/tint/lang/hlsl/ast_writer/generator_impl_bitcast_test.cc
index 3b71df5..9ada0bb 100644
--- a/src/tint/lang/hlsl/ast_writer/generator_impl_bitcast_test.cc
+++ b/src/tint/lang/hlsl/ast_writer/generator_impl_bitcast_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/hlsl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/lang/hlsl/ast_writer/generator_impl_builtin_test.cc b/src/tint/lang/hlsl/ast_writer/generator_impl_builtin_test.cc
index c0826ae..8b751ee 100644
--- a/src/tint/lang/hlsl/ast_writer/generator_impl_builtin_test.cc
+++ b/src/tint/lang/hlsl/ast_writer/generator_impl_builtin_test.cc
@@ -13,11 +13,11 @@
 // limitations under the License.
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/hlsl/ast_writer/test_helper.h"
 #include "src/tint/lang/wgsl/ast/call_statement.h"
 #include "src/tint/lang/wgsl/ast/stage_attribute.h"
 #include "src/tint/lang/wgsl/sem/call.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::writer::hlsl {
 namespace {
diff --git a/src/tint/lang/hlsl/ast_writer/generator_impl_call_test.cc b/src/tint/lang/hlsl/ast_writer/generator_impl_call_test.cc
index 5402a48..1f42caa 100644
--- a/src/tint/lang/hlsl/ast_writer/generator_impl_call_test.cc
+++ b/src/tint/lang/hlsl/ast_writer/generator_impl_call_test.cc
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/hlsl/ast_writer/test_helper.h"
 #include "src/tint/lang/wgsl/ast/call_statement.h"
+#include "src/tint/utils/text/string_stream.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
diff --git a/src/tint/lang/hlsl/ast_writer/generator_impl_cast_test.cc b/src/tint/lang/hlsl/ast_writer/generator_impl_cast_test.cc
index e49a08f..0b41ff7 100644
--- a/src/tint/lang/hlsl/ast_writer/generator_impl_cast_test.cc
+++ b/src/tint/lang/hlsl/ast_writer/generator_impl_cast_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/hlsl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::writer::hlsl {
 namespace {
diff --git a/src/tint/lang/hlsl/ast_writer/generator_impl_identifier_test.cc b/src/tint/lang/hlsl/ast_writer/generator_impl_identifier_test.cc
index 3a44542..e6f5a0a 100644
--- a/src/tint/lang/hlsl/ast_writer/generator_impl_identifier_test.cc
+++ b/src/tint/lang/hlsl/ast_writer/generator_impl_identifier_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/hlsl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::writer::hlsl {
 namespace {
diff --git a/src/tint/lang/hlsl/ast_writer/generator_impl_import_test.cc b/src/tint/lang/hlsl/ast_writer/generator_impl_import_test.cc
index 91fc891..77ea21f 100644
--- a/src/tint/lang/hlsl/ast_writer/generator_impl_import_test.cc
+++ b/src/tint/lang/hlsl/ast_writer/generator_impl_import_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/hlsl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::writer::hlsl {
 namespace {
diff --git a/src/tint/lang/hlsl/ast_writer/generator_impl_type_test.cc b/src/tint/lang/hlsl/ast_writer/generator_impl_type_test.cc
index c04ba2a..9165a56 100644
--- a/src/tint/lang/hlsl/ast_writer/generator_impl_type_test.cc
+++ b/src/tint/lang/hlsl/ast_writer/generator_impl_type_test.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/type/depth_texture.h"
 #include "src/tint/lang/base/type/multisampled_texture.h"
 #include "src/tint/lang/base/type/sampled_texture.h"
@@ -23,6 +22,7 @@
 #include "src/tint/lang/hlsl/ast_writer/test_helper.h"
 #include "src/tint/lang/wgsl/ast/call_statement.h"
 #include "src/tint/lang/wgsl/ast/stage_attribute.h"
+#include "src/tint/utils/text/string_stream.h"
 
 using ::testing::HasSubstr;
 
diff --git a/src/tint/lang/hlsl/ast_writer/generator_impl_unary_op_test.cc b/src/tint/lang/hlsl/ast_writer/generator_impl_unary_op_test.cc
index 4d25d65..17d1f78 100644
--- a/src/tint/lang/hlsl/ast_writer/generator_impl_unary_op_test.cc
+++ b/src/tint/lang/hlsl/ast_writer/generator_impl_unary_op_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/hlsl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::writer::hlsl {
 namespace {
diff --git a/src/tint/lang/hlsl/validate/hlsl.cc b/src/tint/lang/hlsl/validate/hlsl.cc
index efbf867..b6c3232 100644
--- a/src/tint/lang/hlsl/validate/hlsl.cc
+++ b/src/tint/lang/hlsl/validate/hlsl.cc
@@ -16,9 +16,9 @@
 
 #include "src/tint/lang/hlsl/validate/val.h"
 
-#include "src/tint/core/io/command.h"
-#include "src/tint/core/io/tmpfile.h"
-#include "src/tint/core/string.h"
+#include "src/tint/utils/command/command.h"
+#include "src/tint/utils/file/tmpfile.h"
+#include "src/tint/utils/text/string.h"
 
 #ifdef _WIN32
 #include <Windows.h>
diff --git a/src/tint/lang/msl/ast_writer/generator.h b/src/tint/lang/msl/ast_writer/generator.h
index 13f7a43..b99d632 100644
--- a/src/tint/lang/msl/ast_writer/generator.h
+++ b/src/tint/lang/msl/ast_writer/generator.h
@@ -21,7 +21,7 @@
 #include <unordered_set>
 #include <vector>
 
-#include "src/tint/reflection.h"
+#include "src/tint/utils/reflection/reflection.h"
 #include "src/tint/writer/array_length_from_uniform_options.h"
 #include "src/tint/writer/binding_remapper_options.h"
 #include "src/tint/writer/external_texture_options.h"
diff --git a/src/tint/lang/msl/ast_writer/generator_impl.cc b/src/tint/lang/msl/ast_writer/generator_impl.cc
index 43957a6..9a4d96c 100644
--- a/src/tint/lang/msl/ast_writer/generator_impl.cc
+++ b/src/tint/lang/msl/ast_writer/generator_impl.cc
@@ -21,10 +21,6 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/defer.h"
-#include "src/tint/core/map.h"
-#include "src/tint/core/scoped_assignment.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/constant/splat.h"
 #include "src/tint/lang/base/constant/value.h"
 #include "src/tint/lang/base/type/array.h"
@@ -84,8 +80,12 @@
 #include "src/tint/lang/wgsl/sem/value_constructor.h"
 #include "src/tint/lang/wgsl/sem/value_conversion.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
-#include "src/tint/switch.h"
 #include "src/tint/transform/manager.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/macros/defer.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
+#include "src/tint/utils/rtti/switch.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::writer::msl {
 namespace {
diff --git a/src/tint/lang/msl/ast_writer/generator_impl.h b/src/tint/lang/msl/ast_writer/generator_impl.h
index 447ed5b..2e2c9ce 100644
--- a/src/tint/lang/msl/ast_writer/generator_impl.h
+++ b/src/tint/lang/msl/ast_writer/generator_impl.h
@@ -21,7 +21,6 @@
 #include <unordered_set>
 #include <vector>
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
 #include "src/tint/lang/msl/ast_writer/generator.h"
 #include "src/tint/lang/wgsl/ast/assignment_statement.h"
@@ -41,7 +40,8 @@
 #include "src/tint/lang/wgsl/ast/unary_op_expression.h"
 #include "src/tint/lang/wgsl/program/program.h"
 #include "src/tint/lang/wgsl/sem/struct.h"
-#include "src/tint/scope_stack.h"
+#include "src/tint/utils/containers/scope_stack.h"
+#include "src/tint/utils/text/string_stream.h"
 #include "src/tint/writer/array_length_from_uniform_options.h"
 #include "src/tint/writer/ast_text_generator.h"
 
diff --git a/src/tint/lang/msl/ast_writer/generator_impl_array_accessor_test.cc b/src/tint/lang/msl/ast_writer/generator_impl_array_accessor_test.cc
index 0e39c1a..f6a18b0 100644
--- a/src/tint/lang/msl/ast_writer/generator_impl_array_accessor_test.cc
+++ b/src/tint/lang/msl/ast_writer/generator_impl_array_accessor_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/msl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
diff --git a/src/tint/lang/msl/ast_writer/generator_impl_binary_test.cc b/src/tint/lang/msl/ast_writer/generator_impl_binary_test.cc
index a7fe1c3..34274bf 100644
--- a/src/tint/lang/msl/ast_writer/generator_impl_binary_test.cc
+++ b/src/tint/lang/msl/ast_writer/generator_impl_binary_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/msl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::writer::msl {
 namespace {
diff --git a/src/tint/lang/msl/ast_writer/generator_impl_bitcast_test.cc b/src/tint/lang/msl/ast_writer/generator_impl_bitcast_test.cc
index 4c6d207..939eff0 100644
--- a/src/tint/lang/msl/ast_writer/generator_impl_bitcast_test.cc
+++ b/src/tint/lang/msl/ast_writer/generator_impl_bitcast_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/msl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
diff --git a/src/tint/lang/msl/ast_writer/generator_impl_builtin_test.cc b/src/tint/lang/msl/ast_writer/generator_impl_builtin_test.cc
index d881373..f4aea8a 100644
--- a/src/tint/lang/msl/ast_writer/generator_impl_builtin_test.cc
+++ b/src/tint/lang/msl/ast_writer/generator_impl_builtin_test.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/msl/ast_writer/test_helper.h"
 #include "src/tint/lang/wgsl/ast/call_statement.h"
 #include "src/tint/lang/wgsl/sem/call.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::writer::msl {
 namespace {
diff --git a/src/tint/lang/msl/ast_writer/generator_impl_builtin_texture_test.cc b/src/tint/lang/msl/ast_writer/generator_impl_builtin_texture_test.cc
index b8a8c70..68c5a8b 100644
--- a/src/tint/lang/msl/ast_writer/generator_impl_builtin_texture_test.cc
+++ b/src/tint/lang/msl/ast_writer/generator_impl_builtin_texture_test.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/msl/ast_writer/test_helper.h"
 #include "src/tint/lang/wgsl/ast/builtin_texture_helper_test.h"
 #include "src/tint/lang/wgsl/ast/call_statement.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::writer::msl {
 namespace {
diff --git a/src/tint/lang/msl/ast_writer/generator_impl_call_test.cc b/src/tint/lang/msl/ast_writer/generator_impl_call_test.cc
index 8eaa6e0..2c1e147 100644
--- a/src/tint/lang/msl/ast_writer/generator_impl_call_test.cc
+++ b/src/tint/lang/msl/ast_writer/generator_impl_call_test.cc
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/msl/ast_writer/test_helper.h"
 #include "src/tint/lang/wgsl/ast/call_statement.h"
+#include "src/tint/utils/text/string_stream.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
diff --git a/src/tint/lang/msl/ast_writer/generator_impl_cast_test.cc b/src/tint/lang/msl/ast_writer/generator_impl_cast_test.cc
index 47413be..148cea9 100644
--- a/src/tint/lang/msl/ast_writer/generator_impl_cast_test.cc
+++ b/src/tint/lang/msl/ast_writer/generator_impl_cast_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/msl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::writer::msl {
 namespace {
diff --git a/src/tint/lang/msl/ast_writer/generator_impl_identifier_test.cc b/src/tint/lang/msl/ast_writer/generator_impl_identifier_test.cc
index 39b527d..27cce98 100644
--- a/src/tint/lang/msl/ast_writer/generator_impl_identifier_test.cc
+++ b/src/tint/lang/msl/ast_writer/generator_impl_identifier_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/msl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::writer::msl {
 namespace {
diff --git a/src/tint/lang/msl/ast_writer/generator_impl_import_test.cc b/src/tint/lang/msl/ast_writer/generator_impl_import_test.cc
index 044da9f..71d7874 100644
--- a/src/tint/lang/msl/ast_writer/generator_impl_import_test.cc
+++ b/src/tint/lang/msl/ast_writer/generator_impl_import_test.cc
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/msl/ast_writer/test_helper.h"
 #include "src/tint/lang/wgsl/sem/call.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::writer::msl {
 namespace {
diff --git a/src/tint/lang/msl/ast_writer/generator_impl_member_accessor_test.cc b/src/tint/lang/msl/ast_writer/generator_impl_member_accessor_test.cc
index 6a0bc73..92f6b7e 100644
--- a/src/tint/lang/msl/ast_writer/generator_impl_member_accessor_test.cc
+++ b/src/tint/lang/msl/ast_writer/generator_impl_member_accessor_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/msl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::writer::msl {
 namespace {
diff --git a/src/tint/lang/msl/ast_writer/generator_impl_type_test.cc b/src/tint/lang/msl/ast_writer/generator_impl_type_test.cc
index 4ba5cc0..97877a5 100644
--- a/src/tint/lang/msl/ast_writer/generator_impl_type_test.cc
+++ b/src/tint/lang/msl/ast_writer/generator_impl_type_test.cc
@@ -16,7 +16,6 @@
 
 #include "gmock/gmock.h"
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/type/depth_multisampled_texture.h"
 #include "src/tint/lang/base/type/depth_texture.h"
 #include "src/tint/lang/base/type/multisampled_texture.h"
@@ -25,6 +24,7 @@
 #include "src/tint/lang/base/type/storage_texture.h"
 #include "src/tint/lang/base/type/texture_dimension.h"
 #include "src/tint/lang/msl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::writer::msl {
 namespace {
diff --git a/src/tint/lang/msl/ast_writer/generator_impl_unary_op_test.cc b/src/tint/lang/msl/ast_writer/generator_impl_unary_op_test.cc
index a3d9abe..0c62e6f 100644
--- a/src/tint/lang/msl/ast_writer/generator_impl_unary_op_test.cc
+++ b/src/tint/lang/msl/ast_writer/generator_impl_unary_op_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/msl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::writer::msl {
 namespace {
diff --git a/src/tint/lang/msl/ast_writer/generator_support.cc b/src/tint/lang/msl/ast_writer/generator_support.cc
index 379d385..64ec6d8 100644
--- a/src/tint/lang/msl/ast_writer/generator_support.cc
+++ b/src/tint/lang/msl/ast_writer/generator_support.cc
@@ -17,7 +17,6 @@
 #include <cmath>
 #include <limits>
 
-#include "src/tint/debug.h"
 #include "src/tint/lang/base/type/array.h"
 #include "src/tint/lang/base/type/atomic.h"
 #include "src/tint/lang/base/type/f16.h"
@@ -27,8 +26,9 @@
 #include "src/tint/lang/base/type/struct.h"
 #include "src/tint/lang/base/type/u32.h"
 #include "src/tint/lang/base/type/vector.h"
-#include "src/tint/switch.h"
-#include "src/tint/writer/float_to_string.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/rtti/switch.h"
+#include "src/tint/utils/text/float_to_string.h"
 
 namespace tint::writer::msl {
 
diff --git a/src/tint/lang/msl/ast_writer/generator_support.h b/src/tint/lang/msl/ast_writer/generator_support.h
index d898b56..c74d20b 100644
--- a/src/tint/lang/msl/ast_writer/generator_support.h
+++ b/src/tint/lang/msl/ast_writer/generator_support.h
@@ -18,10 +18,10 @@
 #include <cstdint>
 #include <string>
 
-#include "src/tint/core/diagnostic/diagnostic.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
 #include "src/tint/lang/base/builtin/interpolation.h"
 #include "src/tint/lang/base/type/type.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
 
 namespace tint::writer::msl {
 
diff --git a/src/tint/lang/msl/validate/msl.cc b/src/tint/lang/msl/validate/msl.cc
index 8ce01c0..32c0e8d 100644
--- a/src/tint/lang/msl/validate/msl.cc
+++ b/src/tint/lang/msl/validate/msl.cc
@@ -14,10 +14,10 @@
 
 #include "src/tint/lang/msl/validate/val.h"
 
-#include "src/tint/core/io/command.h"
-#include "src/tint/core/io/tmpfile.h"
 #include "src/tint/lang/wgsl/ast/module.h"
 #include "src/tint/lang/wgsl/program/program.h"
+#include "src/tint/utils/command/command.h"
+#include "src/tint/utils/file/tmpfile.h"
 
 namespace tint::msl::validate {
 
diff --git a/src/tint/lang/msl/writer/generator_impl_ir.cc b/src/tint/lang/msl/writer/generator_impl_ir.cc
index cd60598..9db67db 100644
--- a/src/tint/lang/msl/writer/generator_impl_ir.cc
+++ b/src/tint/lang/msl/writer/generator_impl_ir.cc
@@ -14,7 +14,6 @@
 
 #include "src/tint/lang/msl/writer/generator_impl_ir.h"
 
-#include "src/tint/core/scoped_assignment.h"
 #include "src/tint/ir/constant.h"
 #include "src/tint/ir/validator.h"
 #include "src/tint/lang/base/constant/composite.h"
@@ -38,8 +37,9 @@
 #include "src/tint/lang/base/type/vector.h"
 #include "src/tint/lang/base/type/void.h"
 #include "src/tint/lang/msl/ast_writer/generator_support.h"
-#include "src/tint/switch.h"
 #include "src/tint/transform/manager.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
+#include "src/tint/utils/rtti/switch.h"
 
 namespace tint::writer::msl {
 namespace {
diff --git a/src/tint/lang/msl/writer/generator_impl_ir.h b/src/tint/lang/msl/writer/generator_impl_ir.h
index 83374ee..3b2cb93 100644
--- a/src/tint/lang/msl/writer/generator_impl_ir.h
+++ b/src/tint/lang/msl/writer/generator_impl_ir.h
@@ -18,10 +18,10 @@
 #include <string>
 #include <unordered_set>
 
-#include "src/tint/core/diagnostic/diagnostic.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/ir/module.h"
 #include "src/tint/lang/base/type/texture.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
+#include "src/tint/utils/text/string_stream.h"
 #include "src/tint/writer/ir_text_generator.h"
 
 namespace tint::writer::msl {
diff --git a/src/tint/lang/msl/writer/generator_impl_ir_constant_test.cc b/src/tint/lang/msl/writer/generator_impl_ir_constant_test.cc
index abc77e3..134eedf 100644
--- a/src/tint/lang/msl/writer/generator_impl_ir_constant_test.cc
+++ b/src/tint/lang/msl/writer/generator_impl_ir_constant_test.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string.h"
 #include "src/tint/lang/base/type/array.h"
 #include "src/tint/lang/base/type/matrix.h"
 #include "src/tint/lang/msl/writer/test_helper_ir.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::writer::msl {
 namespace {
diff --git a/src/tint/lang/msl/writer/generator_impl_ir_type_test.cc b/src/tint/lang/msl/writer/generator_impl_ir_type_test.cc
index a8a8aa6..e070249 100644
--- a/src/tint/lang/msl/writer/generator_impl_ir_type_test.cc
+++ b/src/tint/lang/msl/writer/generator_impl_ir_type_test.cc
@@ -14,7 +14,6 @@
 
 #include "gmock/gmock.h"
 
-#include "src/tint/core/string.h"
 #include "src/tint/lang/base/type/array.h"
 #include "src/tint/lang/base/type/depth_multisampled_texture.h"
 #include "src/tint/lang/base/type/depth_texture.h"
@@ -24,6 +23,7 @@
 #include "src/tint/lang/base/type/storage_texture.h"
 #include "src/tint/lang/base/type/struct.h"
 #include "src/tint/lang/msl/writer/test_helper_ir.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::writer::msl {
 namespace {
diff --git a/src/tint/lang/spirv/ast_writer/builder.cc b/src/tint/lang/spirv/ast_writer/builder.cc
index 8602113..4305fdc 100644
--- a/src/tint/lang/spirv/ast_writer/builder.cc
+++ b/src/tint/lang/spirv/ast_writer/builder.cc
@@ -18,10 +18,6 @@
 #include <utility>
 
 #include "spirv/unified1/GLSL.std.450.h"
-#include "src/tint/core/compiler_macros.h"
-#include "src/tint/core/defer.h"
-#include "src/tint/core/map.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/constant/value.h"
 #include "src/tint/lang/base/type/array.h"
 #include "src/tint/lang/base/type/atomic.h"
@@ -52,6 +48,10 @@
 #include "src/tint/lang/wgsl/sem/value_constructor.h"
 #include "src/tint/lang/wgsl/sem/value_conversion.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/macros/compiler.h"
+#include "src/tint/utils/macros/defer.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::writer::spirv {
 namespace {
diff --git a/src/tint/lang/spirv/ast_writer/builder.h b/src/tint/lang/spirv/ast_writer/builder.h
index 30a3d64..fdc84b1 100644
--- a/src/tint/lang/spirv/ast_writer/builder.h
+++ b/src/tint/lang/spirv/ast_writer/builder.h
@@ -41,7 +41,7 @@
 #include "src/tint/lang/wgsl/ast/variable_decl_statement.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/builtin.h"
-#include "src/tint/scope_stack.h"
+#include "src/tint/utils/containers/scope_stack.h"
 
 // Forward declarations
 namespace tint::sem {
diff --git a/src/tint/lang/spirv/ast_writer/builder_builtin_test.cc b/src/tint/lang/spirv/ast_writer/builder_builtin_test.cc
index 99455bc..a0a51e4 100644
--- a/src/tint/lang/spirv/ast_writer/builder_builtin_test.cc
+++ b/src/tint/lang/spirv/ast_writer/builder_builtin_test.cc
@@ -12,13 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string.h"
 #include "src/tint/lang/base/type/depth_texture.h"
 #include "src/tint/lang/base/type/texture_dimension.h"
 #include "src/tint/lang/spirv/ast_writer/spv_dump.h"
 #include "src/tint/lang/spirv/ast_writer/test_helper.h"
 #include "src/tint/lang/wgsl/ast/call_statement.h"
 #include "src/tint/lang/wgsl/ast/stage_attribute.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::writer::spirv {
 namespace {
diff --git a/src/tint/lang/spirv/ast_writer/generator.h b/src/tint/lang/spirv/ast_writer/generator.h
index 3bee947..c975510 100644
--- a/src/tint/lang/spirv/ast_writer/generator.h
+++ b/src/tint/lang/spirv/ast_writer/generator.h
@@ -19,7 +19,7 @@
 #include <string>
 #include <vector>
 
-#include "src/tint/reflection.h"
+#include "src/tint/utils/reflection/reflection.h"
 #include "src/tint/writer/binding_remapper_options.h"
 #include "src/tint/writer/external_texture_options.h"
 #include "src/tint/writer/writer.h"
diff --git a/src/tint/lang/spirv/ast_writer/operand.h b/src/tint/lang/spirv/ast_writer/operand.h
index 777d10f..a03682b 100644
--- a/src/tint/lang/spirv/ast_writer/operand.h
+++ b/src/tint/lang/spirv/ast_writer/operand.h
@@ -20,7 +20,7 @@
 #include <variant>
 #include <vector>
 
-#include "src/tint/core/hash.h"
+#include "src/tint/utils/math/hash.h"
 
 namespace tint::writer::spirv {
 
diff --git a/src/tint/lang/spirv/ast_writer/scalar_constant.h b/src/tint/lang/spirv/ast_writer/scalar_constant.h
index 39a3dfd..da1b7b6 100644
--- a/src/tint/lang/spirv/ast_writer/scalar_constant.h
+++ b/src/tint/lang/spirv/ast_writer/scalar_constant.h
@@ -20,8 +20,8 @@
 #include <cstring>
 #include <functional>
 
-#include "src/tint/core/hash.h"
 #include "src/tint/lang/base/builtin/number.h"
+#include "src/tint/utils/math/hash.h"
 
 // Forward declarations
 namespace tint::sem {
diff --git a/src/tint/lang/spirv/reader/attributes.h b/src/tint/lang/spirv/reader/attributes.h
index 86e628b..83ee360 100644
--- a/src/tint/lang/spirv/reader/attributes.h
+++ b/src/tint/lang/spirv/reader/attributes.h
@@ -15,11 +15,11 @@
 #ifndef SRC_TINT_LANG_SPIRV_READER_ATTRIBUTES_H_
 #define SRC_TINT_LANG_SPIRV_READER_ATTRIBUTES_H_
 
-#include "src/tint/core/enum_set.h"
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
 #include "src/tint/lang/wgsl/ast/attribute.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
+#include "src/tint/utils/containers/enum_set.h"
+#include "src/tint/utils/containers/vector.h"
 
 namespace tint::reader::spirv {
 
diff --git a/src/tint/lang/spirv/reader/construct.h b/src/tint/lang/spirv/reader/construct.h
index bd4c2dd..e0b9d75 100644
--- a/src/tint/lang/spirv/reader/construct.h
+++ b/src/tint/lang/spirv/reader/construct.h
@@ -18,8 +18,8 @@
 #include <memory>
 #include <string>
 
-#include "src/tint/core/string_stream.h"
-#include "src/tint/core/vector.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::reader::spirv {
 
diff --git a/src/tint/lang/spirv/reader/entry_point_info.h b/src/tint/lang/spirv/reader/entry_point_info.h
index addd5bb..608c50a 100644
--- a/src/tint/lang/spirv/reader/entry_point_info.h
+++ b/src/tint/lang/spirv/reader/entry_point_info.h
@@ -17,8 +17,8 @@
 
 #include <string>
 
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/wgsl/ast/pipeline_stage.h"
+#include "src/tint/utils/containers/vector.h"
 
 namespace tint::reader::spirv {
 
diff --git a/src/tint/lang/spirv/reader/enum_converter_test.cc b/src/tint/lang/spirv/reader/enum_converter_test.cc
index a312caf..5783c07 100644
--- a/src/tint/lang/spirv/reader/enum_converter_test.cc
+++ b/src/tint/lang/spirv/reader/enum_converter_test.cc
@@ -17,8 +17,8 @@
 #include <string>
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/type/texture_dimension.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::reader::spirv {
 namespace {
diff --git a/src/tint/lang/spirv/reader/fail_stream.h b/src/tint/lang/spirv/reader/fail_stream.h
index 2af1143..60ab1b5 100644
--- a/src/tint/lang/spirv/reader/fail_stream.h
+++ b/src/tint/lang/spirv/reader/fail_stream.h
@@ -15,7 +15,7 @@
 #ifndef SRC_TINT_LANG_SPIRV_READER_FAIL_STREAM_H_
 #define SRC_TINT_LANG_SPIRV_READER_FAIL_STREAM_H_
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::reader::spirv {
 
diff --git a/src/tint/lang/spirv/reader/fail_stream_test.cc b/src/tint/lang/spirv/reader/fail_stream_test.cc
index f059f71..7979ef6 100644
--- a/src/tint/lang/spirv/reader/fail_stream_test.cc
+++ b/src/tint/lang/spirv/reader/fail_stream_test.cc
@@ -15,7 +15,7 @@
 #include "src/tint/lang/spirv/reader/fail_stream.h"
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::reader::spirv {
 namespace {
diff --git a/src/tint/lang/spirv/reader/function.cc b/src/tint/lang/spirv/reader/function.cc
index dd4c755..f5c6745 100644
--- a/src/tint/lang/spirv/reader/function.cc
+++ b/src/tint/lang/spirv/reader/function.cc
@@ -17,8 +17,6 @@
 #include <algorithm>
 #include <array>
 
-#include "src/tint/core/hashmap.h"
-#include "src/tint/core/hashset.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
 #include "src/tint/lang/base/builtin/function.h"
 #include "src/tint/lang/base/type/depth_texture.h"
@@ -39,7 +37,9 @@
 #include "src/tint/lang/wgsl/ast/transform/spirv_atomic.h"
 #include "src/tint/lang/wgsl/ast/unary_op_expression.h"
 #include "src/tint/lang/wgsl/ast/variable_decl_statement.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/hashmap.h"
+#include "src/tint/utils/containers/hashset.h"
+#include "src/tint/utils/rtti/switch.h"
 
 // Terms:
 //    CFG: the control flow graph of the function, where basic blocks are the
diff --git a/src/tint/lang/spirv/reader/function.h b/src/tint/lang/spirv/reader/function.h
index 3a7eecd..4bf0377 100644
--- a/src/tint/lang/spirv/reader/function.h
+++ b/src/tint/lang/spirv/reader/function.h
@@ -24,11 +24,11 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/spirv/reader/attributes.h"
 #include "src/tint/lang/spirv/reader/construct.h"
 #include "src/tint/lang/spirv/reader/parser_impl.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::reader::spirv {
 
diff --git a/src/tint/lang/spirv/reader/function_arithmetic_test.cc b/src/tint/lang/spirv/reader/function_arithmetic_test.cc
index 468fe13..1b6fb8b 100644
--- a/src/tint/lang/spirv/reader/function_arithmetic_test.cc
+++ b/src/tint/lang/spirv/reader/function_arithmetic_test.cc
@@ -13,10 +13,10 @@
 // limitations under the License.
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/spirv/reader/function.h"
 #include "src/tint/lang/spirv/reader/parser_impl_test_helper.h"
 #include "src/tint/lang/spirv/reader/spirv_tools_helpers_test.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::reader::spirv {
 namespace {
diff --git a/src/tint/lang/spirv/reader/function_bit_test.cc b/src/tint/lang/spirv/reader/function_bit_test.cc
index 071a91f..fe09251 100644
--- a/src/tint/lang/spirv/reader/function_bit_test.cc
+++ b/src/tint/lang/spirv/reader/function_bit_test.cc
@@ -12,10 +12,10 @@
 // limitations under the License.
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/spirv/reader/function.h"
 #include "src/tint/lang/spirv/reader/parser_impl_test_helper.h"
 #include "src/tint/lang/spirv/reader/spirv_tools_helpers_test.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::reader::spirv {
 namespace {
diff --git a/src/tint/lang/spirv/reader/function_cfg_test.cc b/src/tint/lang/spirv/reader/function_cfg_test.cc
index de9a666..814927c 100644
--- a/src/tint/lang/spirv/reader/function_cfg_test.cc
+++ b/src/tint/lang/spirv/reader/function_cfg_test.cc
@@ -13,10 +13,10 @@
 // limitations under the License.
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/spirv/reader/function.h"
 #include "src/tint/lang/spirv/reader/parser_impl_test_helper.h"
 #include "src/tint/lang/spirv/reader/spirv_tools_helpers_test.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::reader::spirv {
 namespace {
diff --git a/src/tint/lang/spirv/reader/function_decl_test.cc b/src/tint/lang/spirv/reader/function_decl_test.cc
index c3fa1d2..6e7c5a4 100644
--- a/src/tint/lang/spirv/reader/function_decl_test.cc
+++ b/src/tint/lang/spirv/reader/function_decl_test.cc
@@ -13,10 +13,10 @@
 // limitations under the License.
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/spirv/reader/function.h"
 #include "src/tint/lang/spirv/reader/parser_impl_test_helper.h"
 #include "src/tint/lang/spirv/reader/spirv_tools_helpers_test.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::reader::spirv {
 namespace {
diff --git a/src/tint/lang/spirv/reader/function_logical_test.cc b/src/tint/lang/spirv/reader/function_logical_test.cc
index a1baa6a..91ee8f5 100644
--- a/src/tint/lang/spirv/reader/function_logical_test.cc
+++ b/src/tint/lang/spirv/reader/function_logical_test.cc
@@ -13,10 +13,10 @@
 // limitations under the License.
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/spirv/reader/function.h"
 #include "src/tint/lang/spirv/reader/parser_impl_test_helper.h"
 #include "src/tint/lang/spirv/reader/spirv_tools_helpers_test.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::reader::spirv {
 namespace {
diff --git a/src/tint/lang/spirv/reader/function_var_test.cc b/src/tint/lang/spirv/reader/function_var_test.cc
index 6e619e5..4485836 100644
--- a/src/tint/lang/spirv/reader/function_var_test.cc
+++ b/src/tint/lang/spirv/reader/function_var_test.cc
@@ -13,10 +13,10 @@
 // limitations under the License.
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/spirv/reader/function.h"
 #include "src/tint/lang/spirv/reader/parser_impl_test_helper.h"
 #include "src/tint/lang/spirv/reader/spirv_tools_helpers_test.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::reader::spirv {
 namespace {
diff --git a/src/tint/lang/spirv/reader/namer.cc b/src/tint/lang/spirv/reader/namer.cc
index bc0bfe4..ed5583a 100644
--- a/src/tint/lang/spirv/reader/namer.cc
+++ b/src/tint/lang/spirv/reader/namer.cc
@@ -17,9 +17,9 @@
 #include <algorithm>
 #include <unordered_set>
 
-#include "src/tint/core/string_stream.h"
-#include "src/tint/debug.h"
 #include "src/tint/lang/base/builtin/function.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::reader::spirv {
 
diff --git a/src/tint/lang/spirv/reader/namer_test.cc b/src/tint/lang/spirv/reader/namer_test.cc
index 2873dd9..536690f 100644
--- a/src/tint/lang/spirv/reader/namer_test.cc
+++ b/src/tint/lang/spirv/reader/namer_test.cc
@@ -15,8 +15,8 @@
 #include "src/tint/lang/spirv/reader/namer.h"
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/builtin/function.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::reader::spirv {
 namespace {
diff --git a/src/tint/lang/spirv/reader/parser_impl.cc b/src/tint/lang/spirv/reader/parser_impl.cc
index 2805cac..dc3ea02 100644
--- a/src/tint/lang/spirv/reader/parser_impl.cc
+++ b/src/tint/lang/spirv/reader/parser_impl.cc
@@ -20,7 +20,6 @@
 #include <utility>
 
 #include "source/opt/build_module.h"
-#include "src/tint/core/unique_vector.h"
 #include "src/tint/lang/base/type/depth_texture.h"
 #include "src/tint/lang/base/type/multisampled_texture.h"
 #include "src/tint/lang/base/type/sampled_texture.h"
@@ -31,7 +30,8 @@
 #include "src/tint/lang/wgsl/ast/id_attribute.h"
 #include "src/tint/lang/wgsl/ast/interpolate_attribute.h"
 #include "src/tint/lang/wgsl/ast/unary_op_expression.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/unique_vector.h"
+#include "src/tint/utils/rtti/switch.h"
 
 namespace tint::reader::spirv {
 
diff --git a/src/tint/lang/spirv/reader/parser_impl.h b/src/tint/lang/spirv/reader/parser_impl.h
index 1c8120b..9f4e111 100644
--- a/src/tint/lang/spirv/reader/parser_impl.h
+++ b/src/tint/lang/spirv/reader/parser_impl.h
@@ -22,9 +22,9 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/compiler_macros.h"
-#include "src/tint/core/hashmap.h"
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/containers/hashmap.h"
+#include "src/tint/utils/macros/compiler.h"
+#include "src/tint/utils/text/string_stream.h"
 
 TINT_BEGIN_DISABLE_WARNING(NEWLINE_EOF);
 TINT_BEGIN_DISABLE_WARNING(OLD_STYLE_CAST);
diff --git a/src/tint/lang/spirv/reader/parser_impl_function_decl_test.cc b/src/tint/lang/spirv/reader/parser_impl_function_decl_test.cc
index 9ed45c4..bbfc6ff 100644
--- a/src/tint/lang/spirv/reader/parser_impl_function_decl_test.cc
+++ b/src/tint/lang/spirv/reader/parser_impl_function_decl_test.cc
@@ -13,9 +13,9 @@
 // limitations under the License.
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/spirv/reader/parser_impl_test_helper.h"
 #include "src/tint/lang/spirv/reader/spirv_tools_helpers_test.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::reader::spirv {
 namespace {
diff --git a/src/tint/lang/spirv/reader/parser_impl_handle_test.cc b/src/tint/lang/spirv/reader/parser_impl_handle_test.cc
index bb9cbef..01cf8cb 100644
--- a/src/tint/lang/spirv/reader/parser_impl_handle_test.cc
+++ b/src/tint/lang/spirv/reader/parser_impl_handle_test.cc
@@ -15,10 +15,10 @@
 #include <ostream>
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/spirv/reader/function.h"
 #include "src/tint/lang/spirv/reader/parser_impl_test_helper.h"
 #include "src/tint/lang/spirv/reader/spirv_tools_helpers_test.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::reader::spirv {
 namespace {
diff --git a/src/tint/lang/spirv/reader/parser_impl_module_var_test.cc b/src/tint/lang/spirv/reader/parser_impl_module_var_test.cc
index 8db54cc..2273c29 100644
--- a/src/tint/lang/spirv/reader/parser_impl_module_var_test.cc
+++ b/src/tint/lang/spirv/reader/parser_impl_module_var_test.cc
@@ -13,10 +13,10 @@
 // limitations under the License.
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string.h"
 #include "src/tint/lang/spirv/reader/function.h"
 #include "src/tint/lang/spirv/reader/parser_impl_test_helper.h"
 #include "src/tint/lang/spirv/reader/spirv_tools_helpers_test.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::reader::spirv {
 namespace {
diff --git a/src/tint/lang/spirv/reader/parser_impl_test_helper.cc b/src/tint/lang/spirv/reader/parser_impl_test_helper.cc
index 8fab646..37d4012 100644
--- a/src/tint/lang/spirv/reader/parser_impl_test_helper.cc
+++ b/src/tint/lang/spirv/reader/parser_impl_test_helper.cc
@@ -13,9 +13,9 @@
 // limitations under the License.
 
 #include "src/tint/lang/spirv/reader/parser_impl_test_helper.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/wgsl/ast_writer/generator_impl.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/rtti/switch.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/lang/spirv/reader/parser_impl_test_helper.h b/src/tint/lang/spirv/reader/parser_impl_test_helper.h
index 2b60ba6..a7968f7 100644
--- a/src/tint/lang/spirv/reader/parser_impl_test_helper.h
+++ b/src/tint/lang/spirv/reader/parser_impl_test_helper.h
@@ -21,7 +21,7 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/compiler_macros.h"
+#include "src/tint/utils/macros/compiler.h"
 
 TINT_BEGIN_DISABLE_WARNING(NEWLINE_EOF);
 TINT_BEGIN_DISABLE_WARNING(OLD_STYLE_CAST);
diff --git a/src/tint/lang/spirv/reader/parser_type.cc b/src/tint/lang/spirv/reader/parser_type.cc
index 124c46f..8260fe6 100644
--- a/src/tint/lang/spirv/reader/parser_type.cc
+++ b/src/tint/lang/spirv/reader/parser_type.cc
@@ -19,14 +19,14 @@
 #include <unordered_map>
 #include <utility>
 
-#include "src/tint/core/hash.h"
-#include "src/tint/core/map.h"
-#include "src/tint/core/string.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/core/unique_allocator.h"
 #include "src/tint/lang/base/type/texture_dimension.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/containers/unique_allocator.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/rtti/switch.h"
+#include "src/tint/utils/text/string.h"
+#include "src/tint/utils/text/string_stream.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::reader::spirv::Type);
 TINT_INSTANTIATE_TYPEINFO(tint::reader::spirv::Void);
diff --git a/src/tint/lang/spirv/reader/parser_type.h b/src/tint/lang/spirv/reader/parser_type.h
index 3a99f49..0b2ecc9 100644
--- a/src/tint/lang/spirv/reader/parser_type.h
+++ b/src/tint/lang/spirv/reader/parser_type.h
@@ -19,15 +19,15 @@
 #include <string>
 #include <vector>
 
-#include "src/tint/core/block_allocator.h"
-#include "src/tint/core/castable.h"
 #include "src/tint/lang/base/builtin/access.h"
 #include "src/tint/lang/base/builtin/address_space.h"
 #include "src/tint/lang/base/builtin/texel_format.h"
 #include "src/tint/lang/base/type/sampler_kind.h"
 #include "src/tint/lang/base/type/texture_dimension.h"
 #include "src/tint/lang/wgsl/ast/type.h"
-#include "src/tint/symbol.h"
+#include "src/tint/utils/memory/block_allocator.h"
+#include "src/tint/utils/rtti/castable.h"
+#include "src/tint/utils/text/symbol.h"
 
 // Forward declarations
 namespace tint {
diff --git a/src/tint/lang/spirv/reader/spirv_tools_helpers_test.cc b/src/tint/lang/spirv/reader/spirv_tools_helpers_test.cc
index 2852c2b..2c3985d 100644
--- a/src/tint/lang/spirv/reader/spirv_tools_helpers_test.cc
+++ b/src/tint/lang/spirv/reader/spirv_tools_helpers_test.cc
@@ -16,7 +16,7 @@
 
 #include "gtest/gtest.h"
 #include "spirv-tools/libspirv.hpp"
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::reader::spirv::test {
 
diff --git a/src/tint/lang/spirv/reader/usage.cc b/src/tint/lang/spirv/reader/usage.cc
index b7a05d0..7139832 100644
--- a/src/tint/lang/spirv/reader/usage.cc
+++ b/src/tint/lang/spirv/reader/usage.cc
@@ -14,7 +14,7 @@
 
 #include "src/tint/lang/spirv/reader/usage.h"
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::reader::spirv {
 
diff --git a/src/tint/lang/spirv/reader/usage.h b/src/tint/lang/spirv/reader/usage.h
index cc66060..2184785 100644
--- a/src/tint/lang/spirv/reader/usage.h
+++ b/src/tint/lang/spirv/reader/usage.h
@@ -17,7 +17,7 @@
 
 #include <string>
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::reader::spirv {
 
diff --git a/src/tint/lang/spirv/reader/usage_test.cc b/src/tint/lang/spirv/reader/usage_test.cc
index 0c5c3d0..8571d23 100644
--- a/src/tint/lang/spirv/reader/usage_test.cc
+++ b/src/tint/lang/spirv/reader/usage_test.cc
@@ -16,8 +16,8 @@
 #include <vector>
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/spirv/reader/parser_impl_test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::reader::spirv {
 namespace {
diff --git a/src/tint/lang/spirv/writer/generator_impl_ir.cc b/src/tint/lang/spirv/writer/generator_impl_ir.cc
index 9c3c034..2dc5dee 100644
--- a/src/tint/lang/spirv/writer/generator_impl_ir.cc
+++ b/src/tint/lang/spirv/writer/generator_impl_ir.cc
@@ -18,7 +18,6 @@
 
 #include "spirv/unified1/GLSL.std.450.h"
 #include "spirv/unified1/spirv.h"
-#include "src/tint/core/scoped_assignment.h"
 #include "src/tint/ir/access.h"
 #include "src/tint/ir/binary.h"
 #include "src/tint/ir/block.h"
@@ -78,8 +77,9 @@
 #include "src/tint/lang/base/type/void.h"
 #include "src/tint/lang/spirv/ast_writer/generator.h"
 #include "src/tint/lang/spirv/ast_writer/module.h"
-#include "src/tint/switch.h"
 #include "src/tint/transform/manager.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
+#include "src/tint/utils/rtti/switch.h"
 
 namespace tint::writer::spirv {
 
diff --git a/src/tint/lang/spirv/writer/generator_impl_ir.h b/src/tint/lang/spirv/writer/generator_impl_ir.h
index 272dff8..01ca33c 100644
--- a/src/tint/lang/spirv/writer/generator_impl_ir.h
+++ b/src/tint/lang/spirv/writer/generator_impl_ir.h
@@ -17,9 +17,6 @@
 
 #include <vector>
 
-#include "src/tint/core/diagnostic/diagnostic.h"
-#include "src/tint/core/hashmap.h"
-#include "src/tint/core/vector.h"
 #include "src/tint/ir/constant.h"
 #include "src/tint/lang/base/builtin/address_space.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
@@ -28,7 +25,10 @@
 #include "src/tint/lang/spirv/ast_writer/binary_writer.h"
 #include "src/tint/lang/spirv/ast_writer/function.h"
 #include "src/tint/lang/spirv/ast_writer/module.h"
-#include "src/tint/symbol.h"
+#include "src/tint/utils/containers/hashmap.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
+#include "src/tint/utils/text/symbol.h"
 
 // Forward declarations
 namespace tint::ir {
diff --git a/src/tint/lang/wgsl/ast/diagnostic_control.h b/src/tint/lang/wgsl/ast/diagnostic_control.h
index 8bba2a1..2a0dd54 100644
--- a/src/tint/lang/wgsl/ast/diagnostic_control.h
+++ b/src/tint/lang/wgsl/ast/diagnostic_control.h
@@ -18,8 +18,8 @@
 #include <string>
 #include <unordered_map>
 
-#include "src/tint/core/diagnostic/diagnostic.h"
 #include "src/tint/lang/base/builtin/diagnostic_severity.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
 
 // Forward declarations
 namespace tint::ast {
diff --git a/src/tint/lang/wgsl/ast/float_literal_expression_test.cc b/src/tint/lang/wgsl/ast/float_literal_expression_test.cc
index 4123551..fd9d118 100644
--- a/src/tint/lang/wgsl/ast/float_literal_expression_test.cc
+++ b/src/tint/lang/wgsl/ast/float_literal_expression_test.cc
@@ -14,7 +14,7 @@
 
 #include "src/tint/lang/wgsl/ast/test_helper.h"
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::ast {
 namespace {
diff --git a/src/tint/lang/wgsl/ast/int_literal_expression_test.cc b/src/tint/lang/wgsl/ast/int_literal_expression_test.cc
index 68b8276..fb8cd2f 100644
--- a/src/tint/lang/wgsl/ast/int_literal_expression_test.cc
+++ b/src/tint/lang/wgsl/ast/int_literal_expression_test.cc
@@ -14,7 +14,7 @@
 
 #include "src/tint/lang/wgsl/ast/test_helper.h"
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::ast {
 namespace {
diff --git a/src/tint/lang/wgsl/ast/internal_attribute.h b/src/tint/lang/wgsl/ast/internal_attribute.h
index b0be9d8..8915a52 100644
--- a/src/tint/lang/wgsl/ast/internal_attribute.h
+++ b/src/tint/lang/wgsl/ast/internal_attribute.h
@@ -17,8 +17,8 @@
 
 #include <string>
 
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/wgsl/ast/attribute.h"
+#include "src/tint/utils/containers/vector.h"
 
 // Forward declarations
 namespace tint::ast {
diff --git a/src/tint/lang/wgsl/ast/interpolate_attribute_test.cc b/src/tint/lang/wgsl/ast/interpolate_attribute_test.cc
index ec43e9a..58efbe1 100644
--- a/src/tint/lang/wgsl/ast/interpolate_attribute_test.cc
+++ b/src/tint/lang/wgsl/ast/interpolate_attribute_test.cc
@@ -16,8 +16,8 @@
 
 #include <string>
 
-#include "src/tint/core/string.h"
 #include "src/tint/lang/wgsl/ast/test_helper.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::ast {
 namespace {
diff --git a/src/tint/lang/wgsl/ast/module.cc b/src/tint/lang/wgsl/ast/module.cc
index 6af2f02..3253354 100644
--- a/src/tint/lang/wgsl/ast/module.cc
+++ b/src/tint/lang/wgsl/ast/module.cc
@@ -18,7 +18,7 @@
 
 #include "src/tint/lang/wgsl/ast/type_decl.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/rtti/switch.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::Module);
 
diff --git a/src/tint/lang/wgsl/ast/module.h b/src/tint/lang/wgsl/ast/module.h
index fed7c40..ef838d6 100644
--- a/src/tint/lang/wgsl/ast/module.h
+++ b/src/tint/lang/wgsl/ast/module.h
@@ -17,11 +17,11 @@
 
 #include <string>
 
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/wgsl/ast/const_assert.h"
 #include "src/tint/lang/wgsl/ast/diagnostic_directive.h"
 #include "src/tint/lang/wgsl/ast/enable.h"
 #include "src/tint/lang/wgsl/ast/function.h"
+#include "src/tint/utils/containers/vector.h"
 
 namespace tint::ast {
 
diff --git a/src/tint/lang/wgsl/ast/pipeline_stage.h b/src/tint/lang/wgsl/ast/pipeline_stage.h
index c3c5e18..c0ae132 100644
--- a/src/tint/lang/wgsl/ast/pipeline_stage.h
+++ b/src/tint/lang/wgsl/ast/pipeline_stage.h
@@ -15,7 +15,7 @@
 #ifndef SRC_TINT_LANG_WGSL_AST_PIPELINE_STAGE_H_
 #define SRC_TINT_LANG_WGSL_AST_PIPELINE_STAGE_H_
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::ast {
 
diff --git a/src/tint/lang/wgsl/ast/struct.h b/src/tint/lang/wgsl/ast/struct.h
index 4b77d49..2da597e 100644
--- a/src/tint/lang/wgsl/ast/struct.h
+++ b/src/tint/lang/wgsl/ast/struct.h
@@ -18,10 +18,10 @@
 #include <string>
 #include <utility>
 
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/wgsl/ast/attribute.h"
 #include "src/tint/lang/wgsl/ast/struct_member.h"
 #include "src/tint/lang/wgsl/ast/type_decl.h"
+#include "src/tint/utils/containers/vector.h"
 
 namespace tint::ast {
 
diff --git a/src/tint/lang/wgsl/ast/transform/add_block_attribute.cc b/src/tint/lang/wgsl/ast/transform/add_block_attribute.cc
index 8f2a09e..2301d95 100644
--- a/src/tint/lang/wgsl/ast/transform/add_block_attribute.cc
+++ b/src/tint/lang/wgsl/ast/transform/add_block_attribute.cc
@@ -17,10 +17,10 @@
 #include <unordered_set>
 #include <utility>
 
-#include "src/tint/core/hashmap.h"
-#include "src/tint/core/hashset.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
+#include "src/tint/utils/containers/hashmap.h"
+#include "src/tint/utils/containers/hashset.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::AddBlockAttribute);
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::AddBlockAttribute::BlockAttribute);
diff --git a/src/tint/lang/wgsl/ast/transform/binding_remapper.cc b/src/tint/lang/wgsl/ast/transform/binding_remapper.cc
index 8c12523..3e94d52 100644
--- a/src/tint/lang/wgsl/ast/transform/binding_remapper.cc
+++ b/src/tint/lang/wgsl/ast/transform/binding_remapper.cc
@@ -18,11 +18,11 @@
 #include <unordered_set>
 #include <utility>
 
-#include "src/tint/core/string.h"
 #include "src/tint/lang/wgsl/ast/disable_validation_attribute.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/function.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
+#include "src/tint/utils/text/string.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::BindingRemapper);
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::BindingRemapper::Remappings);
diff --git a/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc b/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc
index e8df4ff..eb25695 100644
--- a/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc
+++ b/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc
@@ -19,7 +19,6 @@
 #include <unordered_map>
 #include <utility>
 
-#include "src/tint/core/map.h"
 #include "src/tint/lang/base/type/storage_texture.h"
 #include "src/tint/lang/base/type/texture_dimension.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
@@ -27,7 +26,8 @@
 #include "src/tint/lang/wgsl/sem/call.h"
 #include "src/tint/lang/wgsl/sem/type_expression.h"
 #include "src/tint/lang/wgsl/sem/value_conversion.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/rtti/switch.h"
 
 using namespace tint::builtin::fluent_types;  // NOLINT
 using namespace tint::number_suffixes;        // NOLINT
diff --git a/src/tint/lang/wgsl/ast/transform/calculate_array_length.cc b/src/tint/lang/wgsl/ast/transform/calculate_array_length.cc
index 82579fa..89726b9 100644
--- a/src/tint/lang/wgsl/ast/transform/calculate_array_length.cc
+++ b/src/tint/lang/wgsl/ast/transform/calculate_array_length.cc
@@ -17,8 +17,6 @@
 #include <unordered_map>
 #include <utility>
 
-#include "src/tint/core/hash.h"
-#include "src/tint/core/map.h"
 #include "src/tint/lang/base/type/reference.h"
 #include "src/tint/lang/wgsl/ast/call_statement.h"
 #include "src/tint/lang/wgsl/ast/disable_validation_attribute.h"
@@ -30,7 +28,9 @@
 #include "src/tint/lang/wgsl/sem/statement.h"
 #include "src/tint/lang/wgsl/sem/struct.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/rtti/switch.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::CalculateArrayLength);
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::CalculateArrayLength::BufferSizeIntrinsic);
diff --git a/src/tint/lang/wgsl/ast/transform/clamp_frag_depth.cc b/src/tint/lang/wgsl/ast/transform/clamp_frag_depth.cc
index a05cee7..b187f20 100644
--- a/src/tint/lang/wgsl/ast/transform/clamp_frag_depth.cc
+++ b/src/tint/lang/wgsl/ast/transform/clamp_frag_depth.cc
@@ -16,8 +16,6 @@
 
 #include <utility>
 
-#include "src/tint/core/scoped_assignment.h"
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
 #include "src/tint/lang/wgsl/ast/attribute.h"
 #include "src/tint/lang/wgsl/ast/builtin_attribute.h"
@@ -28,6 +26,8 @@
 #include "src/tint/lang/wgsl/sem/function.h"
 #include "src/tint/lang/wgsl/sem/statement.h"
 #include "src/tint/lang/wgsl/sem/struct.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::ClampFragDepth);
 
diff --git a/src/tint/lang/wgsl/ast/transform/combine_samplers.cc b/src/tint/lang/wgsl/ast/transform/combine_samplers.cc
index f0b253e..f046663 100644
--- a/src/tint/lang/wgsl/ast/transform/combine_samplers.cc
+++ b/src/tint/lang/wgsl/ast/transform/combine_samplers.cc
@@ -23,7 +23,7 @@
 #include "src/tint/lang/wgsl/sem/function.h"
 #include "src/tint/lang/wgsl/sem/statement.h"
 
-#include "src/tint/core/map.h"
+#include "src/tint/utils/containers/map.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::CombineSamplers);
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::CombineSamplers::BindingInfo);
diff --git a/src/tint/lang/wgsl/ast/transform/decompose_memory_access.cc b/src/tint/lang/wgsl/ast/transform/decompose_memory_access.cc
index 0d1d08f..f459aea 100644
--- a/src/tint/lang/wgsl/ast/transform/decompose_memory_access.cc
+++ b/src/tint/lang/wgsl/ast/transform/decompose_memory_access.cc
@@ -20,10 +20,6 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/block_allocator.h"
-#include "src/tint/core/hash.h"
-#include "src/tint/core/map.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/type/array.h"
 #include "src/tint/lang/base/type/atomic.h"
 #include "src/tint/lang/base/type/reference.h"
@@ -37,7 +33,11 @@
 #include "src/tint/lang/wgsl/sem/statement.h"
 #include "src/tint/lang/wgsl/sem/struct.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/memory/block_allocator.h"
+#include "src/tint/utils/rtti/switch.h"
+#include "src/tint/utils/text/string_stream.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
diff --git a/src/tint/lang/wgsl/ast/transform/decompose_strided_array.cc b/src/tint/lang/wgsl/ast/transform/decompose_strided_array.cc
index 5eef025..ee9ffe6 100644
--- a/src/tint/lang/wgsl/ast/transform/decompose_strided_array.cc
+++ b/src/tint/lang/wgsl/ast/transform/decompose_strided_array.cc
@@ -18,8 +18,6 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/hash.h"
-#include "src/tint/core/map.h"
 #include "src/tint/lang/wgsl/ast/transform/simplify_pointers.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/call.h"
@@ -27,6 +25,8 @@
 #include "src/tint/lang/wgsl/sem/type_expression.h"
 #include "src/tint/lang/wgsl/sem/value_constructor.h"
 #include "src/tint/lang/wgsl/sem/value_expression.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/math/hash.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::DecomposeStridedArray);
 
diff --git a/src/tint/lang/wgsl/ast/transform/decompose_strided_matrix.cc b/src/tint/lang/wgsl/ast/transform/decompose_strided_matrix.cc
index 29321c0..75d4ed7 100644
--- a/src/tint/lang/wgsl/ast/transform/decompose_strided_matrix.cc
+++ b/src/tint/lang/wgsl/ast/transform/decompose_strided_matrix.cc
@@ -18,12 +18,12 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/hash.h"
-#include "src/tint/core/map.h"
 #include "src/tint/lang/wgsl/ast/transform/simplify_pointers.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/member_accessor_expression.h"
 #include "src/tint/lang/wgsl/sem/value_expression.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/math/hash.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::DecomposeStridedMatrix);
 
diff --git a/src/tint/lang/wgsl/ast/transform/demote_to_helper.cc b/src/tint/lang/wgsl/ast/transform/demote_to_helper.cc
index b24ac9d4..faa99a4 100644
--- a/src/tint/lang/wgsl/ast/transform/demote_to_helper.cc
+++ b/src/tint/lang/wgsl/ast/transform/demote_to_helper.cc
@@ -18,7 +18,6 @@
 #include <unordered_set>
 #include <utility>
 
-#include "src/tint/core/map.h"
 #include "src/tint/lang/base/type/reference.h"
 #include "src/tint/lang/wgsl/ast/transform/utils/hoist_to_decl_before.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
@@ -26,7 +25,8 @@
 #include "src/tint/lang/wgsl/sem/call.h"
 #include "src/tint/lang/wgsl/sem/function.h"
 #include "src/tint/lang/wgsl/sem/statement.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/rtti/switch.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::DemoteToHelper);
 
diff --git a/src/tint/lang/wgsl/ast/transform/direct_variable_access.cc b/src/tint/lang/wgsl/ast/transform/direct_variable_access.cc
index f75b679..fcd1f57 100644
--- a/src/tint/lang/wgsl/ast/transform/direct_variable_access.cc
+++ b/src/tint/lang/wgsl/ast/transform/direct_variable_access.cc
@@ -18,9 +18,6 @@
 #include <string>
 #include <utility>
 
-#include "src/tint/core/reverse.h"
-#include "src/tint/core/scoped_assignment.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/type/abstract_int.h"
 #include "src/tint/lang/wgsl/ast/transform/utils/hoist_to_decl_before.h"
 #include "src/tint/lang/wgsl/ast/traverse_expressions.h"
@@ -33,6 +30,9 @@
 #include "src/tint/lang/wgsl/sem/statement.h"
 #include "src/tint/lang/wgsl/sem/struct.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
+#include "src/tint/utils/containers/reverse.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
+#include "src/tint/utils/text/string_stream.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::DirectVariableAccess);
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::DirectVariableAccess::Config);
diff --git a/src/tint/lang/wgsl/ast/transform/direct_variable_access_test.cc b/src/tint/lang/wgsl/ast/transform/direct_variable_access_test.cc
index cb239d9..84c3043 100644
--- a/src/tint/lang/wgsl/ast/transform/direct_variable_access_test.cc
+++ b/src/tint/lang/wgsl/ast/transform/direct_variable_access_test.cc
@@ -17,8 +17,8 @@
 #include <memory>
 #include <utility>
 
-#include "src/tint/core/string.h"
 #include "src/tint/lang/wgsl/ast/transform/test_helper.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::ast::transform {
 namespace {
diff --git a/src/tint/lang/wgsl/ast/transform/fold_trivial_lets.cc b/src/tint/lang/wgsl/ast/transform/fold_trivial_lets.cc
index ee14120..7c517af 100644
--- a/src/tint/lang/wgsl/ast/transform/fold_trivial_lets.cc
+++ b/src/tint/lang/wgsl/ast/transform/fold_trivial_lets.cc
@@ -16,10 +16,10 @@
 
 #include <utility>
 
-#include "src/tint/core/hashmap.h"
 #include "src/tint/lang/wgsl/ast/traverse_expressions.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/value_expression.h"
+#include "src/tint/utils/containers/hashmap.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::FoldTrivialLets);
 
diff --git a/src/tint/lang/wgsl/ast/transform/localize_struct_array_assignment.cc b/src/tint/lang/wgsl/ast/transform/localize_struct_array_assignment.cc
index 66ae68f..1e81d84 100644
--- a/src/tint/lang/wgsl/ast/transform/localize_struct_array_assignment.cc
+++ b/src/tint/lang/wgsl/ast/transform/localize_struct_array_assignment.cc
@@ -17,7 +17,6 @@
 #include <unordered_map>
 #include <utility>
 
-#include "src/tint/core/scoped_assignment.h"
 #include "src/tint/lang/base/type/reference.h"
 #include "src/tint/lang/wgsl/ast/assignment_statement.h"
 #include "src/tint/lang/wgsl/ast/transform/simplify_pointers.h"
@@ -27,6 +26,7 @@
 #include "src/tint/lang/wgsl/sem/statement.h"
 #include "src/tint/lang/wgsl/sem/value_expression.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::LocalizeStructArrayAssignment);
 
diff --git a/src/tint/lang/wgsl/ast/transform/merge_return.cc b/src/tint/lang/wgsl/ast/transform/merge_return.cc
index eaff44f..7b397fc 100644
--- a/src/tint/lang/wgsl/ast/transform/merge_return.cc
+++ b/src/tint/lang/wgsl/ast/transform/merge_return.cc
@@ -16,10 +16,10 @@
 
 #include <utility>
 
-#include "src/tint/core/scoped_assignment.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/statement.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
+#include "src/tint/utils/rtti/switch.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::MergeReturn);
 
diff --git a/src/tint/lang/wgsl/ast/transform/module_scope_var_to_entry_point_param.cc b/src/tint/lang/wgsl/ast/transform/module_scope_var_to_entry_point_param.cc
index 20f4159..dde947d 100644
--- a/src/tint/lang/wgsl/ast/transform/module_scope_var_to_entry_point_param.cc
+++ b/src/tint/lang/wgsl/ast/transform/module_scope_var_to_entry_point_param.cc
@@ -19,7 +19,6 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/string.h"
 #include "src/tint/lang/wgsl/ast/disable_validation_attribute.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/call.h"
@@ -27,6 +26,7 @@
 #include "src/tint/lang/wgsl/sem/module.h"
 #include "src/tint/lang/wgsl/sem/statement.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
+#include "src/tint/utils/text/string.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::ModuleScopeVarToEntryPointParam);
 
diff --git a/src/tint/lang/wgsl/ast/transform/num_workgroups_from_uniform.cc b/src/tint/lang/wgsl/ast/transform/num_workgroups_from_uniform.cc
index 70b5540..1c46f53 100644
--- a/src/tint/lang/wgsl/ast/transform/num_workgroups_from_uniform.cc
+++ b/src/tint/lang/wgsl/ast/transform/num_workgroups_from_uniform.cc
@@ -19,11 +19,11 @@
 #include <unordered_set>
 #include <utility>
 
-#include "src/tint/core/hash.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
 #include "src/tint/lang/wgsl/ast/transform/canonicalize_entry_point_io.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/function.h"
+#include "src/tint/utils/math/hash.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::NumWorkgroupsFromUniform);
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::NumWorkgroupsFromUniform::Config);
diff --git a/src/tint/lang/wgsl/ast/transform/packed_vec3.cc b/src/tint/lang/wgsl/ast/transform/packed_vec3.cc
index acdf0ae..45360c04 100644
--- a/src/tint/lang/wgsl/ast/transform/packed_vec3.cc
+++ b/src/tint/lang/wgsl/ast/transform/packed_vec3.cc
@@ -18,9 +18,6 @@
 #include <string>
 #include <utility>
 
-#include "src/tint/core/hashmap.h"
-#include "src/tint/core/hashset.h"
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/base/builtin/builtin.h"
 #include "src/tint/lang/base/type/array.h"
 #include "src/tint/lang/base/type/reference.h"
@@ -33,7 +30,10 @@
 #include "src/tint/lang/wgsl/sem/statement.h"
 #include "src/tint/lang/wgsl/sem/type_expression.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/hashmap.h"
+#include "src/tint/utils/containers/hashset.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/rtti/switch.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::PackedVec3);
 
diff --git a/src/tint/lang/wgsl/ast/transform/packed_vec3_test.cc b/src/tint/lang/wgsl/ast/transform/packed_vec3_test.cc
index 2aa532e..fefd7ba 100644
--- a/src/tint/lang/wgsl/ast/transform/packed_vec3_test.cc
+++ b/src/tint/lang/wgsl/ast/transform/packed_vec3_test.cc
@@ -18,13 +18,13 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/string.h"
 #include "src/tint/lang/base/type/array.h"
 #include "src/tint/lang/wgsl/ast/module.h"
 #include "src/tint/lang/wgsl/ast/transform/test_helper.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/struct.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::ast::transform {
 namespace {
diff --git a/src/tint/lang/wgsl/ast/transform/preserve_padding.cc b/src/tint/lang/wgsl/ast/transform/preserve_padding.cc
index 081a0d1..95163be 100644
--- a/src/tint/lang/wgsl/ast/transform/preserve_padding.cc
+++ b/src/tint/lang/wgsl/ast/transform/preserve_padding.cc
@@ -17,12 +17,12 @@
 #include <unordered_set>
 #include <utility>
 
-#include "src/tint/core/map.h"
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/base/type/reference.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/struct.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/rtti/switch.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::PreservePadding);
 
diff --git a/src/tint/lang/wgsl/ast/transform/promote_initializers_to_let.cc b/src/tint/lang/wgsl/ast/transform/promote_initializers_to_let.cc
index 1cc9cfd..1b9ba605 100644
--- a/src/tint/lang/wgsl/ast/transform/promote_initializers_to_let.cc
+++ b/src/tint/lang/wgsl/ast/transform/promote_initializers_to_let.cc
@@ -16,7 +16,6 @@
 
 #include <utility>
 
-#include "src/tint/core/hashset.h"
 #include "src/tint/lang/base/type/struct.h"
 #include "src/tint/lang/wgsl/ast/transform/utils/hoist_to_decl_before.h"
 #include "src/tint/lang/wgsl/ast/traverse_expressions.h"
@@ -24,6 +23,7 @@
 #include "src/tint/lang/wgsl/sem/call.h"
 #include "src/tint/lang/wgsl/sem/statement.h"
 #include "src/tint/lang/wgsl/sem/value_constructor.h"
+#include "src/tint/utils/containers/hashset.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::PromoteInitializersToLet);
 
diff --git a/src/tint/lang/wgsl/ast/transform/promote_side_effects_to_decl.cc b/src/tint/lang/wgsl/ast/transform/promote_side_effects_to_decl.cc
index 8dc41cc..cf791ee 100644
--- a/src/tint/lang/wgsl/ast/transform/promote_side_effects_to_decl.cc
+++ b/src/tint/lang/wgsl/ast/transform/promote_side_effects_to_decl.cc
@@ -20,7 +20,6 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/scoped_assignment.h"
 #include "src/tint/lang/wgsl/ast/transform/utils/get_insertion_point.h"
 #include "src/tint/lang/wgsl/ast/transform/utils/hoist_to_decl_before.h"
 #include "src/tint/lang/wgsl/ast/traverse_expressions.h"
@@ -32,6 +31,7 @@
 #include "src/tint/lang/wgsl/sem/variable.h"
 #include "src/tint/lang/wgsl/sem/while_statement.h"
 #include "src/tint/transform/manager.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::PromoteSideEffectsToDecl);
 
diff --git a/src/tint/lang/wgsl/ast/transform/remove_continue_in_switch.cc b/src/tint/lang/wgsl/ast/transform/remove_continue_in_switch.cc
index db88cb2..7af152b 100644
--- a/src/tint/lang/wgsl/ast/transform/remove_continue_in_switch.cc
+++ b/src/tint/lang/wgsl/ast/transform/remove_continue_in_switch.cc
@@ -18,7 +18,6 @@
 #include <unordered_map>
 #include <utility>
 
-#include "src/tint/core/map.h"
 #include "src/tint/lang/wgsl/ast/continue_statement.h"
 #include "src/tint/lang/wgsl/ast/switch_statement.h"
 #include "src/tint/lang/wgsl/ast/transform/utils/get_insertion_point.h"
@@ -28,6 +27,7 @@
 #include "src/tint/lang/wgsl/sem/loop_statement.h"
 #include "src/tint/lang/wgsl/sem/switch_statement.h"
 #include "src/tint/lang/wgsl/sem/while_statement.h"
+#include "src/tint/utils/containers/map.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::RemoveContinueInSwitch);
 
diff --git a/src/tint/lang/wgsl/ast/transform/remove_phonies.cc b/src/tint/lang/wgsl/ast/transform/remove_phonies.cc
index 576455c..daac4d1 100644
--- a/src/tint/lang/wgsl/ast/transform/remove_phonies.cc
+++ b/src/tint/lang/wgsl/ast/transform/remove_phonies.cc
@@ -19,14 +19,14 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/map.h"
-#include "src/tint/core/scoped_assignment.h"
 #include "src/tint/lang/wgsl/ast/traverse_expressions.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/block_statement.h"
 #include "src/tint/lang/wgsl/sem/function.h"
 #include "src/tint/lang/wgsl/sem/statement.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::RemovePhonies);
 
diff --git a/src/tint/lang/wgsl/ast/transform/remove_unreachable_statements.cc b/src/tint/lang/wgsl/ast/transform/remove_unreachable_statements.cc
index 7ed7f39..3828f63 100644
--- a/src/tint/lang/wgsl/ast/transform/remove_unreachable_statements.cc
+++ b/src/tint/lang/wgsl/ast/transform/remove_unreachable_statements.cc
@@ -19,14 +19,14 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/map.h"
-#include "src/tint/core/scoped_assignment.h"
 #include "src/tint/lang/wgsl/ast/traverse_expressions.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/block_statement.h"
 #include "src/tint/lang/wgsl/sem/function.h"
 #include "src/tint/lang/wgsl/sem/statement.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::RemoveUnreachableStatements);
 
diff --git a/src/tint/lang/wgsl/ast/transform/renamer.cc b/src/tint/lang/wgsl/ast/transform/renamer.cc
index c783ed4..8bd096c 100644
--- a/src/tint/lang/wgsl/ast/transform/renamer.cc
+++ b/src/tint/lang/wgsl/ast/transform/renamer.cc
@@ -17,7 +17,6 @@
 #include <memory>
 #include <utility>
 
-#include "src/tint/core/unicode.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/builtin_enum_expression.h"
 #include "src/tint/lang/wgsl/sem/call.h"
@@ -25,7 +24,8 @@
 #include "src/tint/lang/wgsl/sem/type_expression.h"
 #include "src/tint/lang/wgsl/sem/value_constructor.h"
 #include "src/tint/lang/wgsl/sem/value_conversion.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/rtti/switch.h"
+#include "src/tint/utils/text/unicode.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::Renamer);
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::Renamer::Data);
diff --git a/src/tint/lang/wgsl/ast/transform/renamer_test.cc b/src/tint/lang/wgsl/ast/transform/renamer_test.cc
index fbccbdd..c813bc1 100644
--- a/src/tint/lang/wgsl/ast/transform/renamer_test.cc
+++ b/src/tint/lang/wgsl/ast/transform/renamer_test.cc
@@ -19,10 +19,10 @@
 #include <vector>
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string.h"
 #include "src/tint/lang/base/builtin/builtin.h"
 #include "src/tint/lang/base/builtin/texel_format.h"
 #include "src/tint/lang/wgsl/ast/transform/test_helper.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::ast::transform {
 namespace {
diff --git a/src/tint/lang/wgsl/ast/transform/robustness.cc b/src/tint/lang/wgsl/ast/transform/robustness.cc
index f723d66..5a70533 100644
--- a/src/tint/lang/wgsl/ast/transform/robustness.cc
+++ b/src/tint/lang/wgsl/ast/transform/robustness.cc
@@ -30,7 +30,7 @@
 #include "src/tint/lang/wgsl/sem/member_accessor_expression.h"
 #include "src/tint/lang/wgsl/sem/statement.h"
 #include "src/tint/lang/wgsl/sem/value_expression.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/rtti/switch.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::Robustness);
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::Robustness::Config);
diff --git a/src/tint/lang/wgsl/ast/transform/simplify_pointers.cc b/src/tint/lang/wgsl/ast/transform/simplify_pointers.cc
index be99841..daa0a84 100644
--- a/src/tint/lang/wgsl/ast/transform/simplify_pointers.cc
+++ b/src/tint/lang/wgsl/ast/transform/simplify_pointers.cc
@@ -25,7 +25,7 @@
 #include "src/tint/lang/wgsl/sem/function.h"
 #include "src/tint/lang/wgsl/sem/statement.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/rtti/switch.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::SimplifyPointers);
 
diff --git a/src/tint/lang/wgsl/ast/transform/single_entry_point.cc b/src/tint/lang/wgsl/ast/transform/single_entry_point.cc
index 71a7f1b..35723ef 100644
--- a/src/tint/lang/wgsl/ast/transform/single_entry_point.cc
+++ b/src/tint/lang/wgsl/ast/transform/single_entry_point.cc
@@ -20,7 +20,7 @@
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/function.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/rtti/switch.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::SingleEntryPoint);
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::SingleEntryPoint::Config);
diff --git a/src/tint/lang/wgsl/ast/transform/spirv_atomic.cc b/src/tint/lang/wgsl/ast/transform/spirv_atomic.cc
index 0fce31c..9ed124c 100644
--- a/src/tint/lang/wgsl/ast/transform/spirv_atomic.cc
+++ b/src/tint/lang/wgsl/ast/transform/spirv_atomic.cc
@@ -20,8 +20,6 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/map.h"
-#include "src/tint/core/unique_vector.h"
 #include "src/tint/lang/base/type/reference.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/block_statement.h"
@@ -29,7 +27,9 @@
 #include "src/tint/lang/wgsl/sem/index_accessor_expression.h"
 #include "src/tint/lang/wgsl/sem/member_accessor_expression.h"
 #include "src/tint/lang/wgsl/sem/statement.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/containers/unique_vector.h"
+#include "src/tint/utils/rtti/switch.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::SpirvAtomic);
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::SpirvAtomic::Stub);
diff --git a/src/tint/lang/wgsl/ast/transform/std140.cc b/src/tint/lang/wgsl/ast/transform/std140.cc
index 7c4467c..beadeb8 100644
--- a/src/tint/lang/wgsl/ast/transform/std140.cc
+++ b/src/tint/lang/wgsl/ast/transform/std140.cc
@@ -19,16 +19,16 @@
 #include <utility>
 #include <variant>
 
-#include "src/tint/core/compiler_macros.h"
-#include "src/tint/core/hashmap.h"
-#include "src/tint/core/transform.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/index_accessor_expression.h"
 #include "src/tint/lang/wgsl/sem/member_accessor_expression.h"
 #include "src/tint/lang/wgsl/sem/module.h"
 #include "src/tint/lang/wgsl/sem/struct.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/hashmap.h"
+#include "src/tint/utils/containers/transform.h"
+#include "src/tint/utils/macros/compiler.h"
+#include "src/tint/utils/rtti/switch.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::Std140);
 
diff --git a/src/tint/lang/wgsl/ast/transform/std140_exhaustive_test.cc b/src/tint/lang/wgsl/ast/transform/std140_exhaustive_test.cc
index c3ef73f..813d679 100644
--- a/src/tint/lang/wgsl/ast/transform/std140_exhaustive_test.cc
+++ b/src/tint/lang/wgsl/ast/transform/std140_exhaustive_test.cc
@@ -18,8 +18,8 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/string.h"
 #include "src/tint/lang/wgsl/ast/transform/test_helper.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::ast::transform {
 namespace {
diff --git a/src/tint/lang/wgsl/ast/transform/std140_f16_test.cc b/src/tint/lang/wgsl/ast/transform/std140_f16_test.cc
index 0b90bb8..322d83b 100644
--- a/src/tint/lang/wgsl/ast/transform/std140_f16_test.cc
+++ b/src/tint/lang/wgsl/ast/transform/std140_f16_test.cc
@@ -18,8 +18,8 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/string.h"
 #include "src/tint/lang/wgsl/ast/transform/test_helper.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::ast::transform {
 namespace {
diff --git a/src/tint/lang/wgsl/ast/transform/std140_f32_test.cc b/src/tint/lang/wgsl/ast/transform/std140_f32_test.cc
index e458bce..ac57b11 100644
--- a/src/tint/lang/wgsl/ast/transform/std140_f32_test.cc
+++ b/src/tint/lang/wgsl/ast/transform/std140_f32_test.cc
@@ -18,8 +18,8 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/string.h"
 #include "src/tint/lang/wgsl/ast/transform/test_helper.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::ast::transform {
 namespace {
diff --git a/src/tint/lang/wgsl/ast/transform/std140_test.cc b/src/tint/lang/wgsl/ast/transform/std140_test.cc
index 3b20196..7e80d30 100644
--- a/src/tint/lang/wgsl/ast/transform/std140_test.cc
+++ b/src/tint/lang/wgsl/ast/transform/std140_test.cc
@@ -18,8 +18,8 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/string.h"
 #include "src/tint/lang/wgsl/ast/transform/test_helper.h"
+#include "src/tint/utils/text/string.h"
 
 // This file contains the should-run tests and a trival empty module test for Std140 transform.
 // For testing transform results with clear readability, please refer to std140_f32_test.cc for f32
diff --git a/src/tint/lang/wgsl/ast/transform/substitute_override.cc b/src/tint/lang/wgsl/ast/transform/substitute_override.cc
index a440e6f..c37f261 100644
--- a/src/tint/lang/wgsl/ast/transform/substitute_override.cc
+++ b/src/tint/lang/wgsl/ast/transform/substitute_override.cc
@@ -22,7 +22,7 @@
 #include "src/tint/lang/wgsl/sem/builtin.h"
 #include "src/tint/lang/wgsl/sem/index_accessor_expression.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/rtti/switch.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::SubstituteOverride);
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::SubstituteOverride::Config);
diff --git a/src/tint/lang/wgsl/ast/transform/substitute_override.h b/src/tint/lang/wgsl/ast/transform/substitute_override.h
index bd918c2e..0319478 100644
--- a/src/tint/lang/wgsl/ast/transform/substitute_override.h
+++ b/src/tint/lang/wgsl/ast/transform/substitute_override.h
@@ -21,7 +21,7 @@
 #include "tint/override_id.h"
 
 #include "src/tint/lang/wgsl/ast/transform/transform.h"
-#include "src/tint/reflection.h"
+#include "src/tint/utils/reflection/reflection.h"
 
 namespace tint::ast::transform {
 
diff --git a/src/tint/lang/wgsl/ast/transform/texture_1d_to_2d.cc b/src/tint/lang/wgsl/ast/transform/texture_1d_to_2d.cc
index 9b853cc..ab27dfe 100644
--- a/src/tint/lang/wgsl/ast/transform/texture_1d_to_2d.cc
+++ b/src/tint/lang/wgsl/ast/transform/texture_1d_to_2d.cc
@@ -21,7 +21,7 @@
 #include "src/tint/lang/wgsl/sem/function.h"
 #include "src/tint/lang/wgsl/sem/statement.h"
 #include "src/tint/lang/wgsl/sem/type_expression.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/rtti/switch.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::Texture1DTo2D);
 
diff --git a/src/tint/lang/wgsl/ast/transform/transform.h b/src/tint/lang/wgsl/ast/transform/transform.h
index 3f6d502..654b85c 100644
--- a/src/tint/lang/wgsl/ast/transform/transform.h
+++ b/src/tint/lang/wgsl/ast/transform/transform.h
@@ -19,8 +19,8 @@
 
 #include <utility>
 
-#include "src/tint/core/castable.h"
 #include "src/tint/lang/wgsl/program/program.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::ast::transform {
 
diff --git a/src/tint/lang/wgsl/ast/transform/truncate_interstage_variables.cc b/src/tint/lang/wgsl/ast/transform/truncate_interstage_variables.cc
index daebadc..a8a64be 100644
--- a/src/tint/lang/wgsl/ast/transform/truncate_interstage_variables.cc
+++ b/src/tint/lang/wgsl/ast/transform/truncate_interstage_variables.cc
@@ -18,13 +18,13 @@
 #include <string>
 #include <utility>
 
-#include "src/tint/core/unicode.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/call.h"
 #include "src/tint/lang/wgsl/sem/function.h"
 #include "src/tint/lang/wgsl/sem/member_accessor_expression.h"
 #include "src/tint/lang/wgsl/sem/statement.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
+#include "src/tint/utils/text/unicode.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::TruncateInterstageVariables);
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::TruncateInterstageVariables::Config);
diff --git a/src/tint/lang/wgsl/ast/transform/unshadow.cc b/src/tint/lang/wgsl/ast/transform/unshadow.cc
index afe1bbb..c313dc2 100644
--- a/src/tint/lang/wgsl/ast/transform/unshadow.cc
+++ b/src/tint/lang/wgsl/ast/transform/unshadow.cc
@@ -23,7 +23,7 @@
 #include "src/tint/lang/wgsl/sem/function.h"
 #include "src/tint/lang/wgsl/sem/statement.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/rtti/switch.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::Unshadow);
 
diff --git a/src/tint/lang/wgsl/ast/transform/utils/get_insertion_point.cc b/src/tint/lang/wgsl/ast/transform/utils/get_insertion_point.cc
index 57d1637..d5f541e 100644
--- a/src/tint/lang/wgsl/ast/transform/utils/get_insertion_point.cc
+++ b/src/tint/lang/wgsl/ast/transform/utils/get_insertion_point.cc
@@ -13,10 +13,10 @@
 // limitations under the License.
 
 #include "src/tint/lang/wgsl/ast/transform/utils/get_insertion_point.h"
-#include "src/tint/core/diagnostic/diagnostic.h"
-#include "src/tint/debug.h"
 #include "src/tint/lang/wgsl/sem/for_loop_statement.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
+#include "src/tint/utils/rtti/switch.h"
 
 namespace tint::ast::transform::utils {
 
diff --git a/src/tint/lang/wgsl/ast/transform/utils/get_insertion_point_test.cc b/src/tint/lang/wgsl/ast/transform/utils/get_insertion_point_test.cc
index 869bc3a..8fad150 100644
--- a/src/tint/lang/wgsl/ast/transform/utils/get_insertion_point_test.cc
+++ b/src/tint/lang/wgsl/ast/transform/utils/get_insertion_point_test.cc
@@ -15,10 +15,10 @@
 #include <utility>
 
 #include "gtest/gtest-spi.h"
-#include "src/tint/debug.h"
 #include "src/tint/lang/wgsl/ast/transform/test_helper.h"
 #include "src/tint/lang/wgsl/ast/transform/utils/get_insertion_point.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
+#include "src/tint/utils/debug/debug.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
diff --git a/src/tint/lang/wgsl/ast/transform/utils/hoist_to_decl_before.cc b/src/tint/lang/wgsl/ast/transform/utils/hoist_to_decl_before.cc
index a31d7c8..30b57c9 100644
--- a/src/tint/lang/wgsl/ast/transform/utils/hoist_to_decl_before.cc
+++ b/src/tint/lang/wgsl/ast/transform/utils/hoist_to_decl_before.cc
@@ -16,9 +16,6 @@
 
 #include <utility>
 
-#include "src/tint/core/hashmap.h"
-#include "src/tint/core/reverse.h"
-#include "src/tint/core/transform.h"
 #include "src/tint/lang/base/type/reference.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/block_statement.h"
@@ -26,6 +23,9 @@
 #include "src/tint/lang/wgsl/sem/if_statement.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
 #include "src/tint/lang/wgsl/sem/while_statement.h"
+#include "src/tint/utils/containers/hashmap.h"
+#include "src/tint/utils/containers/reverse.h"
+#include "src/tint/utils/containers/transform.h"
 
 namespace tint::ast::transform {
 
diff --git a/src/tint/lang/wgsl/ast/transform/vectorize_matrix_conversions.cc b/src/tint/lang/wgsl/ast/transform/vectorize_matrix_conversions.cc
index e0e51b2..650937f 100644
--- a/src/tint/lang/wgsl/ast/transform/vectorize_matrix_conversions.cc
+++ b/src/tint/lang/wgsl/ast/transform/vectorize_matrix_conversions.cc
@@ -18,13 +18,13 @@
 #include <unordered_map>
 #include <utility>
 
-#include "src/tint/core/hash.h"
-#include "src/tint/core/map.h"
 #include "src/tint/lang/base/type/abstract_numeric.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/call.h"
 #include "src/tint/lang/wgsl/sem/value_conversion.h"
 #include "src/tint/lang/wgsl/sem/value_expression.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/math/hash.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::VectorizeMatrixConversions);
 
diff --git a/src/tint/lang/wgsl/ast/transform/vectorize_matrix_conversions_test.cc b/src/tint/lang/wgsl/ast/transform/vectorize_matrix_conversions_test.cc
index e231b76..065bf2f 100644
--- a/src/tint/lang/wgsl/ast/transform/vectorize_matrix_conversions_test.cc
+++ b/src/tint/lang/wgsl/ast/transform/vectorize_matrix_conversions_test.cc
@@ -17,8 +17,8 @@
 #include <string>
 #include <utility>
 
-#include "src/tint/core/string.h"
 #include "src/tint/lang/wgsl/ast/transform/test_helper.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::ast::transform {
 namespace {
diff --git a/src/tint/lang/wgsl/ast/transform/vectorize_scalar_matrix_initializers.cc b/src/tint/lang/wgsl/ast/transform/vectorize_scalar_matrix_initializers.cc
index a82ef54..3374e6d 100644
--- a/src/tint/lang/wgsl/ast/transform/vectorize_scalar_matrix_initializers.cc
+++ b/src/tint/lang/wgsl/ast/transform/vectorize_scalar_matrix_initializers.cc
@@ -17,12 +17,12 @@
 #include <unordered_map>
 #include <utility>
 
-#include "src/tint/core/map.h"
 #include "src/tint/lang/base/type/abstract_numeric.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/call.h"
 #include "src/tint/lang/wgsl/sem/value_constructor.h"
 #include "src/tint/lang/wgsl/sem/value_expression.h"
+#include "src/tint/utils/containers/map.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::VectorizeScalarMatrixInitializers);
 
diff --git a/src/tint/lang/wgsl/ast/transform/vectorize_scalar_matrix_initializers_test.cc b/src/tint/lang/wgsl/ast/transform/vectorize_scalar_matrix_initializers_test.cc
index 1586e6c..1cdaaef 100644
--- a/src/tint/lang/wgsl/ast/transform/vectorize_scalar_matrix_initializers_test.cc
+++ b/src/tint/lang/wgsl/ast/transform/vectorize_scalar_matrix_initializers_test.cc
@@ -17,8 +17,8 @@
 #include <string>
 #include <utility>
 
-#include "src/tint/core/string.h"
 #include "src/tint/lang/wgsl/ast/transform/test_helper.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::ast::transform {
 namespace {
diff --git a/src/tint/lang/wgsl/ast/transform/vertex_pulling.cc b/src/tint/lang/wgsl/ast/transform/vertex_pulling.cc
index f07eb66..1d7ea3c 100644
--- a/src/tint/lang/wgsl/ast/transform/vertex_pulling.cc
+++ b/src/tint/lang/wgsl/ast/transform/vertex_pulling.cc
@@ -17,17 +17,17 @@
 #include <algorithm>
 #include <utility>
 
-#include "src/tint/core/compiler_macros.h"
-#include "src/tint/core/map.h"
-#include "src/tint/core/math.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
 #include "src/tint/lang/wgsl/ast/assignment_statement.h"
 #include "src/tint/lang/wgsl/ast/bitcast_expression.h"
 #include "src/tint/lang/wgsl/ast/variable_decl_statement.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/macros/compiler.h"
+#include "src/tint/utils/math/math.h"
+#include "src/tint/utils/rtti/switch.h"
+#include "src/tint/utils/text/string_stream.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::VertexPulling);
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::VertexPulling::Config);
diff --git a/src/tint/lang/wgsl/ast/transform/vertex_pulling.h b/src/tint/lang/wgsl/ast/transform/vertex_pulling.h
index b10ea62..101dd21 100644
--- a/src/tint/lang/wgsl/ast/transform/vertex_pulling.h
+++ b/src/tint/lang/wgsl/ast/transform/vertex_pulling.h
@@ -21,7 +21,7 @@
 #include <vector>
 
 #include "src/tint/lang/wgsl/ast/transform/transform.h"
-#include "src/tint/reflection.h"
+#include "src/tint/utils/reflection/reflection.h"
 
 namespace tint::ast::transform {
 
diff --git a/src/tint/lang/wgsl/ast/transform/zero_init_workgroup_memory.cc b/src/tint/lang/wgsl/ast/transform/zero_init_workgroup_memory.cc
index 1f2bbc3..091a95e 100644
--- a/src/tint/lang/wgsl/ast/transform/zero_init_workgroup_memory.cc
+++ b/src/tint/lang/wgsl/ast/transform/zero_init_workgroup_memory.cc
@@ -20,14 +20,14 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/map.h"
-#include "src/tint/core/unique_vector.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
 #include "src/tint/lang/base/type/atomic.h"
 #include "src/tint/lang/wgsl/ast/workgroup_attribute.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/function.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/containers/unique_vector.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::ZeroInitWorkgroupMemory);
 
diff --git a/src/tint/lang/wgsl/ast/traverse_expressions.h b/src/tint/lang/wgsl/ast/traverse_expressions.h
index 7e0d3cd..ed002db 100644
--- a/src/tint/lang/wgsl/ast/traverse_expressions.h
+++ b/src/tint/lang/wgsl/ast/traverse_expressions.h
@@ -17,9 +17,6 @@
 
 #include <vector>
 
-#include "src/tint/core/compiler_macros.h"
-#include "src/tint/core/reverse.h"
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/wgsl/ast/binary_expression.h"
 #include "src/tint/lang/wgsl/ast/bitcast_expression.h"
 #include "src/tint/lang/wgsl/ast/call_expression.h"
@@ -28,7 +25,10 @@
 #include "src/tint/lang/wgsl/ast/member_accessor_expression.h"
 #include "src/tint/lang/wgsl/ast/phony_expression.h"
 #include "src/tint/lang/wgsl/ast/unary_op_expression.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/reverse.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/macros/compiler.h"
+#include "src/tint/utils/rtti/switch.h"
 
 namespace tint::ast {
 
diff --git a/src/tint/lang/wgsl/ast/unary_op.h b/src/tint/lang/wgsl/ast/unary_op.h
index 8917425..209f499 100644
--- a/src/tint/lang/wgsl/ast/unary_op.h
+++ b/src/tint/lang/wgsl/ast/unary_op.h
@@ -15,7 +15,7 @@
 #ifndef SRC_TINT_LANG_WGSL_AST_UNARY_OP_H_
 #define SRC_TINT_LANG_WGSL_AST_UNARY_OP_H_
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::ast {
 
diff --git a/src/tint/lang/wgsl/ast_writer/generator_impl.cc b/src/tint/lang/wgsl/ast_writer/generator_impl.cc
index 6631cd8..43dfcd8 100644
--- a/src/tint/lang/wgsl/ast_writer/generator_impl.cc
+++ b/src/tint/lang/wgsl/ast_writer/generator_impl.cc
@@ -16,9 +16,6 @@
 
 #include <algorithm>
 
-#include "src/tint/core/defer.h"
-#include "src/tint/core/math.h"
-#include "src/tint/core/scoped_assignment.h"
 #include "src/tint/lang/wgsl/ast/alias.h"
 #include "src/tint/lang/wgsl/ast/bool_literal_expression.h"
 #include "src/tint/lang/wgsl/ast/call_statement.h"
@@ -37,8 +34,11 @@
 #include "src/tint/lang/wgsl/ast/workgroup_attribute.h"
 #include "src/tint/lang/wgsl/sem/struct.h"
 #include "src/tint/lang/wgsl/sem/switch_statement.h"
-#include "src/tint/switch.h"
-#include "src/tint/writer/float_to_string.h"
+#include "src/tint/utils/macros/defer.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
+#include "src/tint/utils/math/math.h"
+#include "src/tint/utils/rtti/switch.h"
+#include "src/tint/utils/text/float_to_string.h"
 
 namespace tint::writer::wgsl {
 
diff --git a/src/tint/lang/wgsl/ast_writer/generator_impl.h b/src/tint/lang/wgsl/ast_writer/generator_impl.h
index eaa377b..9b0cfde 100644
--- a/src/tint/lang/wgsl/ast_writer/generator_impl.h
+++ b/src/tint/lang/wgsl/ast_writer/generator_impl.h
@@ -17,7 +17,6 @@
 
 #include <string>
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/wgsl/ast/assignment_statement.h"
 #include "src/tint/lang/wgsl/ast/binary_expression.h"
 #include "src/tint/lang/wgsl/ast/bitcast_expression.h"
@@ -36,6 +35,7 @@
 #include "src/tint/lang/wgsl/ast/unary_op_expression.h"
 #include "src/tint/lang/wgsl/program/program.h"
 #include "src/tint/lang/wgsl/sem/struct.h"
+#include "src/tint/utils/text/string_stream.h"
 #include "src/tint/writer/ast_text_generator.h"
 
 namespace tint::writer::wgsl {
diff --git a/src/tint/lang/wgsl/ast_writer/generator_impl_array_accessor_test.cc b/src/tint/lang/wgsl/ast_writer/generator_impl_array_accessor_test.cc
index 4d9ba1c..1932fc7 100644
--- a/src/tint/lang/wgsl/ast_writer/generator_impl_array_accessor_test.cc
+++ b/src/tint/lang/wgsl/ast_writer/generator_impl_array_accessor_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/wgsl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/lang/wgsl/ast_writer/generator_impl_binary_test.cc b/src/tint/lang/wgsl/ast_writer/generator_impl_binary_test.cc
index 1e8be22..43f651e 100644
--- a/src/tint/lang/wgsl/ast_writer/generator_impl_binary_test.cc
+++ b/src/tint/lang/wgsl/ast_writer/generator_impl_binary_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/wgsl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/lang/wgsl/ast_writer/generator_impl_bitcast_test.cc b/src/tint/lang/wgsl/ast_writer/generator_impl_bitcast_test.cc
index dd66db6..bdec6de 100644
--- a/src/tint/lang/wgsl/ast_writer/generator_impl_bitcast_test.cc
+++ b/src/tint/lang/wgsl/ast_writer/generator_impl_bitcast_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/wgsl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/lang/wgsl/ast_writer/generator_impl_call_test.cc b/src/tint/lang/wgsl/ast_writer/generator_impl_call_test.cc
index 92561cd..d4b01cc 100644
--- a/src/tint/lang/wgsl/ast_writer/generator_impl_call_test.cc
+++ b/src/tint/lang/wgsl/ast_writer/generator_impl_call_test.cc
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/wgsl/ast/call_statement.h"
 #include "src/tint/lang/wgsl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/lang/wgsl/ast_writer/generator_impl_cast_test.cc b/src/tint/lang/wgsl/ast_writer/generator_impl_cast_test.cc
index 5687133..ecd7eb1 100644
--- a/src/tint/lang/wgsl/ast_writer/generator_impl_cast_test.cc
+++ b/src/tint/lang/wgsl/ast_writer/generator_impl_cast_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/wgsl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/lang/wgsl/ast_writer/generator_impl_identifier_test.cc b/src/tint/lang/wgsl/ast_writer/generator_impl_identifier_test.cc
index 273e92d..9ab5db8 100644
--- a/src/tint/lang/wgsl/ast_writer/generator_impl_identifier_test.cc
+++ b/src/tint/lang/wgsl/ast_writer/generator_impl_identifier_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/wgsl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/lang/wgsl/ast_writer/generator_impl_literal_test.cc b/src/tint/lang/wgsl/ast_writer/generator_impl_literal_test.cc
index c916489..f8bc2ba 100644
--- a/src/tint/lang/wgsl/ast_writer/generator_impl_literal_test.cc
+++ b/src/tint/lang/wgsl/ast_writer/generator_impl_literal_test.cc
@@ -14,8 +14,8 @@
 
 #include <cstring>
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/wgsl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/lang/wgsl/ast_writer/generator_impl_member_accessor_test.cc b/src/tint/lang/wgsl/ast_writer/generator_impl_member_accessor_test.cc
index 7dfbae3..c273637 100644
--- a/src/tint/lang/wgsl/ast_writer/generator_impl_member_accessor_test.cc
+++ b/src/tint/lang/wgsl/ast_writer/generator_impl_member_accessor_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/wgsl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/lang/wgsl/ast_writer/generator_impl_type_test.cc b/src/tint/lang/wgsl/ast_writer/generator_impl_type_test.cc
index 818885b..6bf65c2 100644
--- a/src/tint/lang/wgsl/ast_writer/generator_impl_type_test.cc
+++ b/src/tint/lang/wgsl/ast_writer/generator_impl_type_test.cc
@@ -12,13 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
 #include "src/tint/lang/base/type/depth_texture.h"
 #include "src/tint/lang/base/type/multisampled_texture.h"
 #include "src/tint/lang/base/type/sampled_texture.h"
 #include "src/tint/lang/base/type/texture_dimension.h"
 #include "src/tint/lang/wgsl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/lang/wgsl/ast_writer/generator_impl_unary_op_test.cc b/src/tint/lang/wgsl/ast_writer/generator_impl_unary_op_test.cc
index 70adfdc..058cfde 100644
--- a/src/tint/lang/wgsl/ast_writer/generator_impl_unary_op_test.cc
+++ b/src/tint/lang/wgsl/ast_writer/generator_impl_unary_op_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/wgsl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/lang/wgsl/ast_writer/generator_impl_variable_test.cc b/src/tint/lang/wgsl/ast_writer/generator_impl_variable_test.cc
index b8f2e70..496b59c 100644
--- a/src/tint/lang/wgsl/ast_writer/generator_impl_variable_test.cc
+++ b/src/tint/lang/wgsl/ast_writer/generator_impl_variable_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/wgsl/ast_writer/test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/lang/wgsl/helpers/append_vector.cc b/src/tint/lang/wgsl/helpers/append_vector.cc
index 28906a8..ed77827 100644
--- a/src/tint/lang/wgsl/helpers/append_vector.cc
+++ b/src/tint/lang/wgsl/helpers/append_vector.cc
@@ -17,12 +17,12 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/transform.h"
 #include "src/tint/lang/wgsl/sem/call.h"
 #include "src/tint/lang/wgsl/sem/value_constructor.h"
 #include "src/tint/lang/wgsl/sem/value_conversion.h"
 #include "src/tint/lang/wgsl/sem/value_expression.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/transform.h"
+#include "src/tint/utils/rtti/switch.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
diff --git a/src/tint/lang/wgsl/helpers/check_supported_extensions.cc b/src/tint/lang/wgsl/helpers/check_supported_extensions.cc
index 4ff4f7d..090c8a7 100644
--- a/src/tint/lang/wgsl/helpers/check_supported_extensions.cc
+++ b/src/tint/lang/wgsl/helpers/check_supported_extensions.cc
@@ -16,10 +16,10 @@
 
 #include <string>
 
-#include "src/tint/core/diagnostic/diagnostic.h"
-#include "src/tint/core/hashset.h"
-#include "src/tint/core/string.h"
 #include "src/tint/lang/wgsl/ast/module.h"
+#include "src/tint/utils/containers/hashset.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::writer {
 
diff --git a/src/tint/lang/wgsl/helpers/check_supported_extensions.h b/src/tint/lang/wgsl/helpers/check_supported_extensions.h
index 7cd4e89..8ef47c3 100644
--- a/src/tint/lang/wgsl/helpers/check_supported_extensions.h
+++ b/src/tint/lang/wgsl/helpers/check_supported_extensions.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_LANG_WGSL_HELPERS_CHECK_SUPPORTED_EXTENSIONS_H_
 #define SRC_TINT_LANG_WGSL_HELPERS_CHECK_SUPPORTED_EXTENSIONS_H_
 
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/base/builtin/extension.h"
+#include "src/tint/utils/containers/vector.h"
 
 namespace tint::ast {
 class Module;
diff --git a/src/tint/lang/wgsl/inspector/inspector.cc b/src/tint/lang/wgsl/inspector/inspector.cc
index 1505e97..ed6055f 100644
--- a/src/tint/lang/wgsl/inspector/inspector.cc
+++ b/src/tint/lang/wgsl/inspector/inspector.cc
@@ -17,9 +17,6 @@
 #include <limits>
 #include <utility>
 
-#include "src/tint/core/math.h"
-#include "src/tint/core/string.h"
-#include "src/tint/core/unique_vector.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
 #include "src/tint/lang/base/builtin/extension.h"
 #include "src/tint/lang/base/builtin/interpolation_sampling.h"
@@ -57,7 +54,10 @@
 #include "src/tint/lang/wgsl/sem/statement.h"
 #include "src/tint/lang/wgsl/sem/struct.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/unique_vector.h"
+#include "src/tint/utils/math/math.h"
+#include "src/tint/utils/rtti/switch.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::inspector {
 
diff --git a/src/tint/lang/wgsl/inspector/inspector.h b/src/tint/lang/wgsl/inspector/inspector.h
index 22cdf50..ca6bac9 100644
--- a/src/tint/lang/wgsl/inspector/inspector.h
+++ b/src/tint/lang/wgsl/inspector/inspector.h
@@ -25,13 +25,13 @@
 
 #include "tint/override_id.h"
 
-#include "src/tint/core/unique_vector.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
 #include "src/tint/lang/wgsl/inspector/entry_point.h"
 #include "src/tint/lang/wgsl/inspector/resource_binding.h"
 #include "src/tint/lang/wgsl/inspector/scalar.h"
 #include "src/tint/lang/wgsl/program/program.h"
 #include "src/tint/lang/wgsl/sem/sampler_texture_pair.h"
+#include "src/tint/utils/containers/unique_vector.h"
 
 namespace tint::inspector {
 
diff --git a/src/tint/lang/wgsl/program/program.cc b/src/tint/lang/wgsl/program/program.cc
index a563784..1d4fc75 100644
--- a/src/tint/lang/wgsl/program/program.cc
+++ b/src/tint/lang/wgsl/program/program.cc
@@ -19,7 +19,7 @@
 #include "src/tint/lang/wgsl/sem/type_expression.h"
 #include "src/tint/lang/wgsl/sem/value_expression.h"
 #include "src/tint/resolver/resolver.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/rtti/switch.h"
 
 namespace tint {
 namespace {
diff --git a/src/tint/lang/wgsl/program/program.h b/src/tint/lang/wgsl/program/program.h
index fc5c281..543f7fb 100644
--- a/src/tint/lang/wgsl/program/program.h
+++ b/src/tint/lang/wgsl/program/program.h
@@ -23,7 +23,7 @@
 #include "src/tint/lang/wgsl/ast/function.h"
 #include "src/tint/lang/wgsl/sem/info.h"
 #include "src/tint/program_id.h"
-#include "src/tint/symbol_table.h"
+#include "src/tint/utils/text/symbol_table.h"
 
 // Forward Declarations
 namespace tint {
diff --git a/src/tint/lang/wgsl/program/program_builder.cc b/src/tint/lang/wgsl/program/program_builder.cc
index 7bde46e..8269434 100644
--- a/src/tint/lang/wgsl/program/program_builder.cc
+++ b/src/tint/lang/wgsl/program/program_builder.cc
@@ -14,15 +14,15 @@
 
 #include "src/tint/lang/wgsl/program/program_builder.h"
 
-#include "src/tint/core/compiler_macros.h"
-#include "src/tint/debug.h"
 #include "src/tint/lang/wgsl/ast/assignment_statement.h"
 #include "src/tint/lang/wgsl/ast/call_statement.h"
 #include "src/tint/lang/wgsl/ast/variable_decl_statement.h"
 #include "src/tint/lang/wgsl/sem/type_expression.h"
 #include "src/tint/lang/wgsl/sem/value_expression.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/macros/compiler.h"
+#include "src/tint/utils/rtti/switch.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
diff --git a/src/tint/lang/wgsl/program/program_builder.h b/src/tint/lang/wgsl/program/program_builder.h
index 5c16a4c..22c5ce2 100644
--- a/src/tint/lang/wgsl/program/program_builder.h
+++ b/src/tint/lang/wgsl/program/program_builder.h
@@ -21,7 +21,6 @@
 
 #include "tint/override_id.h"
 
-#include "src/tint/core/string.h"
 #include "src/tint/lang/base/builtin/extension.h"
 #include "src/tint/lang/base/builtin/fluent_types.h"
 #include "src/tint/lang/base/builtin/interpolation_sampling.h"
@@ -104,6 +103,7 @@
 #include "src/tint/lang/wgsl/sem/array_count.h"
 #include "src/tint/lang/wgsl/sem/struct.h"
 #include "src/tint/program_id.h"
+#include "src/tint/utils/text/string.h"
 
 #ifdef CURRENTLY_IN_TINT_PUBLIC_HEADER
 #error "internal tint header being #included from tint.h"
diff --git a/src/tint/lang/wgsl/reader/classify_template_args.cc b/src/tint/lang/wgsl/reader/classify_template_args.cc
index 3455ca0..780552b 100644
--- a/src/tint/lang/wgsl/reader/classify_template_args.cc
+++ b/src/tint/lang/wgsl/reader/classify_template_args.cc
@@ -16,8 +16,8 @@
 
 #include <vector>
 
-#include "src/tint/core/vector.h"
-#include "src/tint/debug.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/debug/debug.h"
 
 namespace tint::reader::wgsl {
 
diff --git a/src/tint/lang/wgsl/reader/classify_template_args_test.cc b/src/tint/lang/wgsl/reader/classify_template_args_test.cc
index 944fa8f..ed7a888 100644
--- a/src/tint/lang/wgsl/reader/classify_template_args_test.cc
+++ b/src/tint/lang/wgsl/reader/classify_template_args_test.cc
@@ -14,9 +14,9 @@
 
 #include "gmock/gmock.h"
 
-#include "src/tint/core/transform.h"
 #include "src/tint/lang/wgsl/reader/classify_template_args.h"
 #include "src/tint/lang/wgsl/reader/lexer.h"
+#include "src/tint/utils/containers/transform.h"
 
 namespace tint::reader::wgsl {
 namespace {
diff --git a/src/tint/lang/wgsl/reader/lexer.cc b/src/tint/lang/wgsl/reader/lexer.cc
index f8e0ee5..a0a6735 100644
--- a/src/tint/lang/wgsl/reader/lexer.cc
+++ b/src/tint/lang/wgsl/reader/lexer.cc
@@ -25,10 +25,10 @@
 #include <type_traits>
 #include <utility>
 
-#include "src/tint/core/parse_num.h"
-#include "src/tint/core/unicode.h"
-#include "src/tint/debug.h"
 #include "src/tint/lang/base/builtin/number.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/text/parse_num.h"
+#include "src/tint/utils/text/unicode.h"
 
 namespace tint::reader::wgsl {
 namespace {
diff --git a/src/tint/lang/wgsl/reader/parser_impl.cc b/src/tint/lang/wgsl/reader/parser_impl.cc
index 5ffbcdd..27c6436 100644
--- a/src/tint/lang/wgsl/reader/parser_impl.cc
+++ b/src/tint/lang/wgsl/reader/parser_impl.cc
@@ -16,10 +16,6 @@
 
 #include <limits>
 
-#include "src/tint/core/defer.h"
-#include "src/tint/core/reverse.h"
-#include "src/tint/core/string.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/builtin/attribute.h"
 #include "src/tint/lang/base/type/depth_texture.h"
 #include "src/tint/lang/base/type/external_texture.h"
@@ -46,6 +42,10 @@
 #include "src/tint/lang/wgsl/ast/workgroup_attribute.h"
 #include "src/tint/lang/wgsl/reader/classify_template_args.h"
 #include "src/tint/lang/wgsl/reader/lexer.h"
+#include "src/tint/utils/containers/reverse.h"
+#include "src/tint/utils/macros/defer.h"
+#include "src/tint/utils/text/string.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::reader::wgsl {
 namespace {
diff --git a/src/tint/lang/wgsl/reader/parser_impl_error_msg_test.cc b/src/tint/lang/wgsl/reader/parser_impl_error_msg_test.cc
index 15eba9b..3233c20 100644
--- a/src/tint/lang/wgsl/reader/parser_impl_error_msg_test.cc
+++ b/src/tint/lang/wgsl/reader/parser_impl_error_msg_test.cc
@@ -14,7 +14,7 @@
 
 #include "src/tint/lang/wgsl/reader/parser_impl_test_helper.h"
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::reader::wgsl {
 namespace {
diff --git a/src/tint/lang/wgsl/reader/parser_impl_expression_test.cc b/src/tint/lang/wgsl/reader/parser_impl_expression_test.cc
index 1c8d7b4..dad793d 100644
--- a/src/tint/lang/wgsl/reader/parser_impl_expression_test.cc
+++ b/src/tint/lang/wgsl/reader/parser_impl_expression_test.cc
@@ -14,7 +14,7 @@
 
 #include "src/tint/lang/wgsl/reader/parser_impl_test_helper.h"
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::reader::wgsl {
 namespace {
diff --git a/src/tint/lang/wgsl/reader/parser_impl_function_decl_test.cc b/src/tint/lang/wgsl/reader/parser_impl_function_decl_test.cc
index 03da54e..6822822 100644
--- a/src/tint/lang/wgsl/reader/parser_impl_function_decl_test.cc
+++ b/src/tint/lang/wgsl/reader/parser_impl_function_decl_test.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string.h"
 #include "src/tint/lang/wgsl/ast/test_helper.h"
 #include "src/tint/lang/wgsl/ast/workgroup_attribute.h"
 #include "src/tint/lang/wgsl/reader/parser_impl_test_helper.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::reader::wgsl {
 namespace {
diff --git a/src/tint/lang/wgsl/reader/parser_impl_struct_decl_test.cc b/src/tint/lang/wgsl/reader/parser_impl_struct_decl_test.cc
index 9497c1c..1281eef 100644
--- a/src/tint/lang/wgsl/reader/parser_impl_struct_decl_test.cc
+++ b/src/tint/lang/wgsl/reader/parser_impl_struct_decl_test.cc
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string.h"
 #include "src/tint/lang/wgsl/reader/parser_impl_test_helper.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::reader::wgsl {
 namespace {
diff --git a/src/tint/lang/wgsl/reader/token.h b/src/tint/lang/wgsl/reader/token.h
index 3cbadc8..fd2f6f9 100644
--- a/src/tint/lang/wgsl/reader/token.h
+++ b/src/tint/lang/wgsl/reader/token.h
@@ -19,7 +19,7 @@
 #include <string_view>
 #include <variant>
 
-#include "src/tint/source.h"
+#include "src/tint/utils/diagnostic/source.h"
 
 namespace tint::reader::wgsl {
 
diff --git a/src/tint/lang/wgsl/sem/behavior.h b/src/tint/lang/wgsl/sem/behavior.h
index 9339325..d47f57a 100644
--- a/src/tint/lang/wgsl/sem/behavior.h
+++ b/src/tint/lang/wgsl/sem/behavior.h
@@ -15,7 +15,7 @@
 #ifndef SRC_TINT_LANG_WGSL_SEM_BEHAVIOR_H_
 #define SRC_TINT_LANG_WGSL_SEM_BEHAVIOR_H_
 
-#include "src/tint/core/enum_set.h"
+#include "src/tint/utils/containers/enum_set.h"
 
 namespace tint::sem {
 
diff --git a/src/tint/lang/wgsl/sem/binding_point.h b/src/tint/lang/wgsl/sem/binding_point.h
index a6a560f..66923d1 100644
--- a/src/tint/lang/wgsl/sem/binding_point.h
+++ b/src/tint/lang/wgsl/sem/binding_point.h
@@ -19,9 +19,9 @@
 
 #include <functional>
 
-#include "src/tint/core/hash.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/reflection.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/reflection/reflection.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::sem {
 
diff --git a/src/tint/lang/wgsl/sem/builtin.cc b/src/tint/lang/wgsl/sem/builtin.cc
index 4cbeee2..2840dc8 100644
--- a/src/tint/lang/wgsl/sem/builtin.cc
+++ b/src/tint/lang/wgsl/sem/builtin.cc
@@ -20,7 +20,7 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/transform.h"
+#include "src/tint/utils/containers/transform.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Builtin);
 
diff --git a/src/tint/lang/wgsl/sem/builtin.h b/src/tint/lang/wgsl/sem/builtin.h
index 2420554..8f7de28 100644
--- a/src/tint/lang/wgsl/sem/builtin.h
+++ b/src/tint/lang/wgsl/sem/builtin.h
@@ -18,11 +18,11 @@
 #include <string>
 #include <vector>
 
-#include "src/tint/core/hash.h"
 #include "src/tint/lang/base/builtin/extension.h"
 #include "src/tint/lang/base/builtin/function.h"
 #include "src/tint/lang/wgsl/sem/call_target.h"
 #include "src/tint/lang/wgsl/sem/pipeline_stage_set.h"
+#include "src/tint/utils/math/hash.h"
 
 namespace tint::sem {
 
diff --git a/src/tint/lang/wgsl/sem/call.h b/src/tint/lang/wgsl/sem/call.h
index bcb9def..271c0ac 100644
--- a/src/tint/lang/wgsl/sem/call.h
+++ b/src/tint/lang/wgsl/sem/call.h
@@ -17,10 +17,10 @@
 
 #include <vector>
 
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/wgsl/ast/call_expression.h"
 #include "src/tint/lang/wgsl/sem/builtin.h"
 #include "src/tint/lang/wgsl/sem/value_expression.h"
+#include "src/tint/utils/containers/vector.h"
 
 namespace tint::sem {
 
diff --git a/src/tint/lang/wgsl/sem/call_target.cc b/src/tint/lang/wgsl/sem/call_target.cc
index a5aa5f8..94664ca 100644
--- a/src/tint/lang/wgsl/sem/call_target.cc
+++ b/src/tint/lang/wgsl/sem/call_target.cc
@@ -16,8 +16,8 @@
 
 #include <utility>
 
-#include "src/tint/core/hash.h"
-#include "src/tint/symbol_table.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/text/symbol_table.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::CallTarget);
 
diff --git a/src/tint/lang/wgsl/sem/call_target.h b/src/tint/lang/wgsl/sem/call_target.h
index 6611205..a8432cd 100644
--- a/src/tint/lang/wgsl/sem/call_target.h
+++ b/src/tint/lang/wgsl/sem/call_target.h
@@ -17,11 +17,11 @@
 
 #include <vector>
 
-#include "src/tint/core/hash.h"
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/base/type/sampler.h"
 #include "src/tint/lang/wgsl/sem/node.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/math/hash.h"
 
 namespace tint::sem {
 
diff --git a/src/tint/lang/wgsl/sem/function.cc b/src/tint/lang/wgsl/sem/function.cc
index 84cd857..995018f 100644
--- a/src/tint/lang/wgsl/sem/function.cc
+++ b/src/tint/lang/wgsl/sem/function.cc
@@ -14,7 +14,6 @@
 
 #include "src/tint/lang/wgsl/sem/function.h"
 
-#include "src/tint/core/transform.h"
 #include "src/tint/lang/base/type/depth_texture.h"
 #include "src/tint/lang/base/type/external_texture.h"
 #include "src/tint/lang/base/type/multisampled_texture.h"
@@ -24,6 +23,7 @@
 #include "src/tint/lang/wgsl/ast/identifier.h"
 #include "src/tint/lang/wgsl/ast/must_use_attribute.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
+#include "src/tint/utils/containers/transform.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Function);
 
diff --git a/src/tint/lang/wgsl/sem/function.h b/src/tint/lang/wgsl/sem/function.h
index 8f27746..fc5ded6 100644
--- a/src/tint/lang/wgsl/sem/function.h
+++ b/src/tint/lang/wgsl/sem/function.h
@@ -20,11 +20,11 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/unique_vector.h"
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/wgsl/ast/diagnostic_control.h"
 #include "src/tint/lang/wgsl/ast/variable.h"
 #include "src/tint/lang/wgsl/sem/call.h"
+#include "src/tint/utils/containers/unique_vector.h"
+#include "src/tint/utils/containers/vector.h"
 
 // Forward declarations
 namespace tint::ast {
diff --git a/src/tint/lang/wgsl/sem/info.cc b/src/tint/lang/wgsl/sem/info.cc
index 5643ff1..750836e 100644
--- a/src/tint/lang/wgsl/sem/info.cc
+++ b/src/tint/lang/wgsl/sem/info.cc
@@ -18,7 +18,7 @@
 #include "src/tint/lang/wgsl/sem/module.h"
 #include "src/tint/lang/wgsl/sem/statement.h"
 #include "src/tint/lang/wgsl/sem/value_expression.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/rtti/switch.h"
 
 namespace tint::sem {
 
diff --git a/src/tint/lang/wgsl/sem/info.h b/src/tint/lang/wgsl/sem/info.h
index 1dbf14c..5ceb724 100644
--- a/src/tint/lang/wgsl/sem/info.h
+++ b/src/tint/lang/wgsl/sem/info.h
@@ -20,12 +20,12 @@
 #include <unordered_map>
 #include <vector>
 
-#include "src/tint/core/unique_vector.h"
-#include "src/tint/debug.h"
 #include "src/tint/lang/wgsl/ast/diagnostic_control.h"
 #include "src/tint/lang/wgsl/ast/node.h"
 #include "src/tint/lang/wgsl/sem/node.h"
 #include "src/tint/lang/wgsl/sem/type_mappings.h"
+#include "src/tint/utils/containers/unique_vector.h"
+#include "src/tint/utils/debug/debug.h"
 
 // Forward declarations
 namespace tint::sem {
diff --git a/src/tint/lang/wgsl/sem/load.cc b/src/tint/lang/wgsl/sem/load.cc
index ff53446..c6426c3 100644
--- a/src/tint/lang/wgsl/sem/load.cc
+++ b/src/tint/lang/wgsl/sem/load.cc
@@ -14,8 +14,8 @@
 
 #include "src/tint/lang/wgsl/sem/load.h"
 
-#include "src/tint/debug.h"
 #include "src/tint/lang/base/type/reference.h"
+#include "src/tint/utils/debug/debug.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::Load);
 
diff --git a/src/tint/lang/wgsl/sem/member_accessor_expression.h b/src/tint/lang/wgsl/sem/member_accessor_expression.h
index 91f6c69..3dfcf88 100644
--- a/src/tint/lang/wgsl/sem/member_accessor_expression.h
+++ b/src/tint/lang/wgsl/sem/member_accessor_expression.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_LANG_WGSL_SEM_MEMBER_ACCESSOR_EXPRESSION_H_
 #define SRC_TINT_LANG_WGSL_SEM_MEMBER_ACCESSOR_EXPRESSION_H_
 
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/wgsl/sem/accessor_expression.h"
+#include "src/tint/utils/containers/vector.h"
 
 // Forward declarations
 namespace tint::ast {
diff --git a/src/tint/lang/wgsl/sem/module.h b/src/tint/lang/wgsl/sem/module.h
index cd8acb1..b2c8ad4 100644
--- a/src/tint/lang/wgsl/sem/module.h
+++ b/src/tint/lang/wgsl/sem/module.h
@@ -15,10 +15,10 @@
 #ifndef SRC_TINT_LANG_WGSL_SEM_MODULE_H_
 #define SRC_TINT_LANG_WGSL_SEM_MODULE_H_
 
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/base/builtin/extension.h"
 #include "src/tint/lang/wgsl/ast/diagnostic_control.h"
 #include "src/tint/lang/wgsl/sem/node.h"
+#include "src/tint/utils/containers/vector.h"
 
 // Forward declarations
 namespace tint::ast {
diff --git a/src/tint/lang/wgsl/sem/node.h b/src/tint/lang/wgsl/sem/node.h
index 78102e0..dd86305 100644
--- a/src/tint/lang/wgsl/sem/node.h
+++ b/src/tint/lang/wgsl/sem/node.h
@@ -15,7 +15,7 @@
 #ifndef SRC_TINT_LANG_WGSL_SEM_NODE_H_
 #define SRC_TINT_LANG_WGSL_SEM_NODE_H_
 
-#include "src/tint/core/castable.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::sem {
 
diff --git a/src/tint/lang/wgsl/sem/pipeline_stage_set.h b/src/tint/lang/wgsl/sem/pipeline_stage_set.h
index 01bc2b8..4d98665 100644
--- a/src/tint/lang/wgsl/sem/pipeline_stage_set.h
+++ b/src/tint/lang/wgsl/sem/pipeline_stage_set.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_LANG_WGSL_SEM_PIPELINE_STAGE_SET_H_
 #define SRC_TINT_LANG_WGSL_SEM_PIPELINE_STAGE_SET_H_
 
-#include "src/tint/core/enum_set.h"
 #include "src/tint/lang/wgsl/ast/pipeline_stage.h"
+#include "src/tint/utils/containers/enum_set.h"
 
 namespace tint::sem {
 
diff --git a/src/tint/lang/wgsl/sem/sampler_texture_pair.h b/src/tint/lang/wgsl/sem/sampler_texture_pair.h
index 11f95f8..13e5ed5 100644
--- a/src/tint/lang/wgsl/sem/sampler_texture_pair.h
+++ b/src/tint/lang/wgsl/sem/sampler_texture_pair.h
@@ -18,8 +18,8 @@
 #include <cstdint>
 #include <functional>
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/wgsl/sem/binding_point.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::sem {
 
diff --git a/src/tint/lang/wgsl/sem/statement.h b/src/tint/lang/wgsl/sem/statement.h
index ff8266a..21909b5 100644
--- a/src/tint/lang/wgsl/sem/statement.h
+++ b/src/tint/lang/wgsl/sem/statement.h
@@ -15,11 +15,11 @@
 #ifndef SRC_TINT_LANG_WGSL_SEM_STATEMENT_H_
 #define SRC_TINT_LANG_WGSL_SEM_STATEMENT_H_
 
-#include "src/tint/core/hashmap.h"
 #include "src/tint/lang/wgsl/ast/diagnostic_control.h"
 #include "src/tint/lang/wgsl/sem/behavior.h"
 #include "src/tint/lang/wgsl/sem/node.h"
-#include "src/tint/symbol.h"
+#include "src/tint/utils/containers/hashmap.h"
+#include "src/tint/utils/text/symbol.h"
 
 // Forward declarations
 namespace tint::ast {
diff --git a/src/tint/lang/wgsl/sem/struct.h b/src/tint/lang/wgsl/sem/struct.h
index 0915fb6..ececcdd 100644
--- a/src/tint/lang/wgsl/sem/struct.h
+++ b/src/tint/lang/wgsl/sem/struct.h
@@ -17,12 +17,12 @@
 
 #include <optional>
 
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/base/builtin/address_space.h"
 #include "src/tint/lang/base/type/struct.h"
 #include "src/tint/lang/base/type/type.h"
 #include "src/tint/lang/wgsl/ast/struct.h"
-#include "src/tint/symbol.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/text/symbol.h"
 
 // Forward declarations
 namespace tint::ast {
diff --git a/src/tint/lang/wgsl/sem/value_constructor.h b/src/tint/lang/wgsl/sem/value_constructor.h
index 96485fd..a8a488a 100644
--- a/src/tint/lang/wgsl/sem/value_constructor.h
+++ b/src/tint/lang/wgsl/sem/value_constructor.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_LANG_WGSL_SEM_VALUE_CONSTRUCTOR_H_
 #define SRC_TINT_LANG_WGSL_SEM_VALUE_CONSTRUCTOR_H_
 
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/wgsl/sem/call_target.h"
+#include "src/tint/utils/containers/vector.h"
 
 namespace tint::sem {
 
diff --git a/src/tint/lang/wgsl/sem/value_expression.cc b/src/tint/lang/wgsl/sem/value_expression.cc
index 0098722..5d69e97 100644
--- a/src/tint/lang/wgsl/sem/value_expression.cc
+++ b/src/tint/lang/wgsl/sem/value_expression.cc
@@ -18,7 +18,7 @@
 
 #include "src/tint/lang/wgsl/sem/load.h"
 #include "src/tint/lang/wgsl/sem/materialize.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/rtti/switch.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::ValueExpression);
 
diff --git a/src/tint/lang/wgsl/sem/variable.h b/src/tint/lang/wgsl/sem/variable.h
index 074172b..430c8ea 100644
--- a/src/tint/lang/wgsl/sem/variable.h
+++ b/src/tint/lang/wgsl/sem/variable.h
@@ -21,7 +21,6 @@
 
 #include "tint/override_id.h"
 
-#include "src/tint/core/unique_vector.h"
 #include "src/tint/lang/base/builtin/access.h"
 #include "src/tint/lang/base/builtin/address_space.h"
 #include "src/tint/lang/base/type/type.h"
@@ -29,6 +28,7 @@
 #include "src/tint/lang/wgsl/sem/binding_point.h"
 #include "src/tint/lang/wgsl/sem/parameter_usage.h"
 #include "src/tint/lang/wgsl/sem/value_expression.h"
+#include "src/tint/utils/containers/unique_vector.h"
 
 // Forward declarations
 namespace tint::ast {
diff --git a/src/tint/lang/wgsl/syntax_tree_writer/generator_impl.cc b/src/tint/lang/wgsl/syntax_tree_writer/generator_impl.cc
index 6c0a364..c04b075 100644
--- a/src/tint/lang/wgsl/syntax_tree_writer/generator_impl.cc
+++ b/src/tint/lang/wgsl/syntax_tree_writer/generator_impl.cc
@@ -16,8 +16,6 @@
 
 #include <algorithm>
 
-#include "src/tint/core/math.h"
-#include "src/tint/core/scoped_assignment.h"
 #include "src/tint/lang/wgsl/ast/alias.h"
 #include "src/tint/lang/wgsl/ast/bool_literal_expression.h"
 #include "src/tint/lang/wgsl/ast/call_statement.h"
@@ -36,8 +34,10 @@
 #include "src/tint/lang/wgsl/ast/workgroup_attribute.h"
 #include "src/tint/lang/wgsl/sem/struct.h"
 #include "src/tint/lang/wgsl/sem/switch_statement.h"
-#include "src/tint/switch.h"
-#include "src/tint/writer/float_to_string.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
+#include "src/tint/utils/math/math.h"
+#include "src/tint/utils/rtti/switch.h"
+#include "src/tint/utils/text/float_to_string.h"
 
 namespace tint::writer::syntax_tree {
 
diff --git a/src/tint/lang/wgsl/syntax_tree_writer/generator_impl.h b/src/tint/lang/wgsl/syntax_tree_writer/generator_impl.h
index 8bfe646..c02af16 100644
--- a/src/tint/lang/wgsl/syntax_tree_writer/generator_impl.h
+++ b/src/tint/lang/wgsl/syntax_tree_writer/generator_impl.h
@@ -17,7 +17,6 @@
 
 #include <string>
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/wgsl/ast/assignment_statement.h"
 #include "src/tint/lang/wgsl/ast/binary_expression.h"
 #include "src/tint/lang/wgsl/ast/bitcast_expression.h"
@@ -36,6 +35,7 @@
 #include "src/tint/lang/wgsl/ast/unary_op_expression.h"
 #include "src/tint/lang/wgsl/program/program.h"
 #include "src/tint/lang/wgsl/sem/struct.h"
+#include "src/tint/utils/text/string_stream.h"
 #include "src/tint/writer/ast_text_generator.h"
 
 namespace tint::writer::syntax_tree {
diff --git a/src/tint/program_id.h b/src/tint/program_id.h
index cc72254..8d538d0 100644
--- a/src/tint/program_id.h
+++ b/src/tint/program_id.h
@@ -18,8 +18,8 @@
 #include <stdint.h>
 #include <utility>
 
-#include "src/tint/core/string_stream.h"
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint {
 
diff --git a/src/tint/resolver/alias_analysis_test.cc b/src/tint/resolver/alias_analysis_test.cc
index b1223e2..7c055f7 100644
--- a/src/tint/resolver/alias_analysis_test.cc
+++ b/src/tint/resolver/alias_analysis_test.cc
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/resolver/resolver.h"
 #include "src/tint/resolver/resolver_test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/resolver/attribute_validation_test.cc b/src/tint/resolver/attribute_validation_test.cc
index c31ff4a..6938935 100644
--- a/src/tint/resolver/attribute_validation_test.cc
+++ b/src/tint/resolver/attribute_validation_test.cc
@@ -12,13 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
 #include "src/tint/lang/base/type/texture_dimension.h"
 #include "src/tint/lang/wgsl/ast/disable_validation_attribute.h"
 #include "src/tint/lang/wgsl/ast/transform/add_block_attribute.h"
 #include "src/tint/resolver/resolver.h"
 #include "src/tint/resolver/resolver_test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/resolver/builtin_test.cc b/src/tint/resolver/builtin_test.cc
index c22d7ed..6c31ada 100644
--- a/src/tint/resolver/builtin_test.cc
+++ b/src/tint/resolver/builtin_test.cc
@@ -15,8 +15,6 @@
 #include "src/tint/resolver/resolver.h"
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/type/sampled_texture.h"
 #include "src/tint/lang/base/type/test_helper.h"
 #include "src/tint/lang/base/type/texture_dimension.h"
@@ -39,6 +37,8 @@
 #include "src/tint/lang/wgsl/sem/statement.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
 #include "src/tint/resolver/resolver_test_helper.h"
+#include "src/tint/utils/text/string.h"
+#include "src/tint/utils/text/string_stream.h"
 
 using ::testing::ElementsAre;
 using ::testing::HasSubstr;
diff --git a/src/tint/resolver/builtin_validation_test.cc b/src/tint/resolver/builtin_validation_test.cc
index 43f2b9c..ef7baae 100644
--- a/src/tint/resolver/builtin_validation_test.cc
+++ b/src/tint/resolver/builtin_validation_test.cc
@@ -14,10 +14,10 @@
 
 #include <unordered_set>
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/wgsl/ast/builtin_texture_helper_test.h"
 #include "src/tint/lang/wgsl/sem/value_constructor.h"
 #include "src/tint/resolver/resolver_test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::resolver {
 namespace {
diff --git a/src/tint/resolver/builtins_validation_test.cc b/src/tint/resolver/builtins_validation_test.cc
index 143ed4f..a9dd806 100644
--- a/src/tint/resolver/builtins_validation_test.cc
+++ b/src/tint/resolver/builtins_validation_test.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
 #include "src/tint/lang/wgsl/ast/call_statement.h"
 #include "src/tint/resolver/resolver_test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::resolver {
 namespace {
diff --git a/src/tint/resolver/const_eval.cc b/src/tint/resolver/const_eval.cc
index 11c6057..92c18a5 100644
--- a/src/tint/resolver/const_eval.cc
+++ b/src/tint/resolver/const_eval.cc
@@ -22,11 +22,6 @@
 #include <type_traits>
 #include <utility>
 
-#include "src/tint/core/bitcast.h"
-#include "src/tint/core/compiler_macros.h"
-#include "src/tint/core/map.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/core/transform.h"
 #include "src/tint/lang/base/builtin/number.h"
 #include "src/tint/lang/base/constant/composite.h"
 #include "src/tint/lang/base/constant/scalar.h"
@@ -46,7 +41,12 @@
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/member_accessor_expression.h"
 #include "src/tint/lang/wgsl/sem/value_constructor.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/containers/transform.h"
+#include "src/tint/utils/macros/compiler.h"
+#include "src/tint/utils/memory/bitcast.h"
+#include "src/tint/utils/rtti/switch.h"
+#include "src/tint/utils/text/string_stream.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
diff --git a/src/tint/resolver/const_eval.h b/src/tint/resolver/const_eval.h
index 661801f..e97b7a6 100644
--- a/src/tint/resolver/const_eval.h
+++ b/src/tint/resolver/const_eval.h
@@ -18,10 +18,10 @@
 #include <stddef.h>
 #include <string>
 
-#include "src/tint/core/result.h"
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/base/builtin/number.h"
 #include "src/tint/lang/base/type/type.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/result/result.h"
 
 // Forward declarations
 namespace tint {
diff --git a/src/tint/resolver/const_eval_binary_op_test.cc b/src/tint/resolver/const_eval_binary_op_test.cc
index a5e22f0..457d0f5 100644
--- a/src/tint/resolver/const_eval_binary_op_test.cc
+++ b/src/tint/resolver/const_eval_binary_op_test.cc
@@ -14,8 +14,8 @@
 
 #include "src/tint/resolver/const_eval_test.h"
 
-#include "src/tint/core/result.h"
 #include "src/tint/lang/wgsl/reader/parser.h"
+#include "src/tint/utils/result/result.h"
 
 using namespace tint::builtin::fluent_types;  // NOLINT
 using namespace tint::number_suffixes;        // NOLINT
diff --git a/src/tint/resolver/const_eval_builtin_test.cc b/src/tint/resolver/const_eval_builtin_test.cc
index 10f98d7..ba8fdac 100644
--- a/src/tint/resolver/const_eval_builtin_test.cc
+++ b/src/tint/resolver/const_eval_builtin_test.cc
@@ -14,7 +14,7 @@
 
 #include "src/tint/resolver/const_eval_test.h"
 
-#include "src/tint/core/result.h"
+#include "src/tint/utils/result/result.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 using ::testing::HasSubstr;
diff --git a/src/tint/resolver/const_eval_test.h b/src/tint/resolver/const_eval_test.h
index e761743..b66c448 100644
--- a/src/tint/resolver/const_eval_test.h
+++ b/src/tint/resolver/const_eval_test.h
@@ -22,10 +22,10 @@
 
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/type/test_helper.h"
 #include "src/tint/resolver/resolver_test_helper.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/rtti/switch.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::resolver {
 
diff --git a/src/tint/resolver/dependency_graph.cc b/src/tint/resolver/dependency_graph.cc
index 623777f..2bdf339 100644
--- a/src/tint/resolver/dependency_graph.cc
+++ b/src/tint/resolver/dependency_graph.cc
@@ -19,14 +19,6 @@
 #include <variant>
 #include <vector>
 
-#include "src/tint/core/block_allocator.h"
-#include "src/tint/core/compiler_macros.h"
-#include "src/tint/core/defer.h"
-#include "src/tint/core/map.h"
-#include "src/tint/core/scoped_assignment.h"
-#include "src/tint/core/string.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/core/unique_vector.h"
 #include "src/tint/lang/base/builtin/builtin.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
 #include "src/tint/lang/wgsl/ast/alias.h"
@@ -69,8 +61,16 @@
 #include "src/tint/lang/wgsl/ast/while_statement.h"
 #include "src/tint/lang/wgsl/ast/workgroup_attribute.h"
 #include "src/tint/lang/wgsl/sem/builtin.h"
-#include "src/tint/scope_stack.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/containers/scope_stack.h"
+#include "src/tint/utils/containers/unique_vector.h"
+#include "src/tint/utils/macros/compiler.h"
+#include "src/tint/utils/macros/defer.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
+#include "src/tint/utils/memory/block_allocator.h"
+#include "src/tint/utils/rtti/switch.h"
+#include "src/tint/utils/text/string.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #define TINT_DUMP_DEPENDENCY_GRAPH 0
 
diff --git a/src/tint/resolver/dependency_graph.h b/src/tint/resolver/dependency_graph.h
index 80dae2e..d66c37d 100644
--- a/src/tint/resolver/dependency_graph.h
+++ b/src/tint/resolver/dependency_graph.h
@@ -18,8 +18,6 @@
 #include <string>
 #include <vector>
 
-#include "src/tint/core/diagnostic/diagnostic.h"
-#include "src/tint/core/hashmap.h"
 #include "src/tint/lang/base/builtin/access.h"
 #include "src/tint/lang/base/builtin/builtin.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
@@ -28,6 +26,8 @@
 #include "src/tint/lang/base/builtin/interpolation_type.h"
 #include "src/tint/lang/base/builtin/texel_format.h"
 #include "src/tint/lang/wgsl/ast/module.h"
+#include "src/tint/utils/containers/hashmap.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
 
 namespace tint::resolver {
 
diff --git a/src/tint/resolver/dependency_graph_test.cc b/src/tint/resolver/dependency_graph_test.cc
index a46e6f8..01b6574 100644
--- a/src/tint/resolver/dependency_graph_test.cc
+++ b/src/tint/resolver/dependency_graph_test.cc
@@ -17,11 +17,11 @@
 #include <utility>
 
 #include "gmock/gmock.h"
-#include "src/tint/core/transform.h"
 #include "src/tint/lang/base/builtin/address_space.h"
 #include "src/tint/lang/base/type/texture_dimension.h"
 #include "src/tint/resolver/dependency_graph.h"
 #include "src/tint/resolver/resolver_test_helper.h"
+#include "src/tint/utils/containers/transform.h"
 
 namespace tint::resolver {
 namespace {
diff --git a/src/tint/resolver/function_validation_test.cc b/src/tint/resolver/function_validation_test.cc
index 222bba1..8c23463 100644
--- a/src/tint/resolver/function_validation_test.cc
+++ b/src/tint/resolver/function_validation_test.cc
@@ -12,13 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
 #include "src/tint/lang/wgsl/ast/discard_statement.h"
 #include "src/tint/lang/wgsl/ast/return_statement.h"
 #include "src/tint/lang/wgsl/ast/stage_attribute.h"
 #include "src/tint/resolver/resolver.h"
 #include "src/tint/resolver/resolver_test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/resolver/intrinsic_table.cc b/src/tint/resolver/intrinsic_table.cc
index 934360c..c61c2c5 100644
--- a/src/tint/resolver/intrinsic_table.cc
+++ b/src/tint/resolver/intrinsic_table.cc
@@ -18,11 +18,6 @@
 #include <limits>
 #include <utility>
 
-#include "src/tint/core/hash.h"
-#include "src/tint/core/hashmap.h"
-#include "src/tint/core/math.h"
-#include "src/tint/core/scoped_assignment.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/type/abstract_float.h"
 #include "src/tint/lang/base/type/abstract_int.h"
 #include "src/tint/lang/base/type/abstract_numeric.h"
@@ -41,7 +36,12 @@
 #include "src/tint/lang/wgsl/sem/pipeline_stage_set.h"
 #include "src/tint/lang/wgsl/sem/value_constructor.h"
 #include "src/tint/lang/wgsl/sem/value_conversion.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/hashmap.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/math/math.h"
+#include "src/tint/utils/rtti/switch.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::resolver {
 namespace {
diff --git a/src/tint/resolver/intrinsic_table.h b/src/tint/resolver/intrinsic_table.h
index 7f28a45..ab45e54 100644
--- a/src/tint/resolver/intrinsic_table.h
+++ b/src/tint/resolver/intrinsic_table.h
@@ -18,12 +18,12 @@
 #include <memory>
 #include <string>
 
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/wgsl/ast/binary_expression.h"
 #include "src/tint/lang/wgsl/ast/unary_op.h"
 #include "src/tint/lang/wgsl/sem/builtin.h"
 #include "src/tint/resolver/const_eval.h"
 #include "src/tint/resolver/ctor_conv_intrinsic.h"
+#include "src/tint/utils/containers/vector.h"
 
 // Forward declarations
 namespace tint {
diff --git a/src/tint/resolver/materialize_test.cc b/src/tint/resolver/materialize_test.cc
index bbe079c..f704391 100644
--- a/src/tint/resolver/materialize_test.cc
+++ b/src/tint/resolver/materialize_test.cc
@@ -17,7 +17,7 @@
 #include "src/tint/lang/base/type/test_helper.h"
 #include "src/tint/resolver/resolver.h"
 #include "src/tint/resolver/resolver_test_helper.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/rtti/switch.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/resolver/resolver.cc b/src/tint/resolver/resolver.cc
index 65001b6..0ecc06f 100644
--- a/src/tint/resolver/resolver.cc
+++ b/src/tint/resolver/resolver.cc
@@ -20,15 +20,6 @@
 #include <limits>
 #include <utility>
 
-#include "src/tint/core/compiler_macros.h"
-#include "src/tint/core/defer.h"
-#include "src/tint/core/math.h"
-#include "src/tint/core/reverse.h"
-#include "src/tint/core/scoped_assignment.h"
-#include "src/tint/core/string.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/core/transform.h"
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/base/builtin/builtin.h"
 #include "src/tint/lang/base/type/abstract_float.h"
 #include "src/tint/lang/base/type/abstract_int.h"
@@ -88,6 +79,15 @@
 #include "src/tint/lang/wgsl/sem/variable.h"
 #include "src/tint/lang/wgsl/sem/while_statement.h"
 #include "src/tint/resolver/uniformity.h"
+#include "src/tint/utils/containers/reverse.h"
+#include "src/tint/utils/containers/transform.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/macros/compiler.h"
+#include "src/tint/utils/macros/defer.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
+#include "src/tint/utils/math/math.h"
+#include "src/tint/utils/text/string.h"
+#include "src/tint/utils/text/string_stream.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::sem::BuiltinEnumExpression<tint::builtin::Access>);
 TINT_INSTANTIATE_TYPEINFO(tint::sem::BuiltinEnumExpression<tint::builtin::AddressSpace>);
diff --git a/src/tint/resolver/resolver.h b/src/tint/resolver/resolver.h
index 08d4ae7..65a821d 100644
--- a/src/tint/resolver/resolver.h
+++ b/src/tint/resolver/resolver.h
@@ -23,8 +23,6 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/bitset.h"
-#include "src/tint/core/unique_vector.h"
 #include "src/tint/lang/base/constant/value.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/binding_point.h"
@@ -36,6 +34,8 @@
 #include "src/tint/resolver/intrinsic_table.h"
 #include "src/tint/resolver/sem_helper.h"
 #include "src/tint/resolver/validator.h"
+#include "src/tint/utils/containers/bitset.h"
+#include "src/tint/utils/containers/unique_vector.h"
 
 // Forward declarations
 namespace tint::ast {
diff --git a/src/tint/resolver/resolver_test.cc b/src/tint/resolver/resolver_test.cc
index 0efc15c..39b5ed5 100644
--- a/src/tint/resolver/resolver_test.cc
+++ b/src/tint/resolver/resolver_test.cc
@@ -18,7 +18,6 @@
 
 #include "gmock/gmock.h"
 #include "gtest/gtest-spi.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
 #include "src/tint/lang/base/type/reference.h"
 #include "src/tint/lang/base/type/sampled_texture.h"
@@ -47,6 +46,7 @@
 #include "src/tint/lang/wgsl/sem/switch_statement.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
 #include "src/tint/resolver/resolver_test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::resolver {
 namespace {
diff --git a/src/tint/resolver/resolver_test_helper.h b/src/tint/resolver/resolver_test_helper.h
index 2ffe23e..427a94c 100644
--- a/src/tint/resolver/resolver_test_helper.h
+++ b/src/tint/resolver/resolver_test_helper.h
@@ -24,8 +24,6 @@
 #include <variant>
 
 #include "gtest/gtest.h"
-#include "src/tint/core/traits.h"
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/base/type/abstract_float.h"
 #include "src/tint/lang/base/type/abstract_int.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
@@ -33,6 +31,8 @@
 #include "src/tint/lang/wgsl/sem/value_expression.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
 #include "src/tint/resolver/resolver.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/traits/traits.h"
 
 namespace tint::resolver {
 
diff --git a/src/tint/resolver/sem_helper.cc b/src/tint/resolver/sem_helper.cc
index 293b754..d98e636 100644
--- a/src/tint/resolver/sem_helper.cc
+++ b/src/tint/resolver/sem_helper.cc
@@ -19,7 +19,7 @@
 #include "src/tint/lang/wgsl/sem/function_expression.h"
 #include "src/tint/lang/wgsl/sem/type_expression.h"
 #include "src/tint/lang/wgsl/sem/value_expression.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/rtti/switch.h"
 
 namespace tint::resolver {
 
diff --git a/src/tint/resolver/sem_helper.h b/src/tint/resolver/sem_helper.h
index ba59ae4..710c782 100644
--- a/src/tint/resolver/sem_helper.h
+++ b/src/tint/resolver/sem_helper.h
@@ -17,8 +17,6 @@
 
 #include <string>
 
-#include "src/tint/core/diagnostic/diagnostic.h"
-#include "src/tint/core/map.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
 #include "src/tint/lang/base/builtin/interpolation_sampling.h"
 #include "src/tint/lang/base/builtin/interpolation_type.h"
@@ -27,6 +25,8 @@
 #include "src/tint/lang/wgsl/sem/function_expression.h"
 #include "src/tint/lang/wgsl/sem/type_expression.h"
 #include "src/tint/resolver/dependency_graph.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
 
 namespace tint::resolver {
 
diff --git a/src/tint/resolver/side_effects_test.cc b/src/tint/resolver/side_effects_test.cc
index 684569e..5b2ad63 100644
--- a/src/tint/resolver/side_effects_test.cc
+++ b/src/tint/resolver/side_effects_test.cc
@@ -15,7 +15,6 @@
 #include "src/tint/resolver/resolver.h"
 
 #include "gtest/gtest.h"
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/base/builtin/address_space.h"
 #include "src/tint/lang/base/builtin/extension.h"
 #include "src/tint/lang/base/builtin/texel_format.h"
@@ -24,6 +23,7 @@
 #include "src/tint/lang/wgsl/sem/member_accessor_expression.h"
 #include "src/tint/lang/wgsl/sem/value_expression.h"
 #include "src/tint/resolver/resolver_test_helper.h"
+#include "src/tint/utils/containers/vector.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
diff --git a/src/tint/resolver/uniformity.cc b/src/tint/resolver/uniformity.cc
index 46391b7..089b17f 100644
--- a/src/tint/resolver/uniformity.cc
+++ b/src/tint/resolver/uniformity.cc
@@ -19,11 +19,6 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/block_allocator.h"
-#include "src/tint/core/defer.h"
-#include "src/tint/core/map.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/core/unique_vector.h"
 #include "src/tint/lang/base/builtin/builtin_value.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/block_statement.h"
@@ -41,8 +36,13 @@
 #include "src/tint/lang/wgsl/sem/variable.h"
 #include "src/tint/lang/wgsl/sem/while_statement.h"
 #include "src/tint/resolver/dependency_graph.h"
-#include "src/tint/scope_stack.h"
-#include "src/tint/switch.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/containers/scope_stack.h"
+#include "src/tint/utils/containers/unique_vector.h"
+#include "src/tint/utils/macros/defer.h"
+#include "src/tint/utils/memory/block_allocator.h"
+#include "src/tint/utils/rtti/switch.h"
+#include "src/tint/utils/text/string_stream.h"
 
 // Set to `1` to dump the uniformity graph for each function in graphviz format.
 #define TINT_DUMP_UNIFORMITY_GRAPH 0
diff --git a/src/tint/resolver/uniformity_test.cc b/src/tint/resolver/uniformity_test.cc
index 1ae0450..d233126 100644
--- a/src/tint/resolver/uniformity_test.cc
+++ b/src/tint/resolver/uniformity_test.cc
@@ -17,10 +17,10 @@
 #include <tuple>
 #include <utility>
 
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/reader/parser.h"
 #include "src/tint/resolver/uniformity.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
diff --git a/src/tint/resolver/validator.cc b/src/tint/resolver/validator.cc
index fbb73c2..f403e07 100644
--- a/src/tint/resolver/validator.cc
+++ b/src/tint/resolver/validator.cc
@@ -18,14 +18,6 @@
 #include <limits>
 #include <utility>
 
-#include "src/tint/core/defer.h"
-#include "src/tint/core/map.h"
-#include "src/tint/core/math.h"
-#include "src/tint/core/reverse.h"
-#include "src/tint/core/scoped_assignment.h"
-#include "src/tint/core/string.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/core/transform.h"
 #include "src/tint/lang/base/type/abstract_numeric.h"
 #include "src/tint/lang/base/type/array.h"
 #include "src/tint/lang/base/type/atomic.h"
@@ -74,6 +66,14 @@
 #include "src/tint/lang/wgsl/sem/value_conversion.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
 #include "src/tint/lang/wgsl/sem/while_statement.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/containers/reverse.h"
+#include "src/tint/utils/containers/transform.h"
+#include "src/tint/utils/macros/defer.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
+#include "src/tint/utils/math/math.h"
+#include "src/tint/utils/text/string.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::resolver {
 namespace {
diff --git a/src/tint/resolver/validator.h b/src/tint/resolver/validator.h
index 5082e50..f5621cc 100644
--- a/src/tint/resolver/validator.h
+++ b/src/tint/resolver/validator.h
@@ -19,15 +19,15 @@
 #include <string>
 #include <utility>
 
-#include "src/tint/core/hash.h"
-#include "src/tint/core/hashmap.h"
-#include "src/tint/core/vector.h"
 #include "src/tint/lang/wgsl/ast/pipeline_stage.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/sem/evaluation_stage.h"
 #include "src/tint/resolver/sem_helper.h"
-#include "src/tint/scope_stack.h"
-#include "src/tint/source.h"
+#include "src/tint/utils/containers/hashmap.h"
+#include "src/tint/utils/containers/scope_stack.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/diagnostic/source.h"
+#include "src/tint/utils/math/hash.h"
 
 // Forward declarations
 namespace tint::ast {
diff --git a/src/tint/resolver/value_constructor_validation_test.cc b/src/tint/resolver/value_constructor_validation_test.cc
index 0247836..6265383 100644
--- a/src/tint/resolver/value_constructor_validation_test.cc
+++ b/src/tint/resolver/value_constructor_validation_test.cc
@@ -13,11 +13,11 @@
 // limitations under the License.
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/type/reference.h"
 #include "src/tint/lang/wgsl/sem/value_constructor.h"
 #include "src/tint/lang/wgsl/sem/value_conversion.h"
 #include "src/tint/resolver/resolver_test_helper.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::resolver {
 namespace {
diff --git a/src/tint/transform/transform.h b/src/tint/transform/transform.h
index 3eb5c82..23d9c73 100644
--- a/src/tint/transform/transform.h
+++ b/src/tint/transform/transform.h
@@ -19,7 +19,7 @@
 #include <unordered_map>
 #include <utility>
 
-#include "src/tint/core/castable.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::transform {
 
diff --git a/src/tint/core/cli.cc b/src/tint/utils/cli/cli.cc
similarity index 96%
rename from src/tint/core/cli.cc
rename to src/tint/utils/cli/cli.cc
index 9e87bd3..72ff0d6 100644
--- a/src/tint/core/cli.cc
+++ b/src/tint/utils/cli/cli.cc
@@ -12,15 +12,15 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/cli.h"
+#include "src/tint/utils/cli/cli.h"
 
 #include <algorithm>
 #include <sstream>
 #include <utility>
 
-#include "src/tint/core/hashset.h"
-#include "src/tint/core/string.h"
-#include "src/tint/core/transform.h"
+#include "src/tint/utils/containers/hashset.h"
+#include "src/tint/utils/containers/transform.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::utils::cli {
 
diff --git a/src/tint/core/cli.h b/src/tint/utils/cli/cli.h
similarity index 96%
rename from src/tint/core/cli.h
rename to src/tint/utils/cli/cli.h
index 688b467..1f14fb2 100644
--- a/src/tint/core/cli.h
+++ b/src/tint/utils/cli/cli.h
@@ -12,20 +12,20 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_CLI_H_
-#define SRC_TINT_CORE_CLI_H_
+#ifndef SRC_TINT_UTILS_CLI_CLI_H_
+#define SRC_TINT_UTILS_CLI_CLI_H_
 
 #include <deque>
 #include <optional>
 #include <string>
 #include <utility>
 
-#include "src/tint/core/block_allocator.h"
-#include "src/tint/core/compiler_macros.h"
-#include "src/tint/core/parse_num.h"
-#include "src/tint/core/result.h"
-#include "src/tint/core/string.h"
-#include "src/tint/core/vector.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/macros/compiler.h"
+#include "src/tint/utils/memory/block_allocator.h"
+#include "src/tint/utils/result/result.h"
+#include "src/tint/utils/text/parse_num.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::utils::cli {
 
@@ -407,4 +407,4 @@
 
 }  // namespace tint::utils::cli
 
-#endif  // SRC_TINT_CORE_CLI_H_
+#endif  // SRC_TINT_UTILS_CLI_CLI_H_
diff --git a/src/tint/core/cli_test.cc b/src/tint/utils/cli/cli_test.cc
similarity index 98%
rename from src/tint/core/cli_test.cc
rename to src/tint/utils/cli/cli_test.cc
index 5d40773..6b8fe4e 100644
--- a/src/tint/core/cli_test.cc
+++ b/src/tint/utils/cli/cli_test.cc
@@ -12,14 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/cli.h"
+#include "src/tint/utils/cli/cli.h"
 
 #include <sstream>
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
-#include "src/tint/core/transform.h"  // Used by ToStringList()
+#include "src/tint/utils/containers/transform.h"  // Used by ToStringList()
 
 namespace tint::utils::cli {
 namespace {
diff --git a/src/tint/core/io/command.h b/src/tint/utils/command/command.h
similarity index 95%
rename from src/tint/core/io/command.h
rename to src/tint/utils/command/command.h
index 4a10390..3406ffc 100644
--- a/src/tint/core/io/command.h
+++ b/src/tint/utils/command/command.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_IO_COMMAND_H_
-#define SRC_TINT_CORE_IO_COMMAND_H_
+#ifndef SRC_TINT_UTILS_COMMAND_COMMAND_H_
+#define SRC_TINT_UTILS_COMMAND_COMMAND_H_
 
 #include <string>
 #include <utility>
@@ -79,4 +79,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_IO_COMMAND_H_
+#endif  // SRC_TINT_UTILS_COMMAND_COMMAND_H_
diff --git a/src/tint/core/io/command_other.cc b/src/tint/utils/command/command_other.cc
similarity index 95%
rename from src/tint/core/io/command_other.cc
rename to src/tint/utils/command/command_other.cc
index 9d4f96a..f500482 100644
--- a/src/tint/core/io/command_other.cc
+++ b/src/tint/utils/command/command_other.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/io/command.h"
+#include "src/tint/utils/command/command.h"
 
 namespace tint::utils {
 
diff --git a/src/tint/core/io/command_posix.cc b/src/tint/utils/command/command_posix.cc
similarity index 99%
rename from src/tint/core/io/command_posix.cc
rename to src/tint/utils/command/command_posix.cc
index 3d91ef1..a615cc6 100644
--- a/src/tint/core/io/command_posix.cc
+++ b/src/tint/utils/command/command_posix.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/io/command.h"
+#include "src/tint/utils/command/command.h"
 
 #include <sys/poll.h>
 #include <sys/stat.h>
diff --git a/src/tint/core/io/command_test.cc b/src/tint/utils/command/command_test.cc
similarity index 97%
rename from src/tint/core/io/command_test.cc
rename to src/tint/utils/command/command_test.cc
index b7b44a2..a362243 100644
--- a/src/tint/core/io/command_test.cc
+++ b/src/tint/utils/command/command_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/io/command.h"
+#include "src/tint/utils/command/command.h"
 
 #include "gtest/gtest.h"
 
diff --git a/src/tint/core/io/command_windows.cc b/src/tint/utils/command/command_windows.cc
similarity index 98%
rename from src/tint/core/io/command_windows.cc
rename to src/tint/utils/command/command_windows.cc
index dc19aec..cbd749f 100644
--- a/src/tint/core/io/command_windows.cc
+++ b/src/tint/utils/command/command_windows.cc
@@ -12,15 +12,15 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/io/command.h"
+#include "src/tint/utils/command/command.h"
 
 #define WIN32_LEAN_AND_MEAN 1
 #include <Windows.h>
 #include <dbghelp.h>
 #include <string>
 
-#include "src/tint/core/defer.h"
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/macros/defer.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::utils {
 
diff --git a/src/tint/core/bitset.h b/src/tint/utils/containers/bitset.h
similarity index 94%
rename from src/tint/core/bitset.h
rename to src/tint/utils/containers/bitset.h
index 6b50d31..de8eb58 100644
--- a/src/tint/core/bitset.h
+++ b/src/tint/utils/containers/bitset.h
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_BITSET_H_
-#define SRC_TINT_CORE_BITSET_H_
+#ifndef SRC_TINT_UTILS_CONTAINERS_BITSET_H_
+#define SRC_TINT_UTILS_CONTAINERS_BITSET_H_
 
 #include <stdint.h>
 
-#include "src/tint/core/vector.h"
+#include "src/tint/utils/containers/vector.h"
 
 namespace tint::utils {
 
@@ -118,4 +118,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_BITSET_H_
+#endif  // SRC_TINT_UTILS_CONTAINERS_BITSET_H_
diff --git a/src/tint/core/bitset_test.cc b/src/tint/utils/containers/bitset_test.cc
similarity index 98%
rename from src/tint/core/bitset_test.cc
rename to src/tint/utils/containers/bitset_test.cc
index 1193895..70de877 100644
--- a/src/tint/core/bitset_test.cc
+++ b/src/tint/utils/containers/bitset_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/bitset.h"
+#include "src/tint/utils/containers/bitset.h"
 
 #include "gtest/gtest.h"
 
diff --git a/src/tint/core/enum_set.h b/src/tint/utils/containers/enum_set.h
similarity index 97%
rename from src/tint/core/enum_set.h
rename to src/tint/utils/containers/enum_set.h
index 8eefa97..e8729629 100644
--- a/src/tint/core/enum_set.h
+++ b/src/tint/utils/containers/enum_set.h
@@ -12,15 +12,15 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_ENUM_SET_H_
-#define SRC_TINT_CORE_ENUM_SET_H_
+#ifndef SRC_TINT_UTILS_CONTAINERS_ENUM_SET_H_
+#define SRC_TINT_UTILS_CONTAINERS_ENUM_SET_H_
 
 #include <cstdint>
 #include <functional>
 #include <type_traits>
 #include <utility>
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::utils {
 
@@ -258,4 +258,4 @@
 
 }  // namespace std
 
-#endif  // SRC_TINT_CORE_ENUM_SET_H_
+#endif  // SRC_TINT_UTILS_CONTAINERS_ENUM_SET_H_
diff --git a/src/tint/core/enum_set_test.cc b/src/tint/utils/containers/enum_set_test.cc
similarity index 98%
rename from src/tint/core/enum_set_test.cc
rename to src/tint/utils/containers/enum_set_test.cc
index 03d8f28..32303c8 100644
--- a/src/tint/core/enum_set_test.cc
+++ b/src/tint/utils/containers/enum_set_test.cc
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/enum_set.h"
+#include "src/tint/utils/containers/enum_set.h"
 
 #include <vector>
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::utils {
 namespace {
diff --git a/src/tint/core/hashmap.h b/src/tint/utils/containers/hashmap.h
similarity index 96%
rename from src/tint/core/hashmap.h
rename to src/tint/utils/containers/hashmap.h
index 9e442f4..daa006e 100644
--- a/src/tint/core/hashmap.h
+++ b/src/tint/utils/containers/hashmap.h
@@ -12,17 +12,17 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_HASHMAP_H_
-#define SRC_TINT_CORE_HASHMAP_H_
+#ifndef SRC_TINT_UTILS_CONTAINERS_HASHMAP_H_
+#define SRC_TINT_UTILS_CONTAINERS_HASHMAP_H_
 
 #include <functional>
 #include <optional>
 #include <utility>
 
-#include "src/tint/core/hash.h"
-#include "src/tint/core/hashmap_base.h"
-#include "src/tint/core/vector.h"
-#include "src/tint/debug.h"
+#include "src/tint/utils/containers/hashmap_base.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/math/hash.h"
 
 namespace tint::utils {
 
@@ -287,4 +287,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_HASHMAP_H_
+#endif  // SRC_TINT_UTILS_CONTAINERS_HASHMAP_H_
diff --git a/src/tint/core/hashmap_base.h b/src/tint/utils/containers/hashmap_base.h
similarity index 98%
rename from src/tint/core/hashmap_base.h
rename to src/tint/utils/containers/hashmap_base.h
index 843bd9d..9d20197 100644
--- a/src/tint/core/hashmap_base.h
+++ b/src/tint/utils/containers/hashmap_base.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_HASHMAP_BASE_H_
-#define SRC_TINT_CORE_HASHMAP_BASE_H_
+#ifndef SRC_TINT_UTILS_CONTAINERS_HASHMAP_BASE_H_
+#define SRC_TINT_UTILS_CONTAINERS_HASHMAP_BASE_H_
 
 #include <algorithm>
 #include <functional>
@@ -21,9 +21,9 @@
 #include <tuple>
 #include <utility>
 
-#include "src/tint/core/hash.h"
-#include "src/tint/core/vector.h"
-#include "src/tint/debug.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/math/hash.h"
 
 #define TINT_ASSERT_ITERATORS_NOT_INVALIDATED
 
@@ -633,4 +633,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_HASHMAP_BASE_H_
+#endif  // SRC_TINT_UTILS_CONTAINERS_HASHMAP_BASE_H_
diff --git a/src/tint/core/hashmap_test.cc b/src/tint/utils/containers/hashmap_test.cc
similarity index 99%
rename from src/tint/core/hashmap_test.cc
rename to src/tint/utils/containers/hashmap_test.cc
index b5f5611..52f2970 100644
--- a/src/tint/core/hashmap_test.cc
+++ b/src/tint/utils/containers/hashmap_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/hashmap.h"
+#include "src/tint/utils/containers/hashmap.h"
 
 #include <array>
 #include <random>
diff --git a/src/tint/core/hashset.h b/src/tint/utils/containers/hashset.h
similarity index 91%
rename from src/tint/core/hashset.h
rename to src/tint/utils/containers/hashset.h
index a3684cf..8ab452f 100644
--- a/src/tint/core/hashset.h
+++ b/src/tint/utils/containers/hashset.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_HASHSET_H_
-#define SRC_TINT_CORE_HASHSET_H_
+#ifndef SRC_TINT_UTILS_CONTAINERS_HASHSET_H_
+#define SRC_TINT_UTILS_CONTAINERS_HASHSET_H_
 
 #include <stddef.h>
 #include <algorithm>
@@ -22,9 +22,9 @@
 #include <tuple>
 #include <utility>
 
-#include "src/tint/core/hashmap.h"
-#include "src/tint/core/vector.h"
-#include "src/tint/debug.h"
+#include "src/tint/utils/containers/hashmap.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/debug/debug.h"
 
 namespace tint::utils {
 
@@ -94,4 +94,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_HASHSET_H_
+#endif  // SRC_TINT_UTILS_CONTAINERS_HASHSET_H_
diff --git a/src/tint/core/hashset_test.cc b/src/tint/utils/containers/hashset_test.cc
similarity index 97%
rename from src/tint/core/hashset_test.cc
rename to src/tint/utils/containers/hashset_test.cc
index f41eb68..c9e147e 100644
--- a/src/tint/core/hashset_test.cc
+++ b/src/tint/utils/containers/hashset_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/hashset.h"
+#include "src/tint/utils/containers/hashset.h"
 
 #include <array>
 #include <random>
@@ -21,7 +21,7 @@
 #include <unordered_set>
 
 #include "gmock/gmock.h"
-#include "src/tint/core/predicates.h"
+#include "src/tint/utils/containers/predicates.h"
 
 namespace tint::utils {
 namespace {
diff --git a/src/tint/core/map.h b/src/tint/utils/containers/map.h
similarity index 94%
rename from src/tint/core/map.h
rename to src/tint/utils/containers/map.h
index d4ff481..74a0ea8 100644
--- a/src/tint/core/map.h
+++ b/src/tint/utils/containers/map.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_MAP_H_
-#define SRC_TINT_CORE_MAP_H_
+#ifndef SRC_TINT_UTILS_CONTAINERS_MAP_H_
+#define SRC_TINT_UTILS_CONTAINERS_MAP_H_
 
 #include <unordered_map>
 
@@ -53,4 +53,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_MAP_H_
+#endif  // SRC_TINT_UTILS_CONTAINERS_MAP_H_
diff --git a/src/tint/core/map_test.cc b/src/tint/utils/containers/map_test.cc
similarity index 97%
rename from src/tint/core/map_test.cc
rename to src/tint/utils/containers/map_test.cc
index 427275a..843421a 100644
--- a/src/tint/core/map_test.cc
+++ b/src/tint/utils/containers/map_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/map.h"
+#include "src/tint/utils/containers/map.h"
 
 #include <unordered_map>
 
diff --git a/src/tint/core/predicates.h b/src/tint/utils/containers/predicates.h
similarity index 94%
rename from src/tint/core/predicates.h
rename to src/tint/utils/containers/predicates.h
index fabd3fd..a919741 100644
--- a/src/tint/core/predicates.h
+++ b/src/tint/utils/containers/predicates.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_PREDICATES_H_
-#define SRC_TINT_CORE_PREDICATES_H_
+#ifndef SRC_TINT_UTILS_CONTAINERS_PREDICATES_H_
+#define SRC_TINT_UTILS_CONTAINERS_PREDICATES_H_
 
 namespace tint::utils {
 
@@ -75,4 +75,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_PREDICATES_H_
+#endif  // SRC_TINT_UTILS_CONTAINERS_PREDICATES_H_
diff --git a/src/tint/core/predicates_test.cc b/src/tint/utils/containers/predicates_test.cc
similarity index 97%
rename from src/tint/core/predicates_test.cc
rename to src/tint/utils/containers/predicates_test.cc
index 4d275bc..cf685b2 100644
--- a/src/tint/core/predicates_test.cc
+++ b/src/tint/utils/containers/predicates_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/predicates.h"
+#include "src/tint/utils/containers/predicates.h"
 
 #include "gtest/gtest.h"
 
diff --git a/src/tint/core/reverse.h b/src/tint/utils/containers/reverse.h
similarity index 92%
rename from src/tint/core/reverse.h
rename to src/tint/utils/containers/reverse.h
index 0b568e3..bb85a9e 100644
--- a/src/tint/core/reverse.h
+++ b/src/tint/utils/containers/reverse.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_REVERSE_H_
-#define SRC_TINT_CORE_REVERSE_H_
+#ifndef SRC_TINT_UTILS_CONTAINERS_REVERSE_H_
+#define SRC_TINT_UTILS_CONTAINERS_REVERSE_H_
 
 #include <iterator>
 
@@ -59,4 +59,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_REVERSE_H_
+#endif  // SRC_TINT_UTILS_CONTAINERS_REVERSE_H_
diff --git a/src/tint/core/reverse_test.cc b/src/tint/utils/containers/reverse_test.cc
similarity index 94%
rename from src/tint/core/reverse_test.cc
rename to src/tint/utils/containers/reverse_test.cc
index c0139a9..4ca0369 100644
--- a/src/tint/core/reverse_test.cc
+++ b/src/tint/utils/containers/reverse_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/reverse.h"
+#include "src/tint/utils/containers/reverse.h"
 
 #include <vector>
 
diff --git a/src/tint/scope_stack.h b/src/tint/utils/containers/scope_stack.h
similarity index 88%
rename from src/tint/scope_stack.h
rename to src/tint/utils/containers/scope_stack.h
index 6b43a87..d98f2cd 100644
--- a/src/tint/scope_stack.h
+++ b/src/tint/utils/containers/scope_stack.h
@@ -11,14 +11,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_SCOPE_STACK_H_
-#define SRC_TINT_SCOPE_STACK_H_
+#ifndef SRC_TINT_UTILS_CONTAINERS_SCOPE_STACK_H_
+#define SRC_TINT_UTILS_CONTAINERS_SCOPE_STACK_H_
 
 #include <utility>
 
-#include "src/tint/core/hashmap.h"
-#include "src/tint/core/vector.h"
-#include "src/tint/symbol.h"
+#include "src/tint/utils/containers/hashmap.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/text/symbol.h"
 
 namespace tint {
 
@@ -81,4 +81,4 @@
 
 }  // namespace tint
 
-#endif  // SRC_TINT_SCOPE_STACK_H_
+#endif  // SRC_TINT_UTILS_CONTAINERS_SCOPE_STACK_H_
diff --git a/src/tint/scope_stack_test.cc b/src/tint/utils/containers/scope_stack_test.cc
similarity index 97%
rename from src/tint/scope_stack_test.cc
rename to src/tint/utils/containers/scope_stack_test.cc
index 4bb88ef..c24b7d3 100644
--- a/src/tint/scope_stack_test.cc
+++ b/src/tint/utils/containers/scope_stack_test.cc
@@ -11,7 +11,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/scope_stack.h"
+#include "src/tint/utils/containers/scope_stack.h"
 
 #include "gtest/gtest.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
diff --git a/src/tint/core/slice.h b/src/tint/utils/containers/slice.h
similarity index 96%
rename from src/tint/core/slice.h
rename to src/tint/utils/containers/slice.h
index 268d0cd..972d4bb 100644
--- a/src/tint/core/slice.h
+++ b/src/tint/utils/containers/slice.h
@@ -12,16 +12,16 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_SLICE_H_
-#define SRC_TINT_CORE_SLICE_H_
+#ifndef SRC_TINT_UTILS_CONTAINERS_SLICE_H_
+#define SRC_TINT_UTILS_CONTAINERS_SLICE_H_
 
 #include <cstdint>
 #include <iterator>
 
-#include "src/tint/core/bitcast.h"
-#include "src/tint/core/castable.h"
-#include "src/tint/core/traits.h"
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/memory/bitcast.h"
+#include "src/tint/utils/rtti/castable.h"
+#include "src/tint/utils/traits/traits.h"
 
 namespace tint::utils {
 
@@ -255,4 +255,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_SLICE_H_
+#endif  // SRC_TINT_UTILS_CONTAINERS_SLICE_H_
diff --git a/src/tint/core/slice_test.cc b/src/tint/utils/containers/slice_test.cc
similarity index 98%
rename from src/tint/core/slice_test.cc
rename to src/tint/utils/containers/slice_test.cc
index be2a5c6..139dcc5 100644
--- a/src/tint/core/slice_test.cc
+++ b/src/tint/utils/containers/slice_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/slice.h"
+#include "src/tint/utils/containers/slice.h"
 
 #include "gmock/gmock.h"
 
diff --git a/src/tint/core/transform.h b/src/tint/utils/containers/transform.h
similarity index 96%
rename from src/tint/core/transform.h
rename to src/tint/utils/containers/transform.h
index 30e2952..4e3e686 100644
--- a/src/tint/core/transform.h
+++ b/src/tint/utils/containers/transform.h
@@ -12,16 +12,16 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_TRANSFORM_H_
-#define SRC_TINT_CORE_TRANSFORM_H_
+#ifndef SRC_TINT_UTILS_CONTAINERS_TRANSFORM_H_
+#define SRC_TINT_UTILS_CONTAINERS_TRANSFORM_H_
 
 #include <algorithm>
 #include <type_traits>
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/traits.h"
-#include "src/tint/core/vector.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/traits/traits.h"
 
 namespace tint::utils {
 
@@ -172,4 +172,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_TRANSFORM_H_
+#endif  // SRC_TINT_UTILS_CONTAINERS_TRANSFORM_H_
diff --git a/src/tint/core/transform_test.cc b/src/tint/utils/containers/transform_test.cc
similarity index 99%
rename from src/tint/core/transform_test.cc
rename to src/tint/utils/containers/transform_test.cc
index c97d9d3..aec9d78 100644
--- a/src/tint/core/transform_test.cc
+++ b/src/tint/utils/containers/transform_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/transform.h"
+#include "src/tint/utils/containers/transform.h"
 
 #include <string>
 #include <type_traits>
diff --git a/src/tint/core/unique_allocator.h b/src/tint/utils/containers/unique_allocator.h
similarity index 95%
rename from src/tint/core/unique_allocator.h
rename to src/tint/utils/containers/unique_allocator.h
index b3a5ad6..d5e7e24 100644
--- a/src/tint/core/unique_allocator.h
+++ b/src/tint/utils/containers/unique_allocator.h
@@ -12,14 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_UNIQUE_ALLOCATOR_H_
-#define SRC_TINT_CORE_UNIQUE_ALLOCATOR_H_
+#ifndef SRC_TINT_UTILS_CONTAINERS_UNIQUE_ALLOCATOR_H_
+#define SRC_TINT_UTILS_CONTAINERS_UNIQUE_ALLOCATOR_H_
 
 #include <functional>
 #include <unordered_set>
 #include <utility>
 
-#include "src/tint/core/block_allocator.h"
+#include "src/tint/utils/memory/block_allocator.h"
 
 namespace tint::utils {
 
@@ -116,4 +116,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_UNIQUE_ALLOCATOR_H_
+#endif  // SRC_TINT_UTILS_CONTAINERS_UNIQUE_ALLOCATOR_H_
diff --git a/src/tint/core/unique_allocator_test.cc b/src/tint/utils/containers/unique_allocator_test.cc
similarity index 96%
rename from src/tint/core/unique_allocator_test.cc
rename to src/tint/utils/containers/unique_allocator_test.cc
index e3e398e..a71ce98 100644
--- a/src/tint/core/unique_allocator_test.cc
+++ b/src/tint/utils/containers/unique_allocator_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/unique_allocator.h"
+#include "src/tint/utils/containers/unique_allocator.h"
 
 #include <string>
 
diff --git a/src/tint/core/unique_vector.h b/src/tint/utils/containers/unique_vector.h
similarity index 94%
rename from src/tint/core/unique_vector.h
rename to src/tint/utils/containers/unique_vector.h
index ce8f5d3..980a06f 100644
--- a/src/tint/core/unique_vector.h
+++ b/src/tint/utils/containers/unique_vector.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_UNIQUE_VECTOR_H_
-#define SRC_TINT_CORE_UNIQUE_VECTOR_H_
+#ifndef SRC_TINT_UTILS_CONTAINERS_UNIQUE_VECTOR_H_
+#define SRC_TINT_UTILS_CONTAINERS_UNIQUE_VECTOR_H_
 
 #include <cstddef>
 #include <functional>
@@ -21,8 +21,8 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/hashset.h"
-#include "src/tint/core/vector.h"
+#include "src/tint/utils/containers/hashset.h"
+#include "src/tint/utils/containers/vector.h"
 
 namespace tint::utils {
 
@@ -146,4 +146,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_UNIQUE_VECTOR_H_
+#endif  // SRC_TINT_UTILS_CONTAINERS_UNIQUE_VECTOR_H_
diff --git a/src/tint/core/unique_vector_test.cc b/src/tint/utils/containers/unique_vector_test.cc
similarity index 98%
rename from src/tint/core/unique_vector_test.cc
rename to src/tint/utils/containers/unique_vector_test.cc
index bfcd0c9..5f50b3a 100644
--- a/src/tint/core/unique_vector_test.cc
+++ b/src/tint/utils/containers/unique_vector_test.cc
@@ -12,11 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/unique_vector.h"
+#include "src/tint/utils/containers/unique_vector.h"
 
 #include <vector>
 
-#include "src/tint/core/reverse.h"
+#include "src/tint/utils/containers/reverse.h"
 
 #include "gtest/gtest.h"
 
diff --git a/src/tint/core/vector.h b/src/tint/utils/containers/vector.h
similarity index 98%
rename from src/tint/core/vector.h
rename to src/tint/utils/containers/vector.h
index 5b5fc62..b844e54 100644
--- a/src/tint/core/vector.h
+++ b/src/tint/utils/containers/vector.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_VECTOR_H_
-#define SRC_TINT_CORE_VECTOR_H_
+#ifndef SRC_TINT_UTILS_CONTAINERS_VECTOR_H_
+#define SRC_TINT_UTILS_CONTAINERS_VECTOR_H_
 
 #include <stddef.h>
 #include <stdint.h>
@@ -23,11 +23,11 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/bitcast.h"
-#include "src/tint/core/compiler_macros.h"
-#include "src/tint/core/slice.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/debug.h"
+#include "src/tint/utils/containers/slice.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/macros/compiler.h"
+#include "src/tint/utils/memory/bitcast.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::utils {
 
@@ -894,4 +894,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_VECTOR_H_
+#endif  // SRC_TINT_UTILS_CONTAINERS_VECTOR_H_
diff --git a/src/tint/core/vector_test.cc b/src/tint/utils/containers/vector_test.cc
similarity index 99%
rename from src/tint/core/vector_test.cc
rename to src/tint/utils/containers/vector_test.cc
index ee572d6..0883eab 100644
--- a/src/tint/core/vector_test.cc
+++ b/src/tint/utils/containers/vector_test.cc
@@ -12,16 +12,16 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/vector.h"
+#include "src/tint/utils/containers/vector.h"
 
 #include <string>
 #include <tuple>
 
 #include "gmock/gmock.h"
 
-#include "src/tint/core/bitcast.h"
-#include "src/tint/core/predicates.h"
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/containers/predicates.h"
+#include "src/tint/utils/memory/bitcast.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::utils {
 namespace {
diff --git a/src/tint/debug.cc b/src/tint/utils/debug/debug.cc
similarity index 94%
rename from src/tint/debug.cc
rename to src/tint/utils/debug/debug.cc
index cd89779..c5c07f1 100644
--- a/src/tint/debug.cc
+++ b/src/tint/utils/debug/debug.cc
@@ -12,11 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
 
 #include <memory>
 
-#include "src/tint/core/debugger.h"
+#include "src/tint/utils/debug/debugger.h"
 
 namespace tint {
 namespace {
diff --git a/src/tint/debug.h b/src/tint/utils/debug/debug.h
similarity index 95%
rename from src/tint/debug.h
rename to src/tint/utils/debug/debug.h
index 8c50def..4cf4257 100644
--- a/src/tint/debug.h
+++ b/src/tint/utils/debug/debug.h
@@ -12,16 +12,16 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_DEBUG_H_
-#define SRC_TINT_DEBUG_H_
+#ifndef SRC_TINT_UTILS_DEBUG_DEBUG_H_
+#define SRC_TINT_UTILS_DEBUG_DEBUG_H_
 
 #include <utility>
 
-#include "src/tint/core/compiler_macros.h"
-#include "src/tint/core/diagnostic/diagnostic.h"
-#include "src/tint/core/diagnostic/formatter.h"
-#include "src/tint/core/diagnostic/printer.h"
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
+#include "src/tint/utils/diagnostic/formatter.h"
+#include "src/tint/utils/diagnostic/printer.h"
+#include "src/tint/utils/macros/compiler.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint {
 
@@ -153,4 +153,4 @@
         }                                                                                \
     } while (false)
 
-#endif  // SRC_TINT_DEBUG_H_
+#endif  // SRC_TINT_UTILS_DEBUG_DEBUG_H_
diff --git a/src/tint/debug_test.cc b/src/tint/utils/debug/debug_test.cc
similarity index 96%
rename from src/tint/debug_test.cc
rename to src/tint/utils/debug/debug_test.cc
index 2d21277..3566427 100644
--- a/src/tint/debug_test.cc
+++ b/src/tint/utils/debug/debug_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
 
 #include "gtest/gtest-spi.h"
 
diff --git a/src/tint/core/debugger.cc b/src/tint/utils/debug/debugger.cc
similarity index 97%
rename from src/tint/core/debugger.cc
rename to src/tint/utils/debug/debugger.cc
index 8a3d3d2..0cb6b59 100644
--- a/src/tint/core/debugger.cc
+++ b/src/tint/utils/debug/debugger.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/debugger.h"
+#include "src/tint/utils/debug/debugger.h"
 
 #ifdef TINT_ENABLE_BREAK_IN_DEBUGGER
 
diff --git a/src/tint/core/debugger.h b/src/tint/utils/debug/debugger.h
similarity index 87%
rename from src/tint/core/debugger.h
rename to src/tint/utils/debug/debugger.h
index 30f8882..2558678 100644
--- a/src/tint/core/debugger.h
+++ b/src/tint/utils/debug/debugger.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_DEBUGGER_H_
-#define SRC_TINT_CORE_DEBUGGER_H_
+#ifndef SRC_TINT_UTILS_DEBUG_DEBUGGER_H_
+#define SRC_TINT_UTILS_DEBUG_DEBUGGER_H_
 
 namespace tint::debugger {
 
@@ -24,4 +24,4 @@
 
 }  // namespace tint::debugger
 
-#endif  // SRC_TINT_CORE_DEBUGGER_H_
+#endif  // SRC_TINT_UTILS_DEBUG_DEBUGGER_H_
diff --git a/src/tint/core/diagnostic/diagnostic.cc b/src/tint/utils/diagnostic/diagnostic.cc
similarity index 93%
rename from src/tint/core/diagnostic/diagnostic.cc
rename to src/tint/utils/diagnostic/diagnostic.cc
index e85b215..f108c44 100644
--- a/src/tint/core/diagnostic/diagnostic.cc
+++ b/src/tint/utils/diagnostic/diagnostic.cc
@@ -12,11 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/diagnostic/diagnostic.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
 
 #include <unordered_map>
 
-#include "src/tint/core/diagnostic/formatter.h"
+#include "src/tint/utils/diagnostic/formatter.h"
 
 namespace tint::diag {
 
diff --git a/src/tint/core/diagnostic/diagnostic.h b/src/tint/utils/diagnostic/diagnostic.h
similarity index 97%
rename from src/tint/core/diagnostic/diagnostic.h
rename to src/tint/utils/diagnostic/diagnostic.h
index 7ab089c..0eb7727 100644
--- a/src/tint/core/diagnostic/diagnostic.h
+++ b/src/tint/utils/diagnostic/diagnostic.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_DIAGNOSTIC_DIAGNOSTIC_H_
-#define SRC_TINT_CORE_DIAGNOSTIC_DIAGNOSTIC_H_
+#ifndef SRC_TINT_UTILS_DIAGNOSTIC_DIAGNOSTIC_H_
+#define SRC_TINT_UTILS_DIAGNOSTIC_DIAGNOSTIC_H_
 
 #include <memory>
 #include <ostream>
@@ -21,7 +21,7 @@
 #include <utility>
 #include <vector>
 
-#include "src/tint/source.h"
+#include "src/tint/utils/diagnostic/source.h"
 
 namespace tint::diag {
 
@@ -258,4 +258,4 @@
 
 }  // namespace tint::diag
 
-#endif  // SRC_TINT_CORE_DIAGNOSTIC_DIAGNOSTIC_H_
+#endif  // SRC_TINT_UTILS_DIAGNOSTIC_DIAGNOSTIC_H_
diff --git a/src/tint/core/diagnostic/diagnostic_test.cc b/src/tint/utils/diagnostic/diagnostic_test.cc
similarity index 91%
rename from src/tint/core/diagnostic/diagnostic_test.cc
rename to src/tint/utils/diagnostic/diagnostic_test.cc
index 7bcfa71..0077649 100644
--- a/src/tint/core/diagnostic/diagnostic_test.cc
+++ b/src/tint/utils/diagnostic/diagnostic_test.cc
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/diagnostic/formatter.h"
+#include "src/tint/utils/diagnostic/formatter.h"
 
 #include "gtest/gtest.h"
-#include "src/tint/core/diagnostic/diagnostic.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
 
 namespace tint::diag {
 namespace {
diff --git a/src/tint/core/diagnostic/formatter.cc b/src/tint/utils/diagnostic/formatter.cc
similarity index 97%
rename from src/tint/core/diagnostic/formatter.cc
rename to src/tint/utils/diagnostic/formatter.cc
index 34fd2ba..416551f 100644
--- a/src/tint/core/diagnostic/formatter.cc
+++ b/src/tint/utils/diagnostic/formatter.cc
@@ -12,16 +12,16 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/diagnostic/formatter.h"
+#include "src/tint/utils/diagnostic/formatter.h"
 
 #include <algorithm>
 #include <iterator>
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/diagnostic/diagnostic.h"
-#include "src/tint/core/diagnostic/printer.h"
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
+#include "src/tint/utils/diagnostic/printer.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::diag {
 namespace {
diff --git a/src/tint/core/diagnostic/formatter.h b/src/tint/utils/diagnostic/formatter.h
similarity index 93%
rename from src/tint/core/diagnostic/formatter.h
rename to src/tint/utils/diagnostic/formatter.h
index bcaf321..1b9a9b3 100644
--- a/src/tint/core/diagnostic/formatter.h
+++ b/src/tint/utils/diagnostic/formatter.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_DIAGNOSTIC_FORMATTER_H_
-#define SRC_TINT_CORE_DIAGNOSTIC_FORMATTER_H_
+#ifndef SRC_TINT_UTILS_DIAGNOSTIC_FORMATTER_H_
+#define SRC_TINT_UTILS_DIAGNOSTIC_FORMATTER_H_
 
 #include <string>
 
@@ -67,4 +67,4 @@
 
 }  // namespace tint::diag
 
-#endif  // SRC_TINT_CORE_DIAGNOSTIC_FORMATTER_H_
+#endif  // SRC_TINT_UTILS_DIAGNOSTIC_FORMATTER_H_
diff --git a/src/tint/core/diagnostic/formatter_test.cc b/src/tint/utils/diagnostic/formatter_test.cc
similarity index 98%
rename from src/tint/core/diagnostic/formatter_test.cc
rename to src/tint/utils/diagnostic/formatter_test.cc
index 47d0323..242be15 100644
--- a/src/tint/core/diagnostic/formatter_test.cc
+++ b/src/tint/utils/diagnostic/formatter_test.cc
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/diagnostic/formatter.h"
+#include "src/tint/utils/diagnostic/formatter.h"
 
 #include <utility>
 
 #include "gtest/gtest.h"
-#include "src/tint/core/diagnostic/diagnostic.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
 
 namespace tint::diag {
 namespace {
diff --git a/src/tint/core/diagnostic/printer.cc b/src/tint/utils/diagnostic/printer.cc
similarity index 94%
rename from src/tint/core/diagnostic/printer.cc
rename to src/tint/utils/diagnostic/printer.cc
index 127bbb1..f2c3345 100644
--- a/src/tint/core/diagnostic/printer.cc
+++ b/src/tint/utils/diagnostic/printer.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/diagnostic/printer.h"
+#include "src/tint/utils/diagnostic/printer.h"
 
 namespace tint::diag {
 
diff --git a/src/tint/core/diagnostic/printer.h b/src/tint/utils/diagnostic/printer.h
similarity index 91%
rename from src/tint/core/diagnostic/printer.h
rename to src/tint/utils/diagnostic/printer.h
index 11ac254..07b2c2c 100644
--- a/src/tint/core/diagnostic/printer.h
+++ b/src/tint/utils/diagnostic/printer.h
@@ -12,13 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_DIAGNOSTIC_PRINTER_H_
-#define SRC_TINT_CORE_DIAGNOSTIC_PRINTER_H_
+#ifndef SRC_TINT_UTILS_DIAGNOSTIC_PRINTER_H_
+#define SRC_TINT_UTILS_DIAGNOSTIC_PRINTER_H_
 
 #include <memory>
 #include <string>
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::diag {
 
@@ -79,4 +79,4 @@
 
 }  // namespace tint::diag
 
-#endif  // SRC_TINT_CORE_DIAGNOSTIC_PRINTER_H_
+#endif  // SRC_TINT_UTILS_DIAGNOSTIC_PRINTER_H_
diff --git a/src/tint/core/diagnostic/printer_other.cc b/src/tint/utils/diagnostic/printer_other.cc
similarity index 95%
rename from src/tint/core/diagnostic/printer_other.cc
rename to src/tint/utils/diagnostic/printer_other.cc
index 45de139..2fe7c2d 100644
--- a/src/tint/core/diagnostic/printer_other.cc
+++ b/src/tint/utils/diagnostic/printer_other.cc
@@ -14,7 +14,7 @@
 
 #include <cstring>
 
-#include "src/tint/core/diagnostic/printer.h"
+#include "src/tint/utils/diagnostic/printer.h"
 
 namespace tint::diag {
 namespace {
diff --git a/src/tint/core/diagnostic/printer_posix.cc b/src/tint/utils/diagnostic/printer_posix.cc
similarity index 98%
rename from src/tint/core/diagnostic/printer_posix.cc
rename to src/tint/utils/diagnostic/printer_posix.cc
index b607d57..0d5e092 100644
--- a/src/tint/core/diagnostic/printer_posix.cc
+++ b/src/tint/utils/diagnostic/printer_posix.cc
@@ -16,7 +16,7 @@
 
 #include <cstring>
 
-#include "src/tint/core/diagnostic/printer.h"
+#include "src/tint/utils/diagnostic/printer.h"
 
 namespace tint::diag {
 namespace {
diff --git a/src/tint/core/diagnostic/printer_test.cc b/src/tint/utils/diagnostic/printer_test.cc
similarity index 98%
rename from src/tint/core/diagnostic/printer_test.cc
rename to src/tint/utils/diagnostic/printer_test.cc
index d31a97c..6af9470 100644
--- a/src/tint/core/diagnostic/printer_test.cc
+++ b/src/tint/utils/diagnostic/printer_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/diagnostic/printer.h"
+#include "src/tint/utils/diagnostic/printer.h"
 
 #include "gtest/gtest.h"
 
diff --git a/src/tint/core/diagnostic/printer_windows.cc b/src/tint/utils/diagnostic/printer_windows.cc
similarity index 98%
rename from src/tint/core/diagnostic/printer_windows.cc
rename to src/tint/utils/diagnostic/printer_windows.cc
index f7a5b3d..a9582d4 100644
--- a/src/tint/core/diagnostic/printer_windows.cc
+++ b/src/tint/utils/diagnostic/printer_windows.cc
@@ -14,7 +14,7 @@
 
 #include <cstring>
 
-#include "src/tint/core/diagnostic/printer.h"
+#include "src/tint/utils/diagnostic/printer.h"
 
 #define WIN32_LEAN_AND_MEAN 1
 #include <Windows.h>
diff --git a/src/tint/source.cc b/src/tint/utils/diagnostic/source.cc
similarity index 98%
rename from src/tint/source.cc
rename to src/tint/utils/diagnostic/source.cc
index a2114ed..d2b079c 100644
--- a/src/tint/source.cc
+++ b/src/tint/utils/diagnostic/source.cc
@@ -12,13 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/source.h"
+#include "src/tint/utils/diagnostic/source.h"
 
 #include <algorithm>
 #include <string_view>
 #include <utility>
 
-#include "src/tint/core/unicode.h"
+#include "src/tint/utils/text/unicode.h"
 
 namespace tint {
 namespace {
diff --git a/src/tint/source.h b/src/tint/utils/diagnostic/source.h
similarity index 97%
rename from src/tint/source.h
rename to src/tint/utils/diagnostic/source.h
index f138b20..7f5f765 100644
--- a/src/tint/source.h
+++ b/src/tint/utils/diagnostic/source.h
@@ -13,15 +13,15 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_SOURCE_H_
-#define SRC_TINT_SOURCE_H_
+#ifndef SRC_TINT_UTILS_DIAGNOSTIC_SOURCE_H_
+#define SRC_TINT_UTILS_DIAGNOSTIC_SOURCE_H_
 
 #include <string>
 #include <string_view>
 #include <tuple>
 #include <vector>
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint {
 
@@ -228,4 +228,4 @@
 
 }  // namespace tint
 
-#endif  // SRC_TINT_SOURCE_H_
+#endif  // SRC_TINT_UTILS_DIAGNOSTIC_SOURCE_H_
diff --git a/src/tint/source_test.cc b/src/tint/utils/diagnostic/source_test.cc
similarity index 97%
rename from src/tint/source_test.cc
rename to src/tint/utils/diagnostic/source_test.cc
index df14a31..8d9ceed 100644
--- a/src/tint/source_test.cc
+++ b/src/tint/utils/diagnostic/source_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/source.h"
+#include "src/tint/utils/diagnostic/source.h"
 
 #include <memory>
 #include <utility>
diff --git a/src/tint/core/io/tmpfile.h b/src/tint/utils/file/tmpfile.h
similarity index 93%
rename from src/tint/core/io/tmpfile.h
rename to src/tint/utils/file/tmpfile.h
index 109c2ee..ed83918 100644
--- a/src/tint/core/io/tmpfile.h
+++ b/src/tint/utils/file/tmpfile.h
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_IO_TMPFILE_H_
-#define SRC_TINT_CORE_IO_TMPFILE_H_
+#ifndef SRC_TINT_UTILS_FILE_TMPFILE_H_
+#define SRC_TINT_UTILS_FILE_TMPFILE_H_
 
 #include <string>
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::utils {
 
@@ -72,4 +72,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_IO_TMPFILE_H_
+#endif  // SRC_TINT_UTILS_FILE_TMPFILE_H_
diff --git a/src/tint/core/io/tmpfile_other.cc b/src/tint/utils/file/tmpfile_other.cc
similarity index 94%
rename from src/tint/core/io/tmpfile_other.cc
rename to src/tint/utils/file/tmpfile_other.cc
index 8c81345..1a7da4c 100644
--- a/src/tint/core/io/tmpfile_other.cc
+++ b/src/tint/utils/file/tmpfile_other.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/io/tmpfile.h"
+#include "src/tint/utils/file/tmpfile.h"
 
 namespace tint::utils {
 
diff --git a/src/tint/core/io/tmpfile_posix.cc b/src/tint/utils/file/tmpfile_posix.cc
similarity index 95%
rename from src/tint/core/io/tmpfile_posix.cc
rename to src/tint/utils/file/tmpfile_posix.cc
index 548cd08..f26747d 100644
--- a/src/tint/core/io/tmpfile_posix.cc
+++ b/src/tint/utils/file/tmpfile_posix.cc
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/io/tmpfile.h"
+#include "src/tint/utils/file/tmpfile.h"
 
 #include <unistd.h>
 #include <limits>
 
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
 
 namespace tint::utils {
 
diff --git a/src/tint/core/io/tmpfile_test.cc b/src/tint/utils/file/tmpfile_test.cc
similarity index 97%
rename from src/tint/core/io/tmpfile_test.cc
rename to src/tint/utils/file/tmpfile_test.cc
index 2c0644d..e2fff23 100644
--- a/src/tint/core/io/tmpfile_test.cc
+++ b/src/tint/utils/file/tmpfile_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/io/tmpfile.h"
+#include "src/tint/utils/file/tmpfile.h"
 
 #include <fstream>
 
diff --git a/src/tint/core/io/tmpfile_windows.cc b/src/tint/utils/file/tmpfile_windows.cc
similarity index 97%
rename from src/tint/core/io/tmpfile_windows.cc
rename to src/tint/utils/file/tmpfile_windows.cc
index 3b97273..0a4598e 100644
--- a/src/tint/core/io/tmpfile_windows.cc
+++ b/src/tint/utils/file/tmpfile_windows.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/io/tmpfile.h"
+#include "src/tint/utils/file/tmpfile.h"
 
 #include <stdio.h>
 #include <cstdio>
diff --git a/src/tint/core/compiler_macros.h b/src/tint/utils/macros/compiler.h
similarity index 95%
rename from src/tint/core/compiler_macros.h
rename to src/tint/utils/macros/compiler.h
index 6748ed5..f0af760 100644
--- a/src/tint/core/compiler_macros.h
+++ b/src/tint/utils/macros/compiler.h
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/concat.h"
+#include "src/tint/utils/macros/concat.h"
 
-#ifndef SRC_TINT_CORE_COMPILER_MACROS_H_
-#define SRC_TINT_CORE_COMPILER_MACROS_H_
+#ifndef SRC_TINT_UTILS_MACROS_COMPILER_H_
+#define SRC_TINT_UTILS_MACROS_COMPILER_H_
 
 #define TINT_REQUIRE_SEMICOLON static_assert(true)
 
@@ -107,4 +107,4 @@
 
 #endif
 
-#endif  // SRC_TINT_CORE_COMPILER_MACROS_H_
+#endif  // SRC_TINT_UTILS_MACROS_COMPILER_H_
diff --git a/src/tint/core/concat.h b/src/tint/utils/macros/concat.h
similarity index 84%
rename from src/tint/core/concat.h
rename to src/tint/utils/macros/concat.h
index 66df8d1..56b47ce 100644
--- a/src/tint/core/concat.h
+++ b/src/tint/utils/macros/concat.h
@@ -13,10 +13,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_CONCAT_H_
-#define SRC_TINT_CORE_CONCAT_H_
+#ifndef SRC_TINT_UTILS_MACROS_CONCAT_H_
+#define SRC_TINT_UTILS_MACROS_CONCAT_H_
 
 #define TINT_CONCAT_2(a, b) a##b
 #define TINT_CONCAT(a, b) TINT_CONCAT_2(a, b)
 
-#endif  // SRC_TINT_CORE_CONCAT_H_
+#endif  // SRC_TINT_UTILS_MACROS_CONCAT_H_
diff --git a/src/tint/core/defer.h b/src/tint/utils/macros/defer.h
similarity index 90%
rename from src/tint/core/defer.h
rename to src/tint/utils/macros/defer.h
index 55a2562..7320f87 100644
--- a/src/tint/core/defer.h
+++ b/src/tint/utils/macros/defer.h
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_DEFER_H_
-#define SRC_TINT_CORE_DEFER_H_
+#ifndef SRC_TINT_UTILS_MACROS_DEFER_H_
+#define SRC_TINT_UTILS_MACROS_DEFER_H_
 
 #include <utility>
 
-#include "src/tint/core/concat.h"
+#include "src/tint/utils/macros/concat.h"
 
 namespace tint::utils {
 
@@ -57,4 +57,4 @@
 #define TINT_DEFER(S) \
     auto TINT_CONCAT(tint_defer_, __COUNTER__) = ::tint::utils::MakeDefer([&] { S; })
 
-#endif  // SRC_TINT_CORE_DEFER_H_
+#endif  // SRC_TINT_UTILS_MACROS_DEFER_H_
diff --git a/src/tint/core/defer_test.cc b/src/tint/utils/macros/defer_test.cc
similarity index 96%
rename from src/tint/core/defer_test.cc
rename to src/tint/utils/macros/defer_test.cc
index aac6237..f131cc8 100644
--- a/src/tint/core/defer_test.cc
+++ b/src/tint/utils/macros/defer_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/defer.h"
+#include "src/tint/utils/macros/defer.h"
 
 #include "gtest/gtest.h"
 
diff --git a/src/tint/core/foreach_macro.h b/src/tint/utils/macros/foreach.h
similarity index 96%
rename from src/tint/core/foreach_macro.h
rename to src/tint/utils/macros/foreach.h
index 50bc63d..adfc974 100644
--- a/src/tint/core/foreach_macro.h
+++ b/src/tint/utils/macros/foreach.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_FOREACH_MACRO_H_
-#define SRC_TINT_CORE_FOREACH_MACRO_H_
+#ifndef SRC_TINT_UTILS_MACROS_FOREACH_H_
+#define SRC_TINT_UTILS_MACROS_FOREACH_H_
 
 // Macro magic to perform macro variadic dispatch.
 // See:
@@ -88,4 +88,4 @@
     TINT_FOREACH_11(CB, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14)          \
     CB(_15)
 
-#endif  // SRC_TINT_CORE_FOREACH_MACRO_H_
+#endif  // SRC_TINT_UTILS_MACROS_FOREACH_H_
diff --git a/src/tint/core/scoped_assignment.h b/src/tint/utils/macros/scoped_assignment.h
similarity index 90%
rename from src/tint/core/scoped_assignment.h
rename to src/tint/utils/macros/scoped_assignment.h
index cd2343c..d5279f8 100644
--- a/src/tint/core/scoped_assignment.h
+++ b/src/tint/utils/macros/scoped_assignment.h
@@ -13,12 +13,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_SCOPED_ASSIGNMENT_H_
-#define SRC_TINT_CORE_SCOPED_ASSIGNMENT_H_
+#ifndef SRC_TINT_UTILS_MACROS_SCOPED_ASSIGNMENT_H_
+#define SRC_TINT_UTILS_MACROS_SCOPED_ASSIGNMENT_H_
 
 #include <type_traits>
 
-#include "src/tint/core/concat.h"
+#include "src/tint/utils/macros/concat.h"
 
 namespace tint::utils {
 
@@ -59,4 +59,4 @@
         var, val                                                                         \
     }
 
-#endif  // SRC_TINT_CORE_SCOPED_ASSIGNMENT_H_
+#endif  // SRC_TINT_UTILS_MACROS_SCOPED_ASSIGNMENT_H_
diff --git a/src/tint/core/scoped_assignment_test.cc b/src/tint/utils/macros/scoped_assignment_test.cc
similarity index 95%
rename from src/tint/core/scoped_assignment_test.cc
rename to src/tint/utils/macros/scoped_assignment_test.cc
index 04142f9..fa3b4ad 100644
--- a/src/tint/core/scoped_assignment_test.cc
+++ b/src/tint/utils/macros/scoped_assignment_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/scoped_assignment.h"
+#include "src/tint/utils/macros/scoped_assignment.h"
 
 #include "gtest/gtest.h"
 
diff --git a/src/tint/core/crc32.h b/src/tint/utils/math/crc32.h
similarity index 97%
rename from src/tint/core/crc32.h
rename to src/tint/utils/math/crc32.h
index 8125e45..022eefd 100644
--- a/src/tint/core/crc32.h
+++ b/src/tint/utils/math/crc32.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_CRC32_H_
-#define SRC_TINT_CORE_CRC32_H_
+#ifndef SRC_TINT_UTILS_MATH_CRC32_H_
+#define SRC_TINT_UTILS_MATH_CRC32_H_
 
 #include <stdint.h>
 #include <cstddef>
@@ -78,4 +78,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_CRC32_H_
+#endif  // SRC_TINT_UTILS_MATH_CRC32_H_
diff --git a/src/tint/core/crc32_test.cc b/src/tint/utils/math/crc32_test.cc
similarity index 96%
rename from src/tint/core/crc32_test.cc
rename to src/tint/utils/math/crc32_test.cc
index b6088b1..f029108 100644
--- a/src/tint/core/crc32_test.cc
+++ b/src/tint/utils/math/crc32_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/crc32.h"
+#include "src/tint/utils/math/crc32.h"
 
 #include "gtest/gtest.h"
 
diff --git a/src/tint/core/hash.h b/src/tint/utils/math/hash.h
similarity index 97%
rename from src/tint/core/hash.h
rename to src/tint/utils/math/hash.h
index 1c7c78b..74f053b 100644
--- a/src/tint/core/hash.h
+++ b/src/tint/utils/math/hash.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_HASH_H_
-#define SRC_TINT_CORE_HASH_H_
+#ifndef SRC_TINT_UTILS_MATH_HASH_H_
+#define SRC_TINT_UTILS_MATH_HASH_H_
 
 #include <stdint.h>
 #include <cstdio>
@@ -24,8 +24,8 @@
 #include <variant>
 #include <vector>
 
-#include "src/tint/core/crc32.h"
-#include "src/tint/core/vector.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/math/crc32.h"
 
 namespace tint::utils {
 namespace detail {
@@ -298,4 +298,4 @@
 
 }  // namespace std
 
-#endif  // SRC_TINT_CORE_HASH_H_
+#endif  // SRC_TINT_UTILS_MATH_HASH_H_
diff --git a/src/tint/core/hash_test.cc b/src/tint/utils/math/hash_test.cc
similarity index 97%
rename from src/tint/core/hash_test.cc
rename to src/tint/utils/math/hash_test.cc
index 2910e6e..7083170 100644
--- a/src/tint/core/hash_test.cc
+++ b/src/tint/utils/math/hash_test.cc
@@ -12,14 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/hash.h"
+#include "src/tint/utils/math/hash.h"
 
 #include <string>
 #include <tuple>
 #include <unordered_map>
 
 #include "gtest/gtest.h"
-#include "src/tint/core/vector.h"
+#include "src/tint/utils/containers/vector.h"
 
 namespace tint::utils {
 namespace {
diff --git a/src/tint/core/math.h b/src/tint/utils/math/math.h
similarity index 96%
rename from src/tint/core/math.h
rename to src/tint/utils/math/math.h
index d14e43d..59bd36c 100644
--- a/src/tint/core/math.h
+++ b/src/tint/utils/math/math.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_MATH_H_
-#define SRC_TINT_CORE_MATH_H_
+#ifndef SRC_TINT_UTILS_MATH_MATH_H_
+#define SRC_TINT_UTILS_MATH_MATH_H_
 
 #include <stdint.h>
 
@@ -100,4 +100,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_MATH_H_
+#endif  // SRC_TINT_UTILS_MATH_MATH_H_
diff --git a/src/tint/core/math_test.cc b/src/tint/utils/math/math_test.cc
similarity index 98%
rename from src/tint/core/math_test.cc
rename to src/tint/utils/math/math_test.cc
index 7e3e3e8..8da26ba 100644
--- a/src/tint/core/math_test.cc
+++ b/src/tint/utils/math/math_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/math.h"
+#include "src/tint/utils/math/math.h"
 
 #include "gtest/gtest.h"
 
diff --git a/src/tint/core/bitcast.h b/src/tint/utils/memory/bitcast.h
similarity index 93%
rename from src/tint/core/bitcast.h
rename to src/tint/utils/memory/bitcast.h
index 8f10b2c..30f772b 100644
--- a/src/tint/core/bitcast.h
+++ b/src/tint/utils/memory/bitcast.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_BITCAST_H_
-#define SRC_TINT_CORE_BITCAST_H_
+#ifndef SRC_TINT_UTILS_MEMORY_BITCAST_H_
+#define SRC_TINT_UTILS_MEMORY_BITCAST_H_
 
 #include <cstddef>
 #include <cstring>
@@ -50,4 +50,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_BITCAST_H_
+#endif  // SRC_TINT_UTILS_MEMORY_BITCAST_H_
diff --git a/src/tint/core/bitcast_test.cc b/src/tint/utils/memory/bitcast_test.cc
similarity index 95%
rename from src/tint/core/bitcast_test.cc
rename to src/tint/utils/memory/bitcast_test.cc
index 3ec2491..558c52f 100644
--- a/src/tint/core/bitcast_test.cc
+++ b/src/tint/utils/memory/bitcast_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/bitcast.h"
+#include "src/tint/utils/memory/bitcast.h"
 
 #include <stdint.h>
 
diff --git a/src/tint/core/block_allocator.h b/src/tint/utils/memory/block_allocator.h
similarity index 97%
rename from src/tint/core/block_allocator.h
rename to src/tint/utils/memory/block_allocator.h
index b3a19b8..1cc382c 100644
--- a/src/tint/core/block_allocator.h
+++ b/src/tint/utils/memory/block_allocator.h
@@ -12,15 +12,15 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_BLOCK_ALLOCATOR_H_
-#define SRC_TINT_CORE_BLOCK_ALLOCATOR_H_
+#ifndef SRC_TINT_UTILS_MEMORY_BLOCK_ALLOCATOR_H_
+#define SRC_TINT_UTILS_MEMORY_BLOCK_ALLOCATOR_H_
 
 #include <array>
 #include <cstring>
 #include <utility>
 
-#include "src/tint/core/bitcast.h"
-#include "src/tint/core/math.h"
+#include "src/tint/utils/math/math.h"
+#include "src/tint/utils/memory/bitcast.h"
 
 namespace tint::utils {
 
@@ -338,4 +338,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_BLOCK_ALLOCATOR_H_
+#endif  // SRC_TINT_UTILS_MEMORY_BLOCK_ALLOCATOR_H_
diff --git a/src/tint/core/block_allocator_test.cc b/src/tint/utils/memory/block_allocator_test.cc
similarity index 98%
rename from src/tint/core/block_allocator_test.cc
rename to src/tint/utils/memory/block_allocator_test.cc
index bcd3055..194769a 100644
--- a/src/tint/core/block_allocator_test.cc
+++ b/src/tint/utils/memory/block_allocator_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/block_allocator.h"
+#include "src/tint/utils/memory/block_allocator.h"
 
 #include "gtest/gtest.h"
 
diff --git a/src/tint/core/bump_allocator.h b/src/tint/utils/memory/bump_allocator.h
similarity index 94%
rename from src/tint/core/bump_allocator.h
rename to src/tint/utils/memory/bump_allocator.h
index ff96fa6..c4c07e8 100644
--- a/src/tint/core/bump_allocator.h
+++ b/src/tint/utils/memory/bump_allocator.h
@@ -12,15 +12,15 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_BUMP_ALLOCATOR_H_
-#define SRC_TINT_CORE_BUMP_ALLOCATOR_H_
+#ifndef SRC_TINT_UTILS_MEMORY_BUMP_ALLOCATOR_H_
+#define SRC_TINT_UTILS_MEMORY_BUMP_ALLOCATOR_H_
 
 #include <array>
 #include <cstring>
 #include <utility>
 
-#include "src/tint/core/bitcast.h"
-#include "src/tint/core/math.h"
+#include "src/tint/utils/math/math.h"
+#include "src/tint/utils/memory/bitcast.h"
 
 namespace tint::utils {
 
@@ -124,4 +124,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_BUMP_ALLOCATOR_H_
+#endif  // SRC_TINT_UTILS_MEMORY_BUMP_ALLOCATOR_H_
diff --git a/src/tint/core/bump_allocator_test.cc b/src/tint/utils/memory/bump_allocator_test.cc
similarity index 96%
rename from src/tint/core/bump_allocator_test.cc
rename to src/tint/utils/memory/bump_allocator_test.cc
index dd55691..0212586 100644
--- a/src/tint/core/bump_allocator_test.cc
+++ b/src/tint/utils/memory/bump_allocator_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/bump_allocator.h"
+#include "src/tint/utils/memory/bump_allocator.h"
 
 #include "gtest/gtest.h"
 
diff --git a/src/tint/reflection.h b/src/tint/utils/reflection/reflection.h
similarity index 90%
rename from src/tint/reflection.h
rename to src/tint/utils/reflection/reflection.h
index e8f29eb..c2ba483 100644
--- a/src/tint/reflection.h
+++ b/src/tint/utils/reflection/reflection.h
@@ -12,13 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_REFLECTION_H_
-#define SRC_TINT_REFLECTION_H_
+#ifndef SRC_TINT_UTILS_REFLECTION_REFLECTION_H_
+#define SRC_TINT_UTILS_REFLECTION_REFLECTION_H_
 
 #include <type_traits>
 
-#include "src/tint/core/concat.h"
-#include "src/tint/core/foreach_macro.h"
+#include "src/tint/utils/macros/concat.h"
+#include "src/tint/utils/macros/foreach.h"
 
 namespace tint {
 
@@ -65,4 +65,4 @@
 
 }  // namespace tint
 
-#endif  // SRC_TINT_REFLECTION_H_
+#endif  // SRC_TINT_UTILS_REFLECTION_REFLECTION_H_
diff --git a/src/tint/reflection_test.cc b/src/tint/utils/reflection/reflection_test.cc
similarity index 97%
rename from src/tint/reflection_test.cc
rename to src/tint/utils/reflection/reflection_test.cc
index 3c88b8d..e55beea 100644
--- a/src/tint/reflection_test.cc
+++ b/src/tint/utils/reflection/reflection_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/reflection.h"
+#include "src/tint/utils/reflection/reflection.h"
 #include "gtest/gtest.h"
 
 namespace tint {
diff --git a/src/tint/core/result.h b/src/tint/utils/result/result.h
similarity index 96%
rename from src/tint/core/result.h
rename to src/tint/utils/result/result.h
index ec6dcbe..8117ad1 100644
--- a/src/tint/core/result.h
+++ b/src/tint/utils/result/result.h
@@ -12,14 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_RESULT_H_
-#define SRC_TINT_CORE_RESULT_H_
+#ifndef SRC_TINT_UTILS_RESULT_RESULT_H_
+#define SRC_TINT_UTILS_RESULT_RESULT_H_
 
 #include <utility>
 #include <variant>
 
-#include "src/tint/core/string_stream.h"
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::utils {
 
@@ -163,4 +163,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_RESULT_H_
+#endif  // SRC_TINT_UTILS_RESULT_RESULT_H_
diff --git a/src/tint/core/result_test.cc b/src/tint/utils/result/result_test.cc
similarity index 96%
rename from src/tint/core/result_test.cc
rename to src/tint/utils/result/result_test.cc
index 8b08674..e7039cc 100644
--- a/src/tint/core/result_test.cc
+++ b/src/tint/utils/result/result_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/result.h"
+#include "src/tint/utils/result/result.h"
 
 #include <string>
 
diff --git a/src/tint/core/castable.cc b/src/tint/utils/rtti/castable.cc
similarity index 95%
rename from src/tint/core/castable.cc
rename to src/tint/utils/rtti/castable.cc
index 96a315c..dd4114a 100644
--- a/src/tint/core/castable.cc
+++ b/src/tint/utils/rtti/castable.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/castable.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint::utils {
 
diff --git a/src/tint/core/castable.h b/src/tint/utils/rtti/castable.h
similarity index 98%
rename from src/tint/core/castable.h
rename to src/tint/utils/rtti/castable.h
index 4bd0f80..7b0c97e 100644
--- a/src/tint/core/castable.h
+++ b/src/tint/utils/rtti/castable.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_CASTABLE_H_
-#define SRC_TINT_CORE_CASTABLE_H_
+#ifndef SRC_TINT_UTILS_RTTI_CASTABLE_H_
+#define SRC_TINT_UTILS_RTTI_CASTABLE_H_
 
 #include <stdint.h>
 #include <functional>
@@ -21,8 +21,8 @@
 #include <type_traits>
 #include <utility>
 
-#include "src/tint/core/crc32.h"
-#include "src/tint/core/traits.h"
+#include "src/tint/utils/math/crc32.h"
+#include "src/tint/utils/traits/traits.h"
 
 #if defined(__clang__)
 /// Temporarily disable certain warnings when using Castable API
@@ -550,4 +550,4 @@
 
 TINT_CASTABLE_POP_DISABLE_WARNINGS();
 
-#endif  // SRC_TINT_CORE_CASTABLE_H_
+#endif  // SRC_TINT_UTILS_RTTI_CASTABLE_H_
diff --git a/src/tint/core/castable_test.cc b/src/tint/utils/rtti/castable_test.cc
similarity index 99%
rename from src/tint/core/castable_test.cc
rename to src/tint/utils/rtti/castable_test.cc
index b7ec5457..847602d 100644
--- a/src/tint/core/castable_test.cc
+++ b/src/tint/utils/rtti/castable_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/castable.h"
+#include "src/tint/utils/rtti/castable.h"
 
 #include <memory>
 #include <string>
diff --git a/src/tint/switch.h b/src/tint/utils/rtti/switch.h
similarity index 97%
rename from src/tint/switch.h
rename to src/tint/utils/rtti/switch.h
index a774a76..7c42eda 100644
--- a/src/tint/switch.h
+++ b/src/tint/utils/rtti/switch.h
@@ -12,15 +12,15 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_SWITCH_H_
-#define SRC_TINT_SWITCH_H_
+#ifndef SRC_TINT_UTILS_RTTI_SWITCH_H_
+#define SRC_TINT_UTILS_RTTI_SWITCH_H_
 
 #include <tuple>
 #include <utility>
 
-#include "src/tint/core/bitcast.h"
-#include "src/tint/core/castable.h"
-#include "src/tint/core/defer.h"
+#include "src/tint/utils/macros/defer.h"
+#include "src/tint/utils/memory/bitcast.h"
+#include "src/tint/utils/rtti/castable.h"
 
 namespace tint {
 
@@ -263,4 +263,4 @@
 
 }  // namespace tint
 
-#endif  // SRC_TINT_SWITCH_H_
+#endif  // SRC_TINT_UTILS_RTTI_SWITCH_H_
diff --git a/src/tint/switch_bench.cc b/src/tint/utils/rtti/switch_bench.cc
similarity index 99%
rename from src/tint/switch_bench.cc
rename to src/tint/utils/rtti/switch_bench.cc
index e73d982..d2bf9f1 100644
--- a/src/tint/switch_bench.cc
+++ b/src/tint/utils/rtti/switch_bench.cc
@@ -16,7 +16,7 @@
 
 #include "benchmark/benchmark.h"
 
-#include "src/tint/switch.h"
+#include "src/tint/utils/rtti/switch.h"
 
 namespace tint {
 namespace {
diff --git a/src/tint/switch_test.cc b/src/tint/utils/rtti/switch_test.cc
similarity index 99%
rename from src/tint/switch_test.cc
rename to src/tint/utils/rtti/switch_test.cc
index f35192e..252fb18 100644
--- a/src/tint/switch_test.cc
+++ b/src/tint/utils/rtti/switch_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/switch.h"
+#include "src/tint/utils/rtti/switch.h"
 
 #include <memory>
 #include <string>
diff --git a/src/tint/core/templates/enums.tmpl.inc b/src/tint/utils/templates/enums.tmpl.inc
similarity index 100%
rename from src/tint/core/templates/enums.tmpl.inc
rename to src/tint/utils/templates/enums.tmpl.inc
diff --git a/src/tint/writer/float_to_string.cc b/src/tint/utils/text/float_to_string.cc
similarity index 97%
rename from src/tint/writer/float_to_string.cc
rename to src/tint/utils/text/float_to_string.cc
index b6369ed..9f9878c 100644
--- a/src/tint/writer/float_to_string.cc
+++ b/src/tint/utils/text/float_to_string.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/writer/float_to_string.h"
+#include "src/tint/utils/text/float_to_string.h"
 
 #include <cmath>
 #include <cstring>
@@ -20,8 +20,8 @@
 #include <iomanip>
 #include <limits>
 
-#include "src/tint/core/string_stream.h"
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::writer {
 
diff --git a/src/tint/writer/float_to_string.h b/src/tint/utils/text/float_to_string.h
similarity index 92%
rename from src/tint/writer/float_to_string.h
rename to src/tint/utils/text/float_to_string.h
index 387c0a8..dd4a2a3 100644
--- a/src/tint/writer/float_to_string.h
+++ b/src/tint/utils/text/float_to_string.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_WRITER_FLOAT_TO_STRING_H_
-#define SRC_TINT_WRITER_FLOAT_TO_STRING_H_
+#ifndef SRC_TINT_UTILS_TEXT_FLOAT_TO_STRING_H_
+#define SRC_TINT_UTILS_TEXT_FLOAT_TO_STRING_H_
 
 #include <string>
 
@@ -47,4 +47,4 @@
 
 }  // namespace tint::writer
 
-#endif  // SRC_TINT_WRITER_FLOAT_TO_STRING_H_
+#endif  // SRC_TINT_UTILS_TEXT_FLOAT_TO_STRING_H_
diff --git a/src/tint/writer/float_to_string_test.cc b/src/tint/utils/text/float_to_string_test.cc
similarity index 98%
rename from src/tint/writer/float_to_string_test.cc
rename to src/tint/utils/text/float_to_string_test.cc
index 3af0e14..20beb16 100644
--- a/src/tint/writer/float_to_string_test.cc
+++ b/src/tint/utils/text/float_to_string_test.cc
@@ -12,14 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/writer/float_to_string.h"
+#include "src/tint/utils/text/float_to_string.h"
 
 #include <math.h>
 #include <cstring>
 #include <limits>
 
 #include "gtest/gtest.h"
-#include "src/tint/core/bitcast.h"
+#include "src/tint/utils/memory/bitcast.h"
 
 namespace tint::writer {
 namespace {
diff --git a/src/tint/core/parse_num.cc b/src/tint/utils/text/parse_num.cc
similarity index 98%
rename from src/tint/core/parse_num.cc
rename to src/tint/utils/text/parse_num.cc
index cd907a6..c2a0eea 100644
--- a/src/tint/core/parse_num.cc
+++ b/src/tint/utils/text/parse_num.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/parse_num.h"
+#include "src/tint/utils/text/parse_num.h"
 
 #include <charconv>
 
diff --git a/src/tint/core/parse_num.h b/src/tint/utils/text/parse_num.h
similarity index 94%
rename from src/tint/core/parse_num.h
rename to src/tint/utils/text/parse_num.h
index 04d1876..936fd0f 100644
--- a/src/tint/core/parse_num.h
+++ b/src/tint/utils/text/parse_num.h
@@ -12,14 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_PARSE_NUM_H_
-#define SRC_TINT_CORE_PARSE_NUM_H_
+#ifndef SRC_TINT_UTILS_TEXT_PARSE_NUM_H_
+#define SRC_TINT_UTILS_TEXT_PARSE_NUM_H_
 
 #include <optional>
 #include <string>
 
-#include "src/tint/core/compiler_macros.h"
-#include "src/tint/core/result.h"
+#include "src/tint/utils/macros/compiler.h"
+#include "src/tint/utils/result/result.h"
 
 namespace tint::utils {
 
@@ -128,4 +128,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_PARSE_NUM_H_
+#endif  // SRC_TINT_UTILS_TEXT_PARSE_NUM_H_
diff --git a/src/tint/core/string.cc b/src/tint/utils/text/string.cc
similarity index 95%
rename from src/tint/core/string.cc
rename to src/tint/utils/text/string.cc
index 3cd831d..91644f8 100644
--- a/src/tint/core/string.cc
+++ b/src/tint/utils/text/string.cc
@@ -14,9 +14,9 @@
 
 #include <algorithm>
 
-#include "src/tint/core/string.h"
-#include "src/tint/core/transform.h"
-#include "src/tint/core/vector.h"
+#include "src/tint/utils/containers/transform.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/text/string.h"
 
 namespace tint::utils {
 
diff --git a/src/tint/core/string.h b/src/tint/utils/text/string.h
similarity index 96%
rename from src/tint/core/string.h
rename to src/tint/utils/text/string.h
index 8155437..96df884 100644
--- a/src/tint/core/string.h
+++ b/src/tint/utils/text/string.h
@@ -12,15 +12,15 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_STRING_H_
-#define SRC_TINT_CORE_STRING_H_
+#ifndef SRC_TINT_UTILS_TEXT_STRING_H_
+#define SRC_TINT_UTILS_TEXT_STRING_H_
 
 #include <string>
 #include <variant>
 
-#include "src/tint/core/slice.h"
-#include "src/tint/core/string_stream.h"
-#include "src/tint/core/vector.h"
+#include "src/tint/utils/containers/slice.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::utils {
 
@@ -222,4 +222,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_STRING_H_
+#endif  // SRC_TINT_UTILS_TEXT_STRING_H_
diff --git a/src/tint/core/string_stream.cc b/src/tint/utils/text/string_stream.cc
similarity index 96%
rename from src/tint/core/string_stream.cc
rename to src/tint/utils/text/string_stream.cc
index 66aeee7..ca84686 100644
--- a/src/tint/core/string_stream.cc
+++ b/src/tint/utils/text/string_stream.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::utils {
 
diff --git a/src/tint/core/string_stream.h b/src/tint/utils/text/string_stream.h
similarity index 97%
rename from src/tint/core/string_stream.h
rename to src/tint/utils/text/string_stream.h
index e178871..3d65972 100644
--- a/src/tint/core/string_stream.h
+++ b/src/tint/utils/text/string_stream.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_STRING_STREAM_H_
-#define SRC_TINT_CORE_STRING_STREAM_H_
+#ifndef SRC_TINT_UTILS_TEXT_STRING_STREAM_H_
+#define SRC_TINT_UTILS_TEXT_STRING_STREAM_H_
 
 #include <functional>
 #include <iomanip>
@@ -23,7 +23,7 @@
 #include <string>
 #include <utility>
 
-#include "src/tint/core/unicode.h"
+#include "src/tint/utils/text/unicode.h"
 
 namespace tint::utils {
 
@@ -194,4 +194,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_STRING_STREAM_H_
+#endif  // SRC_TINT_UTILS_TEXT_STRING_STREAM_H_
diff --git a/src/tint/core/string_stream_test.cc b/src/tint/utils/text/string_stream_test.cc
similarity index 98%
rename from src/tint/core/string_stream_test.cc
rename to src/tint/utils/text/string_stream_test.cc
index 711a10d..b18ebb2 100644
--- a/src/tint/core/string_stream_test.cc
+++ b/src/tint/utils/text/string_stream_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
 #include <math.h>
 #include <cstring>
diff --git a/src/tint/core/string_test.cc b/src/tint/utils/text/string_test.cc
similarity index 97%
rename from src/tint/core/string_test.cc
rename to src/tint/utils/text/string_test.cc
index 5659bd4..1caa879 100644
--- a/src/tint/core/string_test.cc
+++ b/src/tint/utils/text/string_test.cc
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/string.h"
+#include "src/tint/utils/text/string.h"
 
 #include "gmock/gmock.h"
-#include "src/tint/core/string_stream.h"
+#include "src/tint/utils/text/string_stream.h"
 
-#include "src/tint/core/transform.h"  // Used by ToStringList()
+#include "src/tint/utils/containers/transform.h"  // Used by ToStringList()
 
 namespace tint::utils {
 namespace {
diff --git a/src/tint/symbol.cc b/src/tint/utils/text/symbol.cc
similarity index 97%
rename from src/tint/symbol.cc
rename to src/tint/utils/text/symbol.cc
index 7e69b5d..731f66e 100644
--- a/src/tint/symbol.cc
+++ b/src/tint/utils/text/symbol.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/symbol.h"
+#include "src/tint/utils/text/symbol.h"
 
 #include <utility>
 
diff --git a/src/tint/symbol.h b/src/tint/utils/text/symbol.h
similarity index 96%
rename from src/tint/symbol.h
rename to src/tint/utils/text/symbol.h
index fdfa843..381f745 100644
--- a/src/tint/symbol.h
+++ b/src/tint/utils/text/symbol.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_SYMBOL_H_
-#define SRC_TINT_SYMBOL_H_
+#ifndef SRC_TINT_UTILS_TEXT_SYMBOL_H_
+#define SRC_TINT_UTILS_TEXT_SYMBOL_H_
 
 #include <string>
 
@@ -120,4 +120,4 @@
 
 }  // namespace std
 
-#endif  // SRC_TINT_SYMBOL_H_
+#endif  // SRC_TINT_UTILS_TEXT_SYMBOL_H_
diff --git a/src/tint/symbol_table.cc b/src/tint/utils/text/symbol_table.cc
similarity index 96%
rename from src/tint/symbol_table.cc
rename to src/tint/utils/text/symbol_table.cc
index cdea0a4..cc11724 100644
--- a/src/tint/symbol_table.cc
+++ b/src/tint/utils/text/symbol_table.cc
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/symbol_table.h"
+#include "src/tint/utils/text/symbol_table.h"
 
-#include "src/tint/debug.h"
+#include "src/tint/utils/debug/debug.h"
 
 namespace tint {
 
diff --git a/src/tint/symbol_table.h b/src/tint/utils/text/symbol_table.h
similarity index 92%
rename from src/tint/symbol_table.h
rename to src/tint/utils/text/symbol_table.h
index ce5312f..419f632 100644
--- a/src/tint/symbol_table.h
+++ b/src/tint/utils/text/symbol_table.h
@@ -12,14 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_SYMBOL_TABLE_H_
-#define SRC_TINT_SYMBOL_TABLE_H_
+#ifndef SRC_TINT_UTILS_TEXT_SYMBOL_TABLE_H_
+#define SRC_TINT_UTILS_TEXT_SYMBOL_TABLE_H_
 
 #include <string>
 
-#include "src/tint/core/bump_allocator.h"
-#include "src/tint/core/hashmap.h"
-#include "src/tint/symbol.h"
+#include "src/tint/utils/containers/hashmap.h"
+#include "src/tint/utils/memory/bump_allocator.h"
+#include "src/tint/utils/text/symbol.h"
 
 namespace tint {
 
@@ -108,4 +108,4 @@
 
 }  // namespace tint
 
-#endif  // SRC_TINT_SYMBOL_TABLE_H_
+#endif  // SRC_TINT_UTILS_TEXT_SYMBOL_TABLE_H_
diff --git a/src/tint/symbol_table_test.cc b/src/tint/utils/text/symbol_table_test.cc
similarity index 96%
rename from src/tint/symbol_table_test.cc
rename to src/tint/utils/text/symbol_table_test.cc
index ebdb6d8..ee36a66 100644
--- a/src/tint/symbol_table_test.cc
+++ b/src/tint/utils/text/symbol_table_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/symbol_table.h"
+#include "src/tint/utils/text/symbol_table.h"
 
 #include "gtest/gtest-spi.h"
 
diff --git a/src/tint/symbol_test.cc b/src/tint/utils/text/symbol_test.cc
similarity index 96%
rename from src/tint/symbol_test.cc
rename to src/tint/utils/text/symbol_test.cc
index 6285414..8fbafea 100644
--- a/src/tint/symbol_test.cc
+++ b/src/tint/utils/text/symbol_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/symbol.h"
+#include "src/tint/utils/text/symbol.h"
 
 #include "gtest/gtest.h"
 
diff --git a/src/tint/writer/text_generator.cc b/src/tint/utils/text/text_generator.cc
similarity index 96%
rename from src/tint/writer/text_generator.cc
rename to src/tint/utils/text/text_generator.cc
index b61c0fb..13fecb4 100644
--- a/src/tint/writer/text_generator.cc
+++ b/src/tint/utils/text/text_generator.cc
@@ -12,13 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/writer/text_generator.h"
+#include "src/tint/utils/text/text_generator.h"
 
 #include <algorithm>
 #include <limits>
 
-#include "src/tint/core/map.h"
-#include "src/tint/debug.h"
+#include "src/tint/utils/containers/map.h"
+#include "src/tint/utils/debug/debug.h"
 
 namespace tint::writer {
 
diff --git a/src/tint/writer/text_generator.h b/src/tint/utils/text/text_generator.h
similarity index 96%
rename from src/tint/writer/text_generator.h
rename to src/tint/utils/text/text_generator.h
index 47d48bc..68ca893 100644
--- a/src/tint/writer/text_generator.h
+++ b/src/tint/utils/text/text_generator.h
@@ -12,17 +12,17 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_WRITER_TEXT_GENERATOR_H_
-#define SRC_TINT_WRITER_TEXT_GENERATOR_H_
+#ifndef SRC_TINT_UTILS_TEXT_TEXT_GENERATOR_H_
+#define SRC_TINT_UTILS_TEXT_TEXT_GENERATOR_H_
 
 #include <string>
 #include <unordered_map>
 #include <utility>
 #include <vector>
 
-#include "src/tint/core/diagnostic/diagnostic.h"
-#include "src/tint/core/string_stream.h"
 #include "src/tint/lang/base/type/struct.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
+#include "src/tint/utils/text/string_stream.h"
 
 namespace tint::writer {
 
@@ -203,4 +203,4 @@
 
 }  // namespace tint::writer
 
-#endif  // SRC_TINT_WRITER_TEXT_GENERATOR_H_
+#endif  // SRC_TINT_UTILS_TEXT_TEXT_GENERATOR_H_
diff --git a/src/tint/core/unicode.cc b/src/tint/utils/text/unicode.cc
similarity index 99%
rename from src/tint/core/unicode.cc
rename to src/tint/utils/text/unicode.cc
index db1e90e..7bb64b5 100644
--- a/src/tint/core/unicode.cc
+++ b/src/tint/utils/text/unicode.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/unicode.h"
+#include "src/tint/utils/text/unicode.h"
 
 #include <algorithm>
 
diff --git a/src/tint/core/unicode.h b/src/tint/utils/text/unicode.h
similarity index 95%
rename from src/tint/core/unicode.h
rename to src/tint/utils/text/unicode.h
index 70c4bae..e5e32c0 100644
--- a/src/tint/core/unicode.h
+++ b/src/tint/utils/text/unicode.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_UNICODE_H_
-#define SRC_TINT_CORE_UNICODE_H_
+#ifndef SRC_TINT_UTILS_TEXT_UNICODE_H_
+#define SRC_TINT_UTILS_TEXT_UNICODE_H_
 
 #include <cstddef>
 #include <cstdint>
@@ -77,4 +77,4 @@
 
 }  // namespace tint::utils
 
-#endif  // SRC_TINT_CORE_UNICODE_H_
+#endif  // SRC_TINT_UTILS_TEXT_UNICODE_H_
diff --git a/src/tint/core/unicode_test.cc b/src/tint/utils/text/unicode_test.cc
similarity index 99%
rename from src/tint/core/unicode_test.cc
rename to src/tint/utils/text/unicode_test.cc
index 09deb98..9f87b04 100644
--- a/src/tint/core/unicode_test.cc
+++ b/src/tint/utils/text/unicode_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/unicode.h"
+#include "src/tint/utils/text/unicode.h"
 
 #include <string>
 #include <vector>
diff --git a/src/tint/core/traits.h b/src/tint/utils/traits/traits.h
similarity index 98%
rename from src/tint/core/traits.h
rename to src/tint/utils/traits/traits.h
index 4071249..f9c9a91 100644
--- a/src/tint/core/traits.h
+++ b/src/tint/utils/traits/traits.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_CORE_TRAITS_H_
-#define SRC_TINT_CORE_TRAITS_H_
+#ifndef SRC_TINT_UTILS_TRAITS_TRAITS_H_
+#define SRC_TINT_UTILS_TRAITS_TRAITS_H_
 
 #include <string>
 #include <tuple>
@@ -211,4 +211,4 @@
 
 }  // namespace tint::utils::traits
 
-#endif  // SRC_TINT_CORE_TRAITS_H_
+#endif  // SRC_TINT_UTILS_TRAITS_TRAITS_H_
diff --git a/src/tint/core/traits_test.cc b/src/tint/utils/traits/traits_test.cc
similarity index 99%
rename from src/tint/core/traits_test.cc
rename to src/tint/utils/traits/traits_test.cc
index de14972..da78f27 100644
--- a/src/tint/core/traits_test.cc
+++ b/src/tint/utils/traits/traits_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/core/traits.h"
+#include "src/tint/utils/traits/traits.h"
 
 #include "gtest/gtest.h"
 
diff --git a/src/tint/writer/ast_text_generator.cc b/src/tint/writer/ast_text_generator.cc
index 6b666b0..fe53641 100644
--- a/src/tint/writer/ast_text_generator.cc
+++ b/src/tint/writer/ast_text_generator.cc
@@ -17,7 +17,7 @@
 #include <algorithm>
 #include <limits>
 
-#include "src/tint/core/map.h"
+#include "src/tint/utils/containers/map.h"
 
 namespace tint::writer {
 
diff --git a/src/tint/writer/ast_text_generator.h b/src/tint/writer/ast_text_generator.h
index 8a8608b..84f115e 100644
--- a/src/tint/writer/ast_text_generator.h
+++ b/src/tint/writer/ast_text_generator.h
@@ -21,7 +21,7 @@
 #include <vector>
 
 #include "src/tint/lang/wgsl/program/program_builder.h"
-#include "src/tint/writer/text_generator.h"
+#include "src/tint/utils/text/text_generator.h"
 
 namespace tint::writer {
 
diff --git a/src/tint/writer/ir_text_generator.cc b/src/tint/writer/ir_text_generator.cc
index 7d476a9..ac071c7 100644
--- a/src/tint/writer/ir_text_generator.cc
+++ b/src/tint/writer/ir_text_generator.cc
@@ -14,7 +14,7 @@
 
 #include "src/tint/writer/ir_text_generator.h"
 
-#include "src/tint/core/map.h"
+#include "src/tint/utils/containers/map.h"
 
 namespace tint::writer {
 
diff --git a/src/tint/writer/ir_text_generator.h b/src/tint/writer/ir_text_generator.h
index 60ccfbc..3cb3a666 100644
--- a/src/tint/writer/ir_text_generator.h
+++ b/src/tint/writer/ir_text_generator.h
@@ -18,7 +18,7 @@
 #include <string>
 
 #include "src/tint/ir/module.h"
-#include "src/tint/writer/text_generator.h"
+#include "src/tint/utils/text/text_generator.h"
 
 namespace tint::writer {