diff --git a/spec/type_aliases/file_content_spec.rb b/spec/type_aliases/file_content_spec.rb
new file mode 100644
index 000000000..157bc39db
--- /dev/null
+++ b/spec/type_aliases/file_content_spec.rb
@@ -0,0 +1,30 @@
+# coding: utf-8
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'Stdlib::File::Content' do
+  describe 'valid content' do
+    [
+      '',
+      'abc',
+      sensitive('secret'),
+      # TODO: test Deferred and Binary?
+    ].each do |value|
+      describe value.inspect do
+        it { is_expected.to allow_value(value) }
+      end
+    end
+
+    context 'with garbage inputs' do
+      [
+        nil,
+        1,
+      ].each do |value|
+        describe value.inspect do
+          it { is_expected.not_to allow_value(value) }
+        end
+      end
+    end
+  end
+end
diff --git a/spec/type_aliases/file_mode_spec.rb b/spec/type_aliases/file_mode_spec.rb
new file mode 100644
index 000000000..af6b9bf69
--- /dev/null
+++ b/spec/type_aliases/file_mode_spec.rb
@@ -0,0 +1,61 @@
+# coding: utf-8
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'Stdlib::File::Mode' do
+  describe 'valid modes' do
+    [
+      '7',
+      '12',
+      '666',
+
+      '0000',
+      '0644',
+      '1644',
+      '2644',
+      '4644',
+      '0123',
+      '0777',
+
+      'a=,o-r,u+X,g=w',
+      'a=Xr,+0',
+      'u=rwx,g+rX',
+      'u+s,g-s',
+    ].each do |value|
+      describe value.inspect do
+        it { is_expected.to allow_value(value) }
+      end
+    end
+  end
+
+  describe 'invalid modes' do
+    context 'with garbage inputs' do
+      [
+        true,
+        false,
+        :keyword,
+        nil,
+        [nil],
+        [nil, nil],
+        { 'foo' => 'bar' },
+        {},
+        '',
+        "\n0644",
+        "\n0644\n",
+        "0644\n",
+        'ネット',
+        '55555',
+        '0x123',
+        '0649',
+
+        '=8,X',
+        'x=r,a=wx',
+      ].each do |value|
+        describe value.inspect do
+          it { is_expected.not_to allow_value(value) }
+        end
+      end
+    end
+  end
+end
diff --git a/spec/type_aliases/file_source_spec.rb b/spec/type_aliases/file_source_spec.rb
new file mode 100644
index 000000000..8b1f7f6e0
--- /dev/null
+++ b/spec/type_aliases/file_source_spec.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'Stdlib::File::Source' do
+  describe 'valid handling' do
+    [
+      'https://hello.com',
+      'https://notcreative.org',
+      'https://canstillaccepthttps.co.uk',
+      'http://anhttp.com',
+      'http://runningoutofideas.gov',
+      'file:///hello/bla',
+      'file:///foo/bar.log',
+      'puppet:///modules/foo/bar.log',
+      'puppet://pm.example.com/modules/foo/bar.log',
+      'puppet://192.0.2.1/modules/foo/bar.log',
+      '/usr2/username/bin:/usr/local/bin:/usr/bin:.',
+      'C:/',
+      'C:\\',
+      'C:\\WINDOWS\\System32',
+      'C:/windows/system32',
+      'X:/foo/bar',
+      'X:\\foo\\bar',
+      '\\\\host\\windows',
+      '//host/windows',
+      '/var/tmp',
+      '/var/opt/../lib/puppet',
+      'puppet:///a_custom_mount_point/foo/bar/foobar.conf',
+    ].each do |value|
+      describe value.inspect do
+        it { is_expected.to allow_value(value) }
+      end
+    end
+  end
+
+  describe 'invalid path handling' do
+    context 'garbage inputs' do
+      [
+        nil,
+        [nil],
+        [nil, nil],
+        { 'foo' => 'bar' },
+        {},
+        '',
+        "\nfile:///foo/bar.log",
+        "\nfile:///foo/bar.log\n",
+        "file:///foo/bar.log\n",
+        "\npuppet:///modules/foo/bar.log",
+        "\npuppet:///modules/foo/bar.log\n",
+        "puppet:///modules/foo/bar.log\n",
+        '*/Users//nope',
+        '\\Users/hc/wksp/stdlib',
+        'C:noslashes',
+        '\\var\\tmp',
+        'puppet://bob@pm.example.com/modules/foo/bar.log',
+      ].each do |value|
+        describe value.inspect do
+          it { is_expected.not_to allow_value(value) }
+        end
+      end
+    end
+  end
+end
diff --git a/types/file/content.pp b/types/file/content.pp
new file mode 100644
index 000000000..9ee3d9631
--- /dev/null
+++ b/types/file/content.pp
@@ -0,0 +1,2 @@
+# @summary Validate a file content attribute
+type Stdlib::File::Content = Variant[String, Sensitive[String], Deferred[String], Binary]
diff --git a/types/file/mode.pp b/types/file/mode.pp
new file mode 100644
index 000000000..b39f2cc68
--- /dev/null
+++ b/types/file/mode.pp
@@ -0,0 +1,5 @@
+# @summary Validate a file mode
+# See `man chmod.1` for the regular expression for symbolic mode
+# lint:ignore:140chars
+type Stdlib::File::Mode = Pattern[/\A(([0-7]{1,4})|(([ugoa]*([-+=]([rwxXst]*|[ugo]))+|[-+=][0-7]+)(,([ugoa]*([-+=]([rwxXst]*|[ugo]))+|[-+=][0-7]+))*))\z/]
+# lint:endignore
diff --git a/types/file/source.pp b/types/file/source.pp
new file mode 100644
index 000000000..5ae0c94ed
--- /dev/null
+++ b/types/file/source.pp
@@ -0,0 +1,9 @@
+# @summary Validate the source parameter on file types
+type Stdlib::File::Source = Variant[
+  Stdlib::Absolutepath,
+  Stdlib::HTTPUrl,
+  Pattern[
+    /\Afile:\/\/\/([^\n\/\0]+(\/)?)+\z/,
+    /\Apuppet:\/\/(([\w-]+\.?)+)?\/([^\n\/\0]+(\/)?)+\z/,
+  ],
+]
diff --git a/types/filemode.pp b/types/filemode.pp
index 2974a05f2..88a5887a5 100644
--- a/types/filemode.pp
+++ b/types/filemode.pp
@@ -1,5 +1,3 @@
 # @summary Validate a file mode
-# See `man chmod.1` for the regular expression for symbolic mode
-# lint:ignore:140chars
-type Stdlib::Filemode = Pattern[/\A(([0-7]{1,4})|(([ugoa]*([-+=]([rwxXst]*|[ugo]))+|[-+=][0-7]+)(,([ugoa]*([-+=]([rwxXst]*|[ugo]))+|[-+=][0-7]+))*))\z/]
-# lint:endignore
+# @deprecated Use Stdlib::File::Mode
+type Stdlib::Filemode = Stdlib::File::Mode
diff --git a/types/filesource.pp b/types/filesource.pp
index 9c12d9ed2..fe4ae733b 100644
--- a/types/filesource.pp
+++ b/types/filesource.pp
@@ -1,9 +1,3 @@
 # @summary Validate the source parameter on file types
-type Stdlib::Filesource = Variant[
-  Stdlib::Absolutepath,
-  Stdlib::HTTPUrl,
-  Pattern[
-    /\Afile:\/\/\/([^\n\/\0]+(\/)?)+\z/,
-    /\Apuppet:\/\/(([\w-]+\.?)+)?\/([^\n\/\0]+(\/)?)+\z/,
-  ],
-]
+# @deprecated Use Stdlib::File::Source
+type Stdlib::Filesource = Stdlib::File::Source