1. Jump discontinuities are at most countable
Let $J=\{x\in(a,b): f(x+0), f(x-0)\text{ both exist but are not equal }\}$, and
$$J_+=\{x\in J:f(x-0)<f(x+0)\}, J_-=\{x\in J: f(x-0)>f(x+0)\}$$
So we have a decomposition $J=J_+\cup J_-$. We now prove that $J_+$ is at most countable.
For any $x\in J_+$, by the density of rationals, we can choose $r_x\in (f(x-0),f(x+0))\cap\mathbb{Q}$.
On the one hand, $f(x-0)<r_x$ we know $\exists \delta_-\in(0,x-a)$ such that $\forall z\in (x-\delta_-,x)$ we have $f(z)<r_x$. Also by the density of rationals, we can choose $s_x\in (x-\delta_-,x)\cap\mathbb{Q}$. As a result, $\forall z\in(s_x,x)$ we have $f(z)<r_x$.
On the other hand, $f(x+0)>r_x$ we know $\exists \delta_+\in(0,b-x)$ such that $\forall z\in (x, x+\delta_+)$ we have $f(z)>r_x$. Also by the density of rationals, we can choose $t_x\in (x, x+\delta_+)\cap\mathbb{Q}$.As a result $\forall z\in(x,t_x)$ we have $f(z)>r_x$.
Thus, $\forall x\in J_+$ there corresponds a triplet $(r_x,s_x,t_x)$. By Axiom of Choice, we can define a function:
\begin{align*}
j_+:J_+ &\to \mathbb{Q}^3\\
x &\mapsto (r_x,s_x,t_x)
\end{align*}
We show that it's an injection: Suppose $\exists x\neq y \in J_+$ such that $j_+(x)=j_+(y)$, i.e. $r_x=r_y=r,s_x=s_y=s,t_x=t_y=t$. Without loss of generality assuming $x<y$, note that we can find $z\in (a,b)$ satisfying $s<x<z<y<t$. From $x<z<t$ follows $f(z)>r$ and from $s<z<y$ follows $f(z)<r$, which is a contradiction.
Now we have an injection from $J_+$ to $\mathbb{Q}^3$ and by the countability of the latter, we conclude that $J_+$ is at most countable. The same argument goes for $J_-$ and proves $J_-$ and hence $J=J_+\cup J_-$ are at most countable.
2. Removable disconitnuities are at most countable
Let $R=\{x\in(a,b): f(x+0),f(x-0)\text{ exist and equal but differs from }f(x)\}$. Decompose this set into two: $R=R_+\cup R_-$, where
$$R_+=\{x\in R: f(x+0)=f(x-0)>f(x)\},R_-=\{x\in R: f(x+0)=f(x-0)<f(x)\}$$
Now we show that $R_+$ is at most countable.
For any $x\in R_+$, let $A_x=\lim\limits_{t\to x}f(t)>f(x)$. By the density of rationals we can choose $r_x\in (f(x),A_x)\cap \mathbb{Q}$. We know $\exists \delta\in (0,\min\{x-a,b-x\})$ such that $\forall z\in (x-\delta,x+\delta)\backslash\{x\}$ we have $f(z)>r_x$. Also by the density of rationals we can choose $s_x\in (x-\delta,x)\cap \mathbb{Q}, t_x\in (x,x+\delta)\cap \mathbb{Q}$. As a result, $\forall z\in (s_x,t_x)\backslash \{x\}$ we have $f(z)>r_x$.
By Axiom of Choice, we can define a function:
\begin{align*}
r_+:R_+&\to \mathbb{Q}^3\\
x&\mapsto (r_x,s_x,t_x)
\end{align*}
Suppose that $r_+$ is not an injection. Then we can find $x<y\in R_+$ such that $r_+(x)=r_+(y)$, i.e. $r_x=r_y=r,s_x=s_y=s,t_x=t_y=t$. From $x\in (s,t)\backslash \{y\}$ follows $f(x)>r$ which contradicts $r=r_x\in(f(x),A_x)$. Now we have an injection from $R_+$ into $\mathbb{Q}^3$ and by the countability of the latter we know that $R_+$ is at most countable. By a similar argument, we can define an injection $r_-:R_-\to \mathbb{Q}^3$ and knows that $R_-$ is also at most countable. We conclude that $R=R_+\cup R_-$ is at most countable.
3. Simple dicontinuities are at most countable.
This follows from 1 and 2 since simple discontinuities are either jumping or removable.