diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..6313b56
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+* text=auto eol=lf
diff --git a/.github/security.md b/.github/security.md
new file mode 100644
index 0000000..5358dc5
--- /dev/null
+++ b/.github/security.md
@@ -0,0 +1,3 @@
+# Security Policy
+
+To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure.
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644
index 0000000..7a5af0c
--- /dev/null
+++ b/.github/workflows/main.yml
@@ -0,0 +1,24 @@
+name: CI
+on:
+  - push
+  - pull_request
+jobs:
+  test:
+    name: Node.js ${{ matrix.node-version }} on ${{ matrix.os }}
+    runs-on: ${{ matrix.os }}
+    strategy:
+      fail-fast: false
+      matrix:
+        node-version:
+          - 14
+          - 12
+        os:
+          - macos-latest
+          - ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2
+      - uses: actions/setup-node@v1
+        with:
+          node-version: ${{ matrix.node-version }}
+      - run: npm install
+      - run: npm test
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a042fbb
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+node_modules
+yarn.lock
+.nyc_output
+coverage
diff --git a/debian/changelog b/debian/changelog
index c411c64..9db2948 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+node-path-type (5.0.0-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Wed, 11 May 2022 01:28:56 -0000
+
 node-path-type (4.0.0-2) unstable; urgency=medium
 
   * Team upload
diff --git a/index.d.ts b/index.d.ts
index 910a50a..fa742ad 100644
--- a/index.d.ts
+++ b/index.d.ts
@@ -1,51 +1,51 @@
 export type PathTypeFunction = (path: string) => Promise<boolean>;
 
 /**
- * Check whether the passed `path` is a file.
- *
- * @param path - The path to check.
- * @returns Whether the `path` is a file.
- */
+Check whether the passed `path` is a file.
+
+@param path - The path to check.
+@returns Whether the `path` is a file.
+*/
 export const isFile: PathTypeFunction;
 
 /**
- * Check whether the passed `path` is a directory.
- *
- * @param path - The path to check.
- * @returns Whether the `path` is a directory.
- */
+Check whether the passed `path` is a directory.
+
+@param path - The path to check.
+@returns Whether the `path` is a directory.
+*/
 export const isDirectory: PathTypeFunction;
 
 /**
- * Check whether the passed `path` is a symlink.
- *
- * @param path - The path to check.
- * @returns Whether the `path` is a symlink.
- */
+Check whether the passed `path` is a symlink.
+
+@param path - The path to check.
+@returns Whether the `path` is a symlink.
+*/
 export const isSymlink: PathTypeFunction;
 
 export type PathTypeSyncFunction = (path: string) => boolean;
 
 /**
- * Synchronously check whether the passed `path` is a file.
- *
- * @param path - The path to check.
- * @returns Whether the `path` is a file.
- */
+Synchronously check whether the passed `path` is a file.
+
+@param path - The path to check.
+@returns Whether the `path` is a file.
+*/
 export const isFileSync: PathTypeSyncFunction;
 
 /**
- * Synchronously check whether the passed `path` is a directory.
- *
- * @param path - The path to check.
- * @returns Whether the `path` is a directory.
- */
+Synchronously check whether the passed `path` is a directory.
+
+@param path - The path to check.
+@returns Whether the `path` is a directory.
+*/
 export const isDirectorySync: PathTypeSyncFunction;
 
 /**
- * Synchronously check whether the passed `path` is a symlink.
- *
- * @param path - The path to check.
- * @returns Whether the `path` is a directory.
- */
+Synchronously check whether the passed `path` is a symlink.
+
+@param path - The path to check.
+@returns Whether the `path` is a directory.
+*/
 export const isSymlinkSync: PathTypeSyncFunction;
diff --git a/index.js b/index.js
index b8f34b2..b43688d 100644
--- a/index.js
+++ b/index.js
@@ -1,6 +1,4 @@
-'use strict';
-const {promisify} = require('util');
-const fs = require('fs');
+import fs, {promises as fsPromises} from 'fs';
 
 async function isType(fsStatType, statsMethodName, filePath) {
 	if (typeof filePath !== 'string') {
@@ -8,7 +6,7 @@ async function isType(fsStatType, statsMethodName, filePath) {
 	}
 
 	try {
-		const stats = await promisify(fs[fsStatType])(filePath);
+		const stats = await fsPromises[fsStatType](filePath);
 		return stats[statsMethodName]();
 	} catch (error) {
 		if (error.code === 'ENOENT') {
@@ -35,9 +33,9 @@ function isTypeSync(fsStatType, statsMethodName, filePath) {
 	}
 }
 
-exports.isFile = isType.bind(null, 'stat', 'isFile');
-exports.isDirectory = isType.bind(null, 'stat', 'isDirectory');
-exports.isSymlink = isType.bind(null, 'lstat', 'isSymbolicLink');
-exports.isFileSync = isTypeSync.bind(null, 'statSync', 'isFile');
-exports.isDirectorySync = isTypeSync.bind(null, 'statSync', 'isDirectory');
-exports.isSymlinkSync = isTypeSync.bind(null, 'lstatSync', 'isSymbolicLink');
+export const isFile = isType.bind(null, 'stat', 'isFile');
+export const isDirectory = isType.bind(null, 'stat', 'isDirectory');
+export const isSymlink = isType.bind(null, 'lstat', 'isSymbolicLink');
+export const isFileSync = isTypeSync.bind(null, 'statSync', 'isFile');
+export const isDirectorySync = isTypeSync.bind(null, 'statSync', 'isDirectory');
+export const isSymlinkSync = isTypeSync.bind(null, 'lstatSync', 'isSymbolicLink');
diff --git a/index.test-d.ts b/index.test-d.ts
index 8f2ce9c..e433f44 100644
--- a/index.test-d.ts
+++ b/index.test-d.ts
@@ -1,4 +1,4 @@
-import {expectType} from 'tsd-check';
+import {expectType} from 'tsd';
 import {
 	isFile,
 	isDirectory,
@@ -6,7 +6,7 @@ import {
 	isFileSync,
 	isDirectorySync,
 	isSymlinkSync
-} from '.';
+} from './index.js';
 
 expectType<Promise<boolean>>(isFile('package.json'));
 expectType<Promise<boolean>>(isDirectory('package.json'));
diff --git a/license b/license
index e7af2f7..fa7ceba 100644
--- a/license
+++ b/license
@@ -1,6 +1,6 @@
 MIT License
 
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
 
 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
 
diff --git a/package.json b/package.json
index 635b711..15b59fd 100644
--- a/package.json
+++ b/package.json
@@ -1,19 +1,22 @@
 {
 	"name": "path-type",
-	"version": "4.0.0",
+	"version": "5.0.0",
 	"description": "Check if a path is a file, directory, or symlink",
 	"license": "MIT",
 	"repository": "sindresorhus/path-type",
+	"funding": "https://github.com/sponsors/sindresorhus",
 	"author": {
 		"name": "Sindre Sorhus",
 		"email": "sindresorhus@gmail.com",
-		"url": "sindresorhus.com"
+		"url": "https://sindresorhus.com"
 	},
+	"type": "module",
+	"exports": "./index.js",
 	"engines": {
-		"node": ">=8"
+		"node": ">=12"
 	},
 	"scripts": {
-		"test": "xo && nyc ava && tsd-check"
+		"test": "xo && nyc ava && tsd"
 	},
 	"files": [
 		"index.js",
@@ -26,7 +29,6 @@
 		"is",
 		"check",
 		"directory",
-		"dir",
 		"file",
 		"filepath",
 		"symlink",
@@ -37,9 +39,9 @@
 		"filesystem"
 	],
 	"devDependencies": {
-		"ava": "^1.3.1",
-		"nyc": "^13.3.0",
-		"tsd-check": "^0.3.0",
-		"xo": "^0.24.0"
+		"ava": "^3.15.0",
+		"nyc": "^15.1.0",
+		"tsd": "^0.14.0",
+		"xo": "^0.37.1"
 	}
 }
diff --git a/readme.md b/readme.md
index 4c972fa..85c5129 100644
--- a/readme.md
+++ b/readme.md
@@ -1,27 +1,22 @@
-# path-type [![Build Status](https://travis-ci.org/sindresorhus/path-type.svg?branch=master)](https://travis-ci.org/sindresorhus/path-type)
+# path-type
 
 > Check if a path is a file, directory, or symlink
 
-
 ## Install
 
 ```
 $ npm install path-type
 ```
 
-
 ## Usage
 
 ```js
-const {isFile} = require('path-type');
+import {isFile} from 'path-type';
 
-(async () => {
-	console.log(await isFile('package.json'));
-	//=> true
-})();
+console.log(await isFile('package.json'));
+//=> true
 ```
 
-
 ## API
 
 ### isFile(path)
@@ -66,7 +61,14 @@ Synchronously check whether the passed `path` is a symlink.
 
 Returns a `boolean`.
 
-
-## License
-
-MIT © [Sindre Sorhus](https://sindresorhus.com)
+---
+
+<div align="center">
+	<b>
+		<a href="https://tidelift.com/subscription/pkg/npm-path-type?utm_source=npm-path-type&utm_medium=referral&utm_campaign=readme">Get professional support for this package with a Tidelift subscription</a>
+	</b>
+	<br>
+	<sub>
+		Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.
+	</sub>
+</div>
diff --git a/test/eacces.js b/test/eacces.js
index f560e74..fd2520f 100644
--- a/test/eacces.js
+++ b/test/eacces.js
@@ -1,30 +1,40 @@
-import fs from 'fs';
+import fs, {promises as fsPromises} from 'fs';
 import test from 'ava';
-import pathType from '..';
+import {isFile, isFileSync} from '../index.js';
 
-function fakeError(fp) {
-	const error = new Error(`EACCES: permission denied, stat '${fp}'`);
+function fakeError(filePath) {
+	const error = new Error(`EACCES: permission denied, stat '${filePath}'`);
 	error.code = 'EACCES';
 	return error;
 }
 
+Object.defineProperties(fsPromises, {
+	stat: {
+		value(filePath, callback) {
+			callback(fakeError(filePath));
+		}
+	}
+});
+
 Object.defineProperties(fs, {
 	stat: {
-		value(fp, cb) {
-			cb(fakeError(fp));
+		value(filePath, callback) {
+			callback(fakeError(filePath));
 		}
 	},
 	statSync: {
-		value(fp) {
-			throw fakeError(fp);
+		value(filePath) {
+			throw fakeError(filePath);
 		}
 	}
 });
 
 test('throws on EACCES error - async', async t => {
-	await t.throwsAsync(pathType.isFile('/root/private'));
+	await t.throwsAsync(isFile('/root/private'));
 });
 
 test('throws on EACCES error - sync', t => {
-	t.throws(() => pathType.isFileSync('/root/private'));
+	t.throws(() => {
+		isFileSync('/root/private');
+	});
 });
diff --git a/test/nominal.js b/test/nominal.js
index d47b057..def0e73 100644
--- a/test/nominal.js
+++ b/test/nominal.js
@@ -1,49 +1,49 @@
 import test from 'ava';
-import pathType from '..';
+import {isDirectory, isDirectorySync, isFile, isFileSync, isSymlink, isSymlinkSync} from '../index.js';
 
 test('.file()', async t => {
-	t.true(await pathType.isFile('package.json'));
-	await t.throwsAsync(pathType.isFile(false));
+	t.true(await isFile('package.json'));
+	await t.throwsAsync(isFile(false));
 });
 
 test('.dir()', async t => {
-	t.true(await pathType.isDirectory('.'));
-	await t.throwsAsync(pathType.isDirectory(false));
+	t.true(await isDirectory('.'));
+	await t.throwsAsync(isDirectory(false));
 });
 
 if (process.platform !== 'win32') {
 	test('.symlink()', async t => {
-		t.true(await pathType.isSymlink('symlink'));
-		await t.throwsAsync(pathType.isSymlink(false));
+		t.true(await isSymlink('symlink'));
+		await t.throwsAsync(isSymlink(false));
 	});
 }
 
 test('.fileSync()', t => {
-	t.true(pathType.isFileSync('package.json'));
+	t.true(isFileSync('package.json'));
 });
 
 test('.dirSync()', t => {
-	t.true(pathType.isDirectorySync('.'));
+	t.true(isDirectorySync('.'));
 });
 
 if (process.platform !== 'win32') {
 	test('.symlinkSync()', t => {
-		t.true(pathType.isSymlinkSync('symlink'));
+		t.true(isSymlinkSync('symlink'));
 	});
 }
 
 test('return false if path doesn\'t exist - async', async t => {
-	t.false(await pathType.isFile('unicorn'));
+	t.false(await isFile('unicorn'));
 });
 
 test('return false if path doesn\'t exist - sync', t => {
-	t.false(pathType.isFileSync('unicorn'));
+	t.false(isFileSync('unicorn'));
 });
 
 test('throws invalid argument - async', async t => {
-	await t.throwsAsync(pathType.isFile(false));
+	await t.throwsAsync(isFile(false));
 });
 
 test('throws on invalid argument - sync', t => {
-	t.throws(() => pathType.isFileSync(false));
+	t.throws(() => isFileSync(false));
 });