diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 9f2a2fae..fd254701 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -47,7 +47,7 @@ jobs:
       - name: Setup Java (temurin@11)
         id: setup-java-temurin-11
         if: matrix.java == 'temurin@11'
-        uses: actions/setup-java@v3
+        uses: actions/setup-java@v4
         with:
           distribution: temurin
           java-version: 11
@@ -60,7 +60,7 @@ jobs:
       - name: Setup Java (temurin@17)
         id: setup-java-temurin-17
         if: matrix.java == 'temurin@17'
-        uses: actions/setup-java@v3
+        uses: actions/setup-java@v4
         with:
           distribution: temurin
           java-version: 17
@@ -106,7 +106,7 @@ jobs:
 
       - name: Upload target directories
         if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main')
-        uses: actions/upload-artifact@v3
+        uses: actions/upload-artifact@v4
         with:
           name: target-${{ matrix.os }}-${{ matrix.java }}-${{ matrix.scala }}-${{ matrix.project }}
           path: targets.tar
@@ -129,7 +129,7 @@ jobs:
       - name: Setup Java (temurin@11)
         id: setup-java-temurin-11
         if: matrix.java == 'temurin@11'
-        uses: actions/setup-java@v3
+        uses: actions/setup-java@v4
         with:
           distribution: temurin
           java-version: 11
@@ -142,7 +142,7 @@ jobs:
       - name: Setup Java (temurin@17)
         id: setup-java-temurin-17
         if: matrix.java == 'temurin@17'
-        uses: actions/setup-java@v3
+        uses: actions/setup-java@v4
         with:
           distribution: temurin
           java-version: 17
@@ -153,7 +153,7 @@ jobs:
         run: sbt +update
 
       - name: Download target directories (2.13, rootJS)
-        uses: actions/download-artifact@v3
+        uses: actions/download-artifact@v4
         with:
           name: target-${{ matrix.os }}-${{ matrix.java }}-2.13-rootJS
 
@@ -163,7 +163,7 @@ jobs:
           rm targets.tar
 
       - name: Download target directories (2.13, rootJVM)
-        uses: actions/download-artifact@v3
+        uses: actions/download-artifact@v4
         with:
           name: target-${{ matrix.os }}-${{ matrix.java }}-2.13-rootJVM
 
@@ -173,7 +173,7 @@ jobs:
           rm targets.tar
 
       - name: Download target directories (3, rootJS)
-        uses: actions/download-artifact@v3
+        uses: actions/download-artifact@v4
         with:
           name: target-${{ matrix.os }}-${{ matrix.java }}-3-rootJS
 
@@ -183,7 +183,7 @@ jobs:
           rm targets.tar
 
       - name: Download target directories (3, rootJVM)
-        uses: actions/download-artifact@v3
+        uses: actions/download-artifact@v4
         with:
           name: target-${{ matrix.os }}-${{ matrix.java }}-3-rootJVM
 
@@ -197,7 +197,7 @@ jobs:
         env:
           PGP_SECRET: ${{ secrets.PGP_SECRET }}
           PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }}
-        run: echo $PGP_SECRET | base64 -di | gpg --import
+        run: echo $PGP_SECRET | base64 -d -i - | gpg --import
 
       - name: Import signing key and strip passphrase
         if: env.PGP_SECRET != '' && env.PGP_PASSPHRASE != ''
@@ -205,7 +205,7 @@ jobs:
           PGP_SECRET: ${{ secrets.PGP_SECRET }}
           PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }}
         run: |
-          echo "$PGP_SECRET" | base64 -di > /tmp/signing-key.gpg
+          echo "$PGP_SECRET" | base64 -d -i - > /tmp/signing-key.gpg
           echo "$PGP_PASSPHRASE" | gpg --pinentry-mode loopback --passphrase-fd 0 --import /tmp/signing-key.gpg
           (echo "$PGP_PASSPHRASE"; echo; echo) | gpg --command-fd 0 --pinentry-mode loopback --change-passphrase $(gpg --list-secret-keys --with-colons 2> /dev/null | grep '^sec:' | cut --delimiter ':' --fields 5 | tail -n 1)
 
@@ -233,7 +233,7 @@ jobs:
       - name: Setup Java (temurin@11)
         id: setup-java-temurin-11
         if: matrix.java == 'temurin@11'
-        uses: actions/setup-java@v3
+        uses: actions/setup-java@v4
         with:
           distribution: temurin
           java-version: 11
@@ -246,7 +246,7 @@ jobs:
       - name: Setup Java (temurin@17)
         id: setup-java-temurin-17
         if: matrix.java == 'temurin@17'
-        uses: actions/setup-java@v3
+        uses: actions/setup-java@v4
         with:
           distribution: temurin
           java-version: 17
diff --git a/optics/src/main/scala/io/circe/optics/JsonNumberOptics.scala b/optics/src/main/scala/io/circe/optics/JsonNumberOptics.scala
index 78fca841..ae51ae8b 100644
--- a/optics/src/main/scala/io/circe/optics/JsonNumberOptics.scala
+++ b/optics/src/main/scala/io/circe/optics/JsonNumberOptics.scala
@@ -1,5 +1,5 @@
 /*
- * Copyright 2023 circe
+ * Copyright 2024 circe
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/optics/src/main/scala/io/circe/optics/JsonObjectOptics.scala b/optics/src/main/scala/io/circe/optics/JsonObjectOptics.scala
index 2a296dd9..b2e27be7 100644
--- a/optics/src/main/scala/io/circe/optics/JsonObjectOptics.scala
+++ b/optics/src/main/scala/io/circe/optics/JsonObjectOptics.scala
@@ -1,5 +1,5 @@
 /*
- * Copyright 2023 circe
+ * Copyright 2024 circe
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/optics/src/main/scala/io/circe/optics/JsonOptics.scala b/optics/src/main/scala/io/circe/optics/JsonOptics.scala
index d15f255a..3e5550f6 100644
--- a/optics/src/main/scala/io/circe/optics/JsonOptics.scala
+++ b/optics/src/main/scala/io/circe/optics/JsonOptics.scala
@@ -1,5 +1,5 @@
 /*
- * Copyright 2023 circe
+ * Copyright 2024 circe
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/optics/src/main/scala/io/circe/optics/JsonPath.scala b/optics/src/main/scala/io/circe/optics/JsonPath.scala
index f301b1c8..88e21596 100644
--- a/optics/src/main/scala/io/circe/optics/JsonPath.scala
+++ b/optics/src/main/scala/io/circe/optics/JsonPath.scala
@@ -1,5 +1,5 @@
 /*
- * Copyright 2023 circe
+ * Copyright 2024 circe
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/optics/src/main/scala/io/circe/optics/package.scala b/optics/src/main/scala/io/circe/optics/package.scala
index edbd3df9..16450d49 100644
--- a/optics/src/main/scala/io/circe/optics/package.scala
+++ b/optics/src/main/scala/io/circe/optics/package.scala
@@ -1,5 +1,5 @@
 /*
- * Copyright 2023 circe
+ * Copyright 2024 circe
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/optics/src/test/scala/io/circe/optics/CirceSuite.scala b/optics/src/test/scala/io/circe/optics/CirceSuite.scala
index 2027db87..cde869ab 100644
--- a/optics/src/test/scala/io/circe/optics/CirceSuite.scala
+++ b/optics/src/test/scala/io/circe/optics/CirceSuite.scala
@@ -1,5 +1,5 @@
 /*
- * Copyright 2023 circe
+ * Copyright 2024 circe
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/optics/src/test/scala/io/circe/optics/DeriveWithIsoSuite.scala b/optics/src/test/scala/io/circe/optics/DeriveWithIsoSuite.scala
index 9c7dda4c..366fcbfd 100644
--- a/optics/src/test/scala/io/circe/optics/DeriveWithIsoSuite.scala
+++ b/optics/src/test/scala/io/circe/optics/DeriveWithIsoSuite.scala
@@ -1,5 +1,5 @@
 /*
- * Copyright 2023 circe
+ * Copyright 2024 circe
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/optics/src/test/scala/io/circe/optics/JsonPathSuite.scala b/optics/src/test/scala/io/circe/optics/JsonPathSuite.scala
index 2865e9f8..b304cce6 100644
--- a/optics/src/test/scala/io/circe/optics/JsonPathSuite.scala
+++ b/optics/src/test/scala/io/circe/optics/JsonPathSuite.scala
@@ -1,5 +1,5 @@
 /*
- * Copyright 2023 circe
+ * Copyright 2024 circe
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/optics/src/test/scala/io/circe/optics/LawsTests.scala b/optics/src/test/scala/io/circe/optics/LawsTests.scala
index 5a6bf173..3eb558e4 100644
--- a/optics/src/test/scala/io/circe/optics/LawsTests.scala
+++ b/optics/src/test/scala/io/circe/optics/LawsTests.scala
@@ -1,5 +1,5 @@
 /*
- * Copyright 2023 circe
+ * Copyright 2024 circe
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/optics/src/test/scala/io/circe/optics/OpticsSuite.scala b/optics/src/test/scala/io/circe/optics/OpticsSuite.scala
index d6e1d3d6..3bb319fc 100644
--- a/optics/src/test/scala/io/circe/optics/OpticsSuite.scala
+++ b/optics/src/test/scala/io/circe/optics/OpticsSuite.scala
@@ -1,5 +1,5 @@
 /*
- * Copyright 2023 circe
+ * Copyright 2024 circe
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/project/plugins.sbt b/project/plugins.sbt
index da4cb580..364543fc 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -1,2 +1,2 @@
-addSbtPlugin("io.circe" % "sbt-circe-org" % "0.2.1")
+addSbtPlugin("io.circe" % "sbt-circe-org" % "0.3.1")
 addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.14.0")