This may be the case for other types as well, but at least FieldCodec introduced binary-incompatible changes in 3.9.0, in this commit.
Each FieldCodec static factory method gained a default parameter:
public static FieldCodec<string> ForString(uint tag)
became
public static FieldCodec<string> ForString(uint tag, string defaultValue = "")
This is a binary breaking change. Code compiled against an earlier version of Google.Protobuf fails at execution time when using the new version, as it can't find the method. We should have added overloads instead of default parameters here.