Dispersion and self-interaction correction: improving the accuracy of semilocal density functional approximations