Code review comment: Sorry, I didn't realize that 0.3 and 1.0 weren't backward compatible.  Just say so next time.  My bad.

Code under review:
public T data() {
        if (data != null) {
            return data;
        }
        if (dataContentType() != null && dataContentType().startsWith("application/json") && !byte[].class.equals(dataType)) {
            try {
                data = reader.readValue(event.get("data"));
                return data;
            } catch (IOException e) {
                throw new UncheckedIOException(e);
            }
        } else if (byte[].class.equals(dataType)) {
            try {
                if (specVersion() != null && specVersion().charAt(0) == '0') {
                    boolean isBase64 = false;
                    if (event.has("datacontentencoding")) {
                        String dce = event.get("datacontentencoding").asText();
                        if ("base64".equals(dce)) {
                            isBase64 = true;
                        } else {
                            throw new RuntimeException("Cannot deserialize data for data-content-encoding: '" + dce + "'.");
                        }
                    }
                    if (isBase64) {
                        if (event.has("data")) {
                            String txt = event.get("data").asText();
                            data = (T) Base64.getDecoder().decode(txt);
                            return data;
                        } else {
                            return null;
                        }
                    } else {
                        if (event.has("data")) {
                            data = (T) mapper.writeValueAsBytes(event.get("data"));
                            return data;
                        } else {
                            return null;
                        }
                    }
                } else {
                    if (event.has("data")) {
                        data = (T) mapper.writeValueAsBytes(event.get("data"));
                        return data;
                    } else if (event.has("data_base64")) {
                        String txt = event.get("data_base64").asText();
                        data = (T) Base64.getDecoder().decode(txt);
                        return data;
                    } else {
                        return null;
                    }
                }

            } catch (JsonProcessingException e) {
                throw new RuntimeException(e);
            }
        } else {
            String msg = String.format("Don't know how to get event data (dataContentType: '%s', javaType: '%s').",
                    dataContentType(), dataType.getTypeName());
            throw new RuntimeException(msg);
        }
    }

Line commented on: if (specVersion() != null && specVersion().charAt(0) == '0') {

Revised code:
public T data() {
        if (data != null) {
            return data;
        }
        if (dataContentType() != null && dataContentType().startsWith("application/json") && !byte[].class.equals(dataType)) {
            try {
                data = reader.readValue(event.get("data"));
                return data;
            } catch (IOException e) {
                throw new UncheckedIOException(e);
            }
        } else if (byte[].class.equals(dataType)) {
            try {
                if (majorSpecVersion() == 0) {
                    boolean isBase64 = false;
                    if (event.has("datacontentencoding")) {
                        String dce = event.get("datacontentencoding").asText();
                        if ("base64".equals(dce)) {
                            isBase64 = true;
                        } else {
                            throw new RuntimeException("Cannot deserialize data for data-content-encoding: '" + dce + "'.");
                        }
                    }
                    if (isBase64) {
                        if (event.has("data")) {
                            String txt = event.get("data").asText();
                            data = (T) Base64.getDecoder().decode(txt);
                            return data;
                        } else {
                            return null;
                        }
                    } else {
                        if (event.has("data")) {
                            data = (T) mapper.writeValueAsBytes(event.get("data"));
                            return data;
                        } else {
                            return null;
                        }
                    }
                } else {
                    if (event.has("data")) {
                        data = (T) mapper.writeValueAsBytes(event.get("data"));
                        return data;
                    } else if (event.has("data_base64")) {
                        String txt = event.get("data_base64").asText();
                        data = (T) Base64.getDecoder().decode(txt);
                        return data;
                    } else {
                        return null;
                    }
                }

            } catch (JsonProcessingException e) {
                throw new RuntimeException(e);
            }
        } else {
            String msg = String.format("Don't know how to get event data (dataContentType: '%s', javaType: '%s').",
                    dataContentType(), dataType.getTypeName());
            throw new RuntimeException(msg);
        }
    }