diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 51f2e99043..aefc10325e 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -17,8 +17,8 @@ jobs:
     runs-on: ubuntu-20.04
     strategy:
       matrix:
-        elixir: [1.17]
-        otp: [27.0]
+        elixir: [1.18.1]
+        otp: [27.2]
 
     steps:
       - name: Checkout code
@@ -76,8 +76,6 @@ jobs:
     strategy:
       matrix:
         include:
-          - elixir: '1.13.0'
-            otp: '24.1'
           - elixir: '1.14.0'
             otp: '25.0'
           - elixir: '1.15.0'
@@ -86,6 +84,8 @@ jobs:
             otp: '26.2'
           - elixir: '1.17.0'
             otp: '27.0'
+          - elixir: '1.18.1'
+            otp: '27.2'
 
     steps:
       - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
diff --git a/README.md b/README.md
index 958c2d7b66..4ca00df874 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
 
 ## Setup
 
-The exercises currently target Elixir versions from 1.13 to 1.17 and Erlang/OTP versions from 24 to 27. Detailed installation instructions can be found at
+The exercises currently target Elixir versions from 1.14 to 1.18 and Erlang/OTP versions from 25 to 27. Detailed installation instructions can be found at
 [https://elixir-lang.org/install.html](https://elixir-lang.org/install.html). We recommend using the [asdf version manager](https://github.com/asdf-vm/asdf) to manage multiple Elixir versions.
 
 ## Testing
diff --git a/concepts/cond/about.md b/concepts/cond/about.md
index 68fb30e32a..09b9acc2c6 100644
--- a/concepts/cond/about.md
+++ b/concepts/cond/about.md
@@ -16,4 +16,4 @@ The `cond` conditional is usually used when there are more than two logical bran
 
 [cond]: https://hexdocs.pm/elixir/case-cond-and-if.html#cond
 [case]: https://hexdocs.pm/elixir/case-cond-and-if.html#case
-[if]: https://hexdocs.pm/elixir/case-cond-and-if.html#if-unless
+[if]: https://hexdocs.pm/elixir/case-cond-and-if.html#if
diff --git a/concepts/if/about.md b/concepts/if/about.md
index aa8aae4a99..0cfd50e2ff 100644
--- a/concepts/if/about.md
+++ b/concepts/if/about.md
@@ -66,7 +66,7 @@ truthy?.(nil)
 # => true
 ```
 
-[getting-started-if]: https://hexdocs.pm/elixir/case-cond-and-if.html#if-unless
+[getting-started-if]: https://hexdocs.pm/elixir/case-cond-and-if.html#if
 [kernel-if]: https://hexdocs.pm/elixir/Kernel.html#if/2
 [kernel-boolean-and]: https://hexdocs.pm/elixir/Kernel.html#and/2
 [kernel-boolean-or]: https://hexdocs.pm/elixir/Kernel.html#or/2
diff --git a/concepts/if/introduction.md b/concepts/if/introduction.md
index b40fc84531..9e10803920 100644
--- a/concepts/if/introduction.md
+++ b/concepts/if/introduction.md
@@ -28,5 +28,5 @@ This syntax is helpful for very short expressions, but should be avoided if the
 
 In Elixir, all datatypes evaluate to a _truthy_ or _falsy_ value when they are encountered in a boolean context (like an `if` expression). All data is considered _truthy_ **except** for `false` and `nil`. In particular, empty strings, the integer `0`, and empty lists are all considered _truthy_ in Elixir.
 
-[getting-started-if]: https://hexdocs.pm/elixir/case-cond-and-if.html#if-unless
+[getting-started-if]: https://hexdocs.pm/elixir/case-cond-and-if.html#if
 [kernel-if]: https://hexdocs.pm/elixir/Kernel.html#if/2
diff --git a/concepts/if/links.json b/concepts/if/links.json
index 08d0f5306d..4d214c2d94 100644
--- a/concepts/if/links.json
+++ b/concepts/if/links.json
@@ -1,6 +1,6 @@
 [
   {
-    "url": "https://hexdocs.pm/elixir/case-cond-and-if.html#if-unless",
+    "url": "https://hexdocs.pm/elixir/case-cond-and-if.html#if",
     "description": "Getting Started: `if`"
   },
   {
diff --git a/exercises/concept/file-sniffer/.docs/hints.md b/exercises/concept/file-sniffer/.docs/hints.md
index 897bf918a0..5984aa03a5 100644
--- a/exercises/concept/file-sniffer/.docs/hints.md
+++ b/exercises/concept/file-sniffer/.docs/hints.md
@@ -21,7 +21,7 @@
   - You can use the [`if` macro conditional][if] for binary conditions.
 
 [binary-matching]: https://hexdocs.pm/elixir/binaries-strings-and-charlists.html#binaries
-[if]: https://hexdocs.pm/elixir/case-cond-and-if.html#if-unless
+[if]: https://hexdocs.pm/elixir/case-cond-and-if.html#if
 [mfc]: https://hexdocs.pm/elixir/modules-and-functions.html#function-definition
 [mimetype]: https://en.wikipedia.org/wiki/Media_type
 [pattern-matching]: https://hexdocs.pm/elixir/pattern-matching.html#pattern-matching
diff --git a/exercises/concept/name-badge/.docs/hints.md b/exercises/concept/name-badge/.docs/hints.md
index f20a4b6722..2c9ba1455c 100644
--- a/exercises/concept/name-badge/.docs/hints.md
+++ b/exercises/concept/name-badge/.docs/hints.md
@@ -21,5 +21,5 @@
 
 [kernel-if]: https://hexdocs.pm/elixir/Kernel.html#if/2
 [getting-started-basic-strings]: https://hexdocs.pm/elixir/basic-types.html#strings
-[getting-started-if]: https://hexdocs.pm/elixir/case-cond-and-if.html#if-unless
+[getting-started-if]: https://hexdocs.pm/elixir/case-cond-and-if.html#if
 [elixirschool-if]: https://elixirschool.com/en/lessons/basics/control-structures/#if-and-unless-0
diff --git a/exercises/concept/name-badge/.docs/introduction.md b/exercises/concept/name-badge/.docs/introduction.md
index adbabec9af..ffdb380821 100644
--- a/exercises/concept/name-badge/.docs/introduction.md
+++ b/exercises/concept/name-badge/.docs/introduction.md
@@ -42,5 +42,5 @@ This syntax is helpful for very short expressions, but should be avoided if the
 In Elixir, all datatypes evaluate to a _truthy_ or _falsy_ value when they are encountered in a boolean context (like an `if` expression). All data is considered _truthy_ **except** for `false` and `nil`. In particular, empty strings, the integer `0`, and empty lists are all considered _truthy_ in Elixir.
 
 [nil-dictionary]: https://www.merriam-webster.com/dictionary/nil
-[getting-started-if]: https://hexdocs.pm/elixir/case-cond-and-if.html#if-unless
+[getting-started-if]: https://hexdocs.pm/elixir/case-cond-and-if.html#if
 [kernel-if]: https://hexdocs.pm/elixir/Kernel.html#if/2
diff --git a/exercises/practice/crypto-square/.meta/example.ex b/exercises/practice/crypto-square/.meta/example.ex
index 01d9388d04..53f2604494 100644
--- a/exercises/practice/crypto-square/.meta/example.ex
+++ b/exercises/practice/crypto-square/.meta/example.ex
@@ -19,7 +19,7 @@ defmodule CryptoSquare do
     normalized
     |> String.graphemes()
     |> Enum.chunk_every(section_length, section_length, List.duplicate(" ", section_length))
-    |> List.zip()
+    |> Enum.zip()
     |> Enum.map(&Tuple.to_list/1)
     |> Enum.join(" ")
   end
diff --git a/exercises/practice/matrix/.meta/example.ex b/exercises/practice/matrix/.meta/example.ex
index f307e9050c..76c5de059e 100644
--- a/exercises/practice/matrix/.meta/example.ex
+++ b/exercises/practice/matrix/.meta/example.ex
@@ -14,7 +14,7 @@ defmodule Matrix do
 
     %Matrix{
       matrix: rows,
-      transposed_matrix: rows |> List.zip() |> Enum.map(&Tuple.to_list/1)
+      transposed_matrix: rows |> Enum.zip() |> Enum.map(&Tuple.to_list/1)
     }
   end
 
diff --git a/exercises/practice/saddle-points/.meta/example.ex b/exercises/practice/saddle-points/.meta/example.ex
index f6afcb2927..f07e52bcea 100644
--- a/exercises/practice/saddle-points/.meta/example.ex
+++ b/exercises/practice/saddle-points/.meta/example.ex
@@ -24,7 +24,7 @@ defmodule SaddlePoints do
   def columns(str) do
     str
     |> rows
-    |> List.zip()
+    |> Enum.zip()
     |> Enum.map(&Tuple.to_list/1)
   end
 
diff --git a/exercises/practice/spiral-matrix/.meta/example.ex b/exercises/practice/spiral-matrix/.meta/example.ex
index 95a35b154c..7ece1db17a 100644
--- a/exercises/practice/spiral-matrix/.meta/example.ex
+++ b/exercises/practice/spiral-matrix/.meta/example.ex
@@ -27,6 +27,6 @@ defmodule Spiral do
   end
 
   defp transpose(matrix) do
-    matrix |> List.zip() |> Enum.map(&Tuple.to_list/1)
+    matrix |> Enum.zip() |> Enum.map(&Tuple.to_list/1)
   end
 end
diff --git a/exercises/practice/transpose/.meta/example.ex b/exercises/practice/transpose/.meta/example.ex
index ce42023405..56653c1b58 100644
--- a/exercises/practice/transpose/.meta/example.ex
+++ b/exercises/practice/transpose/.meta/example.ex
@@ -26,7 +26,7 @@ defmodule Transpose do
     rows
     |> Enum.map(fn x -> get_padded_row(x, max_length) end)
     |> Enum.map(&String.to_charlist/1)
-    |> List.zip()
+    |> Enum.zip()
     |> Enum.map(&Tuple.to_list/1)
     |> Enum.map(&List.to_string/1)
     |> Enum.map(fn x -> x |> String.trim_trailing("*") |> String.replace("*", " ") end)